我正在尝试这样的东西(JSF2):
<p>#{projectPageBean.availableMethods}</p>
<c:choose>
<c:when test="${projectPageBean.availableMethods == true}">
<p>Abc</p>
</c:when>
<c:otherwise>
<p>Xyz</p>
</c:otherwise>
</c:choose>
但这似乎不起作用,虽然顶部段落中的EL表达式从false变为true,但下一段始终显示Xyz?
我还尝试将测试更改为:
${projectPageBean.availableMethods}
但仍然是同样的问题!
答案 0 :(得分:2)
首先:JSTL tags runs during view build time, not during view render time。
您的具体问题表明在视图渲染时间内设置了#{projectPageBean}
,例如在定义为<ui:repeat var>
,<h:dataTable var>
,<p:tabView var>
等时会发生这种情况。因此在视图构建期间null
。
在这种情况下,您不应该使用视图构建时标记来有条件地呈现HTML。您应该使用视图呈现时间组件来有条件地呈现HTML。作为第一选择,请使用<ui:fragment>
:
<p>#{projectPageBean.availableMethods}</p>
<ui:fragment rendered="#{projectPageBean.availableMethods}">
<p>Abc</p>
</ui:fragment>
<ui:fragment rendered="#{not projectPageBean.availableMethods}">
<p>Xyz</p>
</ui:fragment>
顺便说一句,Facelets中没有必要在#{}
和${}
之间切换。与JSP相反,在Facelets中${}
的行为与#{}
完全相同。为避免潜在的混淆和维护问题,我建议始终坚持#{}
。