0

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

但还是同样的问题!

4

1 回答 1

2

首先也是最重要的:JSTL 标签在视图构建时运行,而不是在视图渲染时运行

您的具体问题表明它#{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 中,其${}行为与#{}. 为避免潜在的混乱和维护麻烦,我建议始终坚持#{}

也可以看看:

于 2013-06-20T16:13:45.343 回答