0

我的问题很简单,但我找不到解决方法。我有很多 JSF XHTML 页面(使用了 IceFaces 库,但我想这不会改变任何东西),其中一些包括带有ui:include指令的其他页面。这当然可以是递归的,当一个错误可以在应用程序上重现时,并不总是很容易找到哪个 XHTML 显示了它。

我想要做的是以下内容:打印网页呈现期间使用的所有 XHTML 页面的名称。到目前为止,我能找到的唯一方法是在我的每个 XHTML 文件中添加一个显示。例如,displayCustomer.xhtml将把它作为第一行:

<outputText rendered="#{myBean.debugXHTML}" value="displayCustomer.xhtml" />

这可行,但假设我应该在我的所有文件中添加类似的指令。如果可能的话,我希望在不对我的 XHTML 文件进行任何更改的情况下拥有它。如果这是不可能的,我希望它的输出文本与我的所有文件完全相同(所以一个小的 shell 脚本可以在ui:composition指令之后添加这一行)。

我在 JBoss 7.1.X 上使用 mojarra 2.1.X 版本(不知道这是否有帮助)。

提前感谢您的帮助,我无法找到任何解决方案。

4

3 回答 3

2

#{view.viewId}将为您提供当前正在渲染的视图的名称。所以你会有

<h:outputText rendered="#{myBean.debugXHTML}" value="#{view.viewId}" />

view对象是一个隐含的 EL 对象,类似于UIViewRoot您从FacesContext支持 bean 中提取的对象。

于 2013-04-26T13:40:16.713 回答
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 value="#{#{bean.getFileNameAndPath()}}"

之后,您可以使用 substring 来获取您需要的部分。

我找到了一个“更好”的实现,因为在上面,我们遇到了多个 id 的问题(jsf 2 找到重复的 id)

只需在 xhtml 中添加这一行:

 <ice:outputText rendered="#{DebugXHTML}" value="#{bean.getFileNameAndPath(component)} "/>

component是 jsf 2 的关键字,表示当前组件。

并修改支持 bean 代码:

  public final String getFileNameAndPath(UIComponent hiddenCompo) {
    String manipString = hiddenCompo.getValueExpression("value").toString();
    return manipString.substring(0, manipString.indexOf(".xhtml") + 6);
  }
于 2013-07-24T13:43:22.890 回答
0

除了使用 之外,您还可以使用另一个#{view.viewId}隐式 EL 对象,#{request}它使您可以访问HttpServletRequest实例,这样您就可以获取不是 form 中的视图 ID /index.html,而是浏览器中的 URL,例如,

#{request.requestURL}?#{request.queryString}
于 2013-04-26T13:55:51.807 回答