如何打印呈现的XHTML文件的名称

时间:2013-04-26 09:36:39

标签: jsf jsf-2 jboss jboss7.x filenames

我的问题非常简单,但我无法找到解决问题的方法。我有很多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版本(不知道这是否有用)。

在此先感谢您的帮助,我无法找到任何解决方案。

3 个答案:

答案 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}