2

有没有办法在所有包含和模板处理之后使用 JSF 标记查看完整的最终 JSP/xhtml 页面,包括在它被呈现为 HTML 页面之前动态生成的组件?目前我正在使用 JSF 2.1 和 Richfaces 4。

4

2 回答 2

3

可以在即将呈现视图时获取生成的 JSF 组件树。因此,可以通过使用 aPhaseListener或来获得它<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 回答