1

在我的 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所有项目。您可以在下图中看到实际输出:

在此处输入图像描述

这是如何引起的,我该如何解决?

4

1 回答 1

2

症状和屏幕截图表明#{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}" />

或者,如果您打算有条件地渲染更大的代码片段,请将所有代码包装在 a 中<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'}" />

额外的好处是,你最终得到的代码要少得多。

也可以看看:

于 2013-12-09T20:50:39.790 回答