ログインしたユーザーに基づいて、適切な 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 に設定して試しましたが、何も変わりません。
助けてくれてありがとう