0

我必须实现一种机制,通过基于登录用户加载正确的 facelet 视图。通过调用服务动态构建加载视图的根路径,并将其存储在会话中。此外,视图可以放在war包外的文件夹中。在我的 facelet 视图中,我使用占位符“皮肤视图”来识别将被替换的部分。

例如:

<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>

总之,我第一次登录时视图加载正确,但如果我注销并使用不同皮肤的不同用户登录,则包含的片段与 previuos 用户相同。我想我对 facelets 缓存机制的理解是错误的。我试过 facelets.REFRESH_PERIOD 等于 0 但没有任何改变。

在此先感谢您的帮助

4

0 回答 0