在 JSF 中有条件包含空值
Conditional include with empty value in JSF
我希望我对 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>
如果我是对的,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>
否则,<ui:include>
仍会出现在组件树中。
另请参阅:
- JSTL in JSF2 Facelets... makes sense?
与具体问题无关,即使您打算有条件地渲染部分视图,您最好使用 <ui:fragment>
而不是 <h:panelGroup>
因为它的开销更少。
防止使用 <c:if>
,因为它会破坏一些标准的 JSF 组件。
我们观察到它的使用导致 UI:Panel 中的子节点重复作为副作用,我们花了一段时间才将其确定为根本原因。
我希望我对 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>
如果我是对的,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>
否则,<ui:include>
仍会出现在组件树中。
另请参阅:
- JSTL in JSF2 Facelets... makes sense?
与具体问题无关,即使您打算有条件地渲染部分视图,您最好使用 <ui:fragment>
而不是 <h:panelGroup>
因为它的开销更少。
防止使用 <c:if>
,因为它会破坏一些标准的 JSF 组件。
我们观察到它的使用导致 UI:Panel 中的子节点重复作为副作用,我们花了一段时间才将其确定为根本原因。