JSF 页面中的 <c:choose><c:when> 不起作用,似乎总是评估为 false
Posted
技术标签:
【中文标题】JSF 页面中的 <c:choose><c:when> 不起作用,似乎总是评估为 false【英文标题】:<c:choose><c:when> in JSF page does not work, seems to always evaluate false 【发布时间】:2013-12-26 23:53:49 【问题描述】:在我的 JSF 页面中,我使用 <c:choose><c:when>
标记有条件地显示内容。但是,它不起作用,因为它似乎总是评估 false
。
例如
<h:outputText value="#pollInfo.active -" />
<c:choose>
<c:when test="#pollInfo.active">
<h:outputText value="Active" />
</c:when>
<c:otherwise>
<h:outputText value="Deactive" />
</c:otherwise>
</c:choose>
肯定有一些带有active=true
的项目,由<h:outputText>
确认,但它只为所有项目打印Deactive
。你可以在下图中看到实际的输出:
这是怎么引起的,我该如何解决?
【问题讨论】:
【参考方案1】:症状和屏幕截图表明,#pollInfo
表示迭代 UI 组件的当前迭代项,例如 <ui:repeat>
、<h:dataTable>
、<p:tabView>
、<p:dataTable>
等。
JSTL 标记在视图构建期间运行,即基于 Xhtml 源代码构建 JSF 组件树的时刻。此类迭代 UI 组件的 var
属性仅在视图渲染期间可用,即基于 JSF 组件树生成 HTML 输出的那一刻。
换句话说,它们不会“同步”运行。在视图构建期间,#pollInfo
始终为 null
。
在这种特殊情况下,您需要 JSF 组件的 rendered
属性。
<h:outputText value="Active" rendered="#pollInfo.active" />
<h:outputText value="Deactive" rendered="#not pollInfo.active" />
或者,如果您打算有条件地渲染较大的代码,请将所有代码都包装在 <ui:fragment>
中:
<ui:fragment rendered="#pollInfo.active">
<h:outputText value="Active" />
<!-- Some more components here if necessary. -->
</ui:fragment>
<ui:fragment rendered="#not pollInfo.active">
<h:outputText value="Deactive" />
<!-- Some more components here if necessary. -->
</ui:fragment>
鉴于您有一个纯 if-else,另一种选择是在 EL 中使用条件运算符:
<h:outputText value="#pollInfo.active ? 'Active' : 'Deactive'" />
额外的好处是,您最终得到的代码要少得多。
另见:
JSTL in JSF2 Facelets... makes sense?【讨论】:
以上是关于JSF 页面中的 <c:choose><c:when> 不起作用,似乎总是评估为 false的主要内容,如果未能解决你的问题,请参考以下文章
java jsp页面用<c:choose><c:when><c:others>写的逻辑没有显示,该怎么找错