0

ログインしたユーザーに基づいて、適切な facelet ビューをロードするメカニズムを実装する必要があります。ビューをロードするルート パスは、サービスを呼び出すことによって動的に構築され、セッションに格納されます。さらに、ビューは war パッケージ外のフォルダーに配置できます。私のfaceletビューでは、プレースホルダー「skin-views」を使用して、置換される部分を特定しました。

例えば:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jstl/core"     
template="/facelets/template.xml">

    ...
    <ui:define name="content">
       <ui:include src="skin-views/content.xhtml">
    </ui:define>
    ...

</ui:composition>

上記のスニペットでは、ページ テンプレートが war パッケージに含まれていますが、プレースホルダー 'skin-view' は、正しいルックアップ パスを構築するカスタム ResourceResolver に置き換えられています。

例えば:

skin-views => /home/user/skins/customSkin/
skin-views/content.xhtml => /home/user/skins/customSkin/content.xhtml

web.xml で、次のパラメーターを設定しました。

<context-param>
    <param-name>facelets.REFRESH_PERIOD</param-name>
    <param-value>2</param-value>
</context-param>

<context-param>
    <param-name>facelets.VIEW_MAPPINGS</param-name>
    <param-value>*.xhtml</param-value>
</context-param>

<context-param>
    <param-name>facelets.DEVELOPMENT</param-name>
    <param-value>false</param-value>
</context-param>

<!-- Added just for removing an annoying error message on startup -->
<context-param>
    <param-name>facelets.RECREATE_VALUE_EXPRESSION_ON_BUILD_BEFORE_RESTORE</param-name>
    <param-value>false</param-value>
</context-param>

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>

結論として、最初にログインしたときはビューが正しく読み込まれますが、ログアウトして別のユーザーで別のスキンでログインすると、含まれるフラグメントは以前のユーザーと同じです。facelets キャッシング機構に関する私の理解は間違っていると思います。facelets.REFRESH_PERIOD を 0 に設定して試しましたが、何も変わりません。

助けてくれてありがとう

4

0 に答える 0