20

我正在尝试在状态完成时<c:if>有条件地将 a<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>

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

4

1 回答 1

50

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>

也可以看看:

于 2010-08-09T17:41:58.160 回答