JSF中包含空值的条件包含

mei*_*ier 3 jsf primefaces

我希望我对JSF的理解是正确的,这一切都是有道理的。我尝试通过使用(条件)包含在页面内进行某种简单的模板化。通过选择来更新面板。

<p:outputPanel id="panel">
  <h:panelGroup rendered="#{not empty someBean.selectedObject}">
    <ui:include src="WEB-INF/pages/#{someBean.selectedObject.pageName}.xhtml" />
  </h:panelGroup>
</p:outputPanel>
Run Code Online (Sandbox Code Playgroud)

如果我是对的,那么ui:include将在某种形式的视图准备阶段处理该rendered属性,并在页面呈现之前处理该属性。结果,我得到一个FileNotFoundException,因为它试图加载WEB-INF / pages / .xhtml。这对我来说很有意义,但是如何解决此问题而又不会出现混乱的变通办法,例如创建一个空页面作为文件名(page.xhtml)的前缀,并为应该使用此字符串实际呈现的每个页面添加前缀(pageSamplePage.xhtml) )?

Bal*_*usC 5

您需要有条件地构建<ui:include>而不是有条件地渲染它。使用<c:if>代替rendered

<p:outputPanel id="panel">
  <c:if test="#{not empty someBean.selectedObject}">
    <ui:include src="WEB-INF/pages/#{someBean.selectedObject.pageName}.xhtml" />
  </c:if>
</p:outputPanel>
Run Code Online (Sandbox Code Playgroud)

否则,<ui:include>仍然会在组件树中结束。

也可以看看:


具体问题无关,即使您打算有条件地渲染视图的一部分,也最好使用<ui:fragment>而不是<h:panelGroup>因为它的开销较小。