我希望我对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) )?
您需要有条件地构建<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>因为它的开销较小。
| 归档时间: |
|
| 查看次数: |
1305 次 |
| 最近记录: |