JSTL c:如果在JSF h:dataTable中不起作用

时间:2010-08-09 17:05:37

标签: jsf datatable jstl conditional-rendering

我正在尝试使用<c:if>在状态结束时有条件地将<h:outputLink>放入<h:dataTable>

<h:dataTable value="#{bean.items}" var="item" width="80%">
    <h:column>
        <f:facet name="header">
            <h:outputText value="State" />
        </f:facet>

        <c:if test="#{item.state != 'Finish'}">
            <h:outputText value="Missing value" />
        </c:if>
        <c:if test="#{item.state == 'Finish'}">
            <h:outputLink value="myLink">
                <h:outputText value="Value = #{item.state}" />
            </h:outputLink>
        </c:if>
    </h:column>
</h:dataTable>

但这不起作用,为什么会这样,我该如何解决呢?

1 个答案:

答案 0 :(得分:48)

在构建视图期间评估JSTL标记,而不是在渲染视图期间评估。您可以按如下方式对其进行可视化:每当第一次创建视图树时,将执行所有JSTL标记,结果是仅包含JSF组件的视图。每当渲染一个视图树时,所有JSF组件都会被执行,结果就是HTML。所以:JSF + JSTL没有按照您对编码的期望同步运行。 JSTL首先从上到下运行,将结果交给JSF,然后JSF再次从上到下运行。这可能会导致JSF迭代组件(如UIData)出现意外结果,因为在JSTL运行时行数据(在您的特定情况下为#{item}对象)可用。

简而言之:使用JSTL来控制JSF组件树构建的流程。使用JSF来控制HTML输出生成流程。

您想在此处使用rendered属性。

<h:outputText value="Missing value" rendered="#{item.state ne 'Finish'}" />
<h:outputLink value="myLink" rendered="#{item.state eq 'Finish'}">
    <h:outputText value="Value = #{item.state}" />
</h:outputLink>

另见: