20

状態が終了したときに条件付きで内部を<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>

しかし、これは機能しません、なぜそれがあり、どうすれば修正できますか?

4

1 に答える 1

50

JSTL タグは、ビューのレンダリング時ではなく、ビューの構築時に評価されます。次のように視覚化できます。ビュー ツリーが初めて作成されるときはいつでも、すべての JSTL タグが実行され、結果は JSF コンポーネントのみを含むビューになります。ビュー ツリーがレンダリングされるたびに、すべての JSF コンポーネントが実行され、結果が HTML になります。そのため、コーディングから期待されるように、JSF + JSTL は同期して実行されません。JSTL は最初に上から下に実行され、結果が JSF に渡され、JSF が再び上から下に実行されます。これにより、UIData などの JSF 反復コンポーネントで予期しない結果が生じる可能性があります。これは、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 に答える