有没有办法在所有包含和模板处理之后如何使用JSF标记查看完整的最终JSP / xhtml页面,包括在呈现为HTML页面之前动态生成的组件?目前我正在使用JSF 2.1和Richfaces 4。
答案 0 :(得分:3)
可以在视图即将呈现时获取生成的JSF组件树。因此,可以使用PhaseListener
或<f:event type="preRenderView">
来获取它。
由于页面上的所有组件都是UIViewRoot
的子组件,因此可以使用其继承的UIComponentBase#getChildren()
方法遍历树。视图根组件本身可以从FacesContext
方法FacesContext#getViewRoot()
获得。
当上下文参数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生成的输出,因为这样的混乱引起了另一个答案。
答案 1 :(得分:-1)
由于JSF是服务器端框架,因此如果不在服务器中运行它,您将无法查看准备好的页面。动态内容也将仅在运行时获取值。