2

HTMLページとしてレンダリングされる直前に動的に生成されたコンポーネントを含め、すべてのインクルードとテンプレート処理の後にJSFマークアップを使用して完全な最終JSP/xhtmlページを表示する方法はありますか? 現在、Richfaces 4 で JSF 2.1 を使用しています。

4

2 に答える 2

3

ビューがレンダリングされようとしている時点で、結果の JSF コンポーネント ツリーを取得することができます。したがって、PhaseListenerまたはを使用して取得することができ<f:event type="preRenderView">ます。

ページ上のすべてのコンポーネントは の子であるため、継承されたメソッドUIViewRootを使用してツリーをトラバースできます。UIComponentBase#getChildren()ビュー ルート コンポーネント自体は、FacesContextメソッドから取得できますFacesContext#getViewRoot()

これは、context パラメータjavax.faces.PROJECT_STAGEが に設定さDevelopmentれ、ビューにエラーがある場合に JSF によって内部的に行われる処理です。この場合、コンポーネント ツリーが出力されます。有効にするには、web.xml に次の行を追加します。

<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>

全体として、次のメソッド (およびヘルパー) がその役割を果たします。

public String getComponentTree() {
    StringBuilder tree = new StringBuilder();
    UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
    List<UIComponent> componentTree = viewRoot.getChildren();
    appendComponentInfo(componentTree, tree, 0);
    return tree.toString();
}

private String getComponentInfo(UIComponent comp) {
    return (comp == null) ? "" : (comp.getClass().getSimpleName() + ": " + comp.getId());
}

private void appendComponentInfo(UIComponent comp, StringBuilder sb, int level) {
    if(comp == null) {
        return;
    }
    String indentation = (level == 0) ? "" : String.format("%"+ (4 * level) + "s", " ");
    sb.append(indentation + getComponentInfo(comp) + "\n");
    List<UIComponent> children = comp.getChildren();
    int size = children.size();
    level = (size > 0) ? (level + 1) : level;
    for(UIComponent c : children) {
        appendComponentInfo(c, sb, level);
    }
    level = (size > 0) ? (level - 1) : level;
}

最後に注意しなければならないのは、JSF コンポーネント ツリーと HTML 生成出力を混同しないことです。そのような混同は、別の回答を引き起こしました。

于 2013-07-01T13:19:53.003 に答える
-1

JSF はサーバー側のフレームワークであるため、準備されたページをサーバーで実行しないと表示できません。また、動的コンテンツも実行時にのみ値を取得します。

于 2013-07-01T06:38:03.150 に答える