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

ErV*_*VeY 19 datatable jsf 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>
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 49

在构建视图期间评估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>
Run Code Online (Sandbox Code Playgroud)

也可以看看: