状態が終了したときに、<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>
しかし、これは機能しません、なぜそれがあり、どうすれば修正できますか?
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>