【问题标题】:JSTL c:if doesn't work inside a JSF h:dataTableJSTL c:if 在 JSF h:dataTable 中不起作用
【发布时间】:2014-11-15 10:41:57
【问题描述】:

我正在尝试使用<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 datatable jstl conditional-rendering


    【解决方案1】:

    JSTL 标记是在视图构建期间评估的,而不是在视图呈现期间。您可以将其可视化如下:每当第一次创建视图树时,都会执行所有 JSTL 标记,结果是只有 JSF 组件的视图。每当渲染视图树时,所有 JSF 组件都会执行,结果是 HTML。所以:JSF+JSTL 不会像您对编码所期望的那样同步运行。 JSTL先从上往下运行,结果交给JSF,再轮到JSF从上往下运行。这可能会导致 JSF 迭代 UIData 等组件时出现意外结果,因为行数据(在您的特定情况下为 #{item} 对象)在 JSTL 运行时可用。

    简而言之:使用 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>
    

    另见:

    【讨论】:

      猜你喜欢
      • 2012-08-15
      • 2011-07-04
      • 1970-01-01
      • 2013-12-16
      • 1970-01-01
      相关资源
      最近更新 更多