c表达式中的EL:选择,无法使其正常工作

时间:2013-06-20 16:01:56

标签: jsf jstl el

我正在尝试这样的东西(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}

但仍然是同样的问题!

1 个答案:

答案 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中${}的行为与#{}完全相同。为避免潜在的混淆和维护问题,我建议始终坚持#{}

另见: