我的问题非常简单,但我无法找到解决问题的方法。我有很多JSF XHTML页面(使用了IceFaces库,但我认为这不会改变任何东西),其中一些包括带有ui:include
指令的其他页面。这当然是递归的,当一个bug可以在应用程序上重现时,找到哪个XHTML并不总是很容易。
我想要做的是:打印在网页渲染过程中使用的所有XHTML页面的名称。我能找到的唯一方法是在每个XHTML文件中添加一个显示。例如,displayCustomer.xhtml
会将此作为第一行:
<outputText rendered="#{myBean.debugXHTML}" value="displayCustomer.xhtml" />
这可行,但假设我应该在我的所有文件中添加类似的指令。如果可能的话,我想在没有改变我的XHTML文件的情况下使用它。如果这是不可能的,我想让它的输出文本与我的所有文件完全相同(因此一个小的shell脚本可以在ui:composition
指令之后添加此行。)
我在JBoss 7.1.X上使用mojarra 2.1.X版本(不知道这是否有用)。
在此先感谢您的帮助,我无法找到任何解决方案。
答案 0 :(得分:1)
#{view.viewId}
将为您提供正在呈现的当前视图的名称。所以你会有
<h:outputText rendered="#{myBean.debugXHTML}" value="#{view.viewId}" />
view
对象是一个隐式EL对象,类似于您从辅助bean中UIViewRoot
提取的FacesContext
对象。
答案 1 :(得分:1)
我想我有一个解决方案......
在xhtml页面中添加:
<ice:outputText id="myHiddenCompo" rendered="#{DebugXHTML}" value="#{bean.getFileNameAndPath()}" />
在BackingBean中创建一个类似这样的方法:
public final String getFileNameAndPath(){
FacesContext context = FacesContext.getCurrentInstance();
UIViewRoot root = context.getViewRoot();
UIComponent c = JSFHelper.findComponent(root, "myHiddenCompo");
return c.getValueExpression("value").toString();
}
JSFHelper.java摘录:
public static UIComponent findComponent(final UIComponent c, final String id) {
if (id.equals(c.getId())) {
return c;
}
Iterator<UIComponent> kids = c.getFacetsAndChildren();
while (kids.hasNext()) {
UIComponent found = findComponent(kids.next(), id);
if (found != null) {
return found;
}
}
return null;
}
<强>结果:强>
/WEB-INF/includes/folder/verticalTabs/folderDisplay.xhtml @ 8,114 值= “#{#{bean.getFileNameAndPath()}}”
之后,您可以使用子字符串来获取所需的部分。
我发现了一个“更好”的实现,因为上面我们遇到了多个id的问题(jsf 2找到重复的id)
只需在xhtml中添加以下内容:
<ice:outputText rendered="#{DebugXHTML}" value="#{bean.getFileNameAndPath(component)} "/>
组件是jsf 2的关键字,代表当前组件。
修改支持bean代码:
public final String getFileNameAndPath(UIComponent hiddenCompo) {
String manipString = hiddenCompo.getValueExpression("value").toString();
return manipString.substring(0, manipString.indexOf(".xhtml") + 6);
}
答案 2 :(得分:0)
除了使用#{view.viewId}
之外,您还可以使用anther隐式EL对象#{request}
,它允许您访问HttpServletRequest
实例,这样您就不会获得视图ID以/index.html
形式,但浏览器中的URL,例如,
#{request.requestURL}?#{request.queryString}