<c:选择> <c:当JSF页面中的>不起作用时,似乎总是评估错误</c:when> </c:choose>

时间:2013-12-09 18:31:28

标签: jsf jsf-2 jstl conditional-rendering

在我的JSF页面中,我使用<c:choose><c:when>标签来有条件地显示内容。但是,它似乎无法正常评估false

E.g。

<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。您可以在下图中看到实际输出:

enter image description here

这是如何引起的?如何解决?

1 个答案:

答案 0 :(得分:2)

症状和屏幕截图表明#{pollInfo}表示迭代UI组件的当前迭代项,例如<ui:repeat><h:dataTable><p:tabView>,{{1}等等。

JSTL标记在视图构建时运行,即基于XHTML源代码构建JSF组件树的那一刻。这种迭代UI组件的<p:dataTable>属性仅在视图渲染时,即基于JSF组件树生成HTML输出的那一刻可用。

换句话说,它们不会“同步”运行。在视图构建期间,var始终为#{pollInfo}

在这种特殊情况下,您需要JSF组件的null属性。

rendered

或者,如果您打算有条件地渲染更大的代码片段,请将所有内容包装在<h:outputText value="Active" rendered="#{pollInfo.active}" /> <h:outputText value="Deactive" rendered="#{not pollInfo.active}" /> 中:

<ui:fragment>

再次另一种选择,假设你有一个纯粹的if-else,在EL中使用条件运算符:

<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>

额外的奖励是,你最终会得到更少的代码。

另见: