10

UIComponentオブジェクトがあります。実行時にこのコンポーネントによって生成された HTML コードを取得して、分析できるようにしたいと考えています。

これを達成する方法はありますか?

JsfUnit を使用して自動テストを作成しようとしています。テスト メソッド内から UICompoment オブジェクトを取得できます。しかし、コンポーネントによって生成された Html を確認する方法が見つかりませんでした。

4

2 に答える 2

11

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();
// ...
于 2013-06-08T17:11:41.193 に答える
2

通常、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();
于 2014-04-15T13:11:25.070 に答える