UIComponentオブジェクトがあります。実行時にこのコンポーネントによって生成された HTML コードを取得して、分析できるようにしたいと考えています。
これを達成する方法はありますか?
JsfUnit を使用して自動テストを作成しようとしています。テスト メソッド内から UICompoment オブジェクトを取得できます。しかし、コンポーネントによって生成された Html を確認する方法が見つかりませんでした。
UIComponentオブジェクトがあります。実行時にこのコンポーネントによって生成された HTML コードを取得して、分析できるようにしたいと考えています。
これを達成する方法はありますか?
JsfUnit を使用して自動テストを作成しようとしています。テスト メソッド内から UICompoment オブジェクトを取得できます。しかし、コンポーネントによって生成された Html を確認する方法が見つかりませんでした。
JSF が内部で行っているのと同じことを行うだけです: invoke UIComponent#encodeAll()
。出力をキャプチャするには、 によって応答ライターをローカル バッファーに設定しFacesContext#setResponseWriter()
ます。
例 (アプリケーションの呼び出しフェーズにいると仮定します。応答のレンダリング フェーズにいる場合、これは別の方法で行う必要があります):
FacesContext context = FacesContext.getCurrentInstance();
ResponseWriter originalWriter = context.getResponseWriter();
StringWriter writer = new StringWriter();
try {
context.setResponseWriter(context.getRenderKit().createResponseWriter(writer, "text/html", "UTF-8"));
component.encodeAll(context);
} finally {
if (originalWriter != null) {
context.setResponseWriter(originalWriter);
}
}
String output = writer.toString();
// ...
通常、BalusC による呼び出しによる解決策は機能しUIComponent#encodeAll()
ますが、utf-8 エンコーディングを使用している場合、Unicode 文字に問題がありました。現在のコンテキストの応答ライターを変更した後、ajax 応答のすべての非 ASCII 文字が破損しました。
FacesContext.getCurrentInstance()によって取得された現在のコンテキストで応答ライターを変更する代わりに、FacesContextWrapperを拡張して現在のコンテキストのラッパーを作成し、元のコンテキストが変更されないようにしました。
StringWriter writer = new StringWriter();
FacesContext context = new FacesContextWrapper() {
private ResponseWriter internalWriter = getWrapped()
.getRenderKit().createResponseWriter(writer, "text/html", "UTF-8");
@Override
public FacesContext getWrapped() {
return FacesContext.getCurrentInstance();
}
@Override
public ResponseWriter getResponseWriter() {
return internalWriter;
}
};
component.encodeAll(context);
String output = writer.toString();