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

JSTL c:if doesn't work inside a JSF h:dataTable

提问人:ErVeY 提问时间:8/10/2010 最后编辑:BalusCErVeY 更新时间:7/28/2015 访问量:30193

问:

我试图在状态完成时有条件地将一个放入 a 中。<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>

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

JSF 数据表 JSTL 条件渲染

评论


答:

51赞 BalusC 8/10/2010 #1

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>

另请参阅: