JSTLc:如果JSFh:dataTable内部不工作

JSTLc:如果JSFh:dataTable内部不工作

我试着用<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>

但这是行不通的,为什么要这样,我怎么才能解决呢?


倚天杖
浏览 436回答 1
1回答

侃侃无极

JSTL标记是在视图构建过程中评估的,而不是在视图呈现过程中评估的。您可以将其可视化如下:每当第一次创建视图树时,将执行所有JSTL标记,其结果是只包含JSF组件的视图。每当呈现视图树时,都会执行所有JSF组件,结果是HTML。因此:JSF+JSTL并不像您期望的那样同步运行。JSTL首先从上到下运行,然后将结果交给JSF,然后再从上到下运行JSF。这可能会导致像UIData这样的JSF迭代组件的意外结果,因为行数据(在您的特殊情况下)#{item}对象)是不在JSTL运行时可用。简而言之:使用JSTL控制JSF组件树构建的流程。使用JSF控制HTML输出生成的流程。您想使用rendered属性在这里。<h:outputText&nbsp;value="Missing&nbsp;value"&nbsp;rendered="#{item.state&nbsp;ne&nbsp;'Finish'}"&nbsp;/><h:outputLink&nbsp;value="myLink"&nbsp;rendered="#{item.state&nbsp;eq&nbsp;'Finish'}"> &nbsp;&nbsp;&nbsp;&nbsp;<h:outputText&nbsp;value="Value&nbsp;=&nbsp;#{item.state}"&nbsp;/></h:outputLink>另见:JSF2中的JSTL.合乎道理?有条件地显示JSF组件
打开App,查看更多内容
随时随地看视频慕课网APP