1

JSF 2.1.8を使用してWebアプリケーションを実装していますが、 ui:includeタグに問題があります。私はこのコードを持っています

<h:panelGroup id="panelContenido">

        <ui:fragment rendered="#{!empty navigationManagerSystem._Navegable}">
            <ui:include src="#{navigationManagerSystem._Navegable._IncludePath}" />

        </ui:fragment>
        <ui:fragment rendered="#{empty navigationManagerSystem._Navegable}">
            <ui:include src="/system/navigation/error.xhtml" />
        </ui:fragment>
    </h:panelGroup>

NavigationManagerSystem BeanはJSFセッションで管理されており、このコードが最初にレンダリングされるときに、インクルードパスのコンテンツが表示されることになっています。これには、そのような定数で実行した場合は機能し<ui:include /system/home/index.xhtml" />ますが、変数に入れた場合は機能しません。画面が印刷される前に、変数がその値を保持していることを確認した場合でも同様です。/system/home/index.xhtmlページを保持するBean( View Scoped)に関連付けられるかどうかはわかりません。

とにかく、ページレンダリングの直後にページを更新すると、xthmlが適切に含まれます。ちなみに、jstlタグがないようにページを簡略化して、ビュースコープで問題が発生する可能性があることを知っています。

それについて何か考えはありますか?

4

1 に答える 1

6

問題の原因については、<ui:include>予想どおり、ビューのレンダリング時間(レンダリング応答フェーズ)ではなく、ビューのビルド時間(ビューの復元フェーズ)で実行されます。したがって、たとえばアクションフェーズの呼び出しや応答フェーズのレンダリング中にインクルードパスが変更された場合、完全に再構築されない限り、ビューに反映されません。

現在、最善の策は、<ui:include>ビューのレンダリング時にそれぞれ条件付きでレンダリングされる複数の静的タグを使用することです。確かに、これは不必要に大きなコンポーネントツリーになってしまいます。この問題に対する「聖杯」の解決策はまだありません。問題は明確に理解されていますが、JSF/Faceletsのライフサイクルを考えると解決は困難です。私はOmniFacesについてもいくつかの実験を行いましたが、最も単純な試みは、Mojarraで(ある程度)機能している間、MyFacesでは失敗します。

参照:

于 2012-12-21T14:54:02.267 に答える