我必须实现一种基于登录用户加载正确的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>
总之,我第一次登录视图时正确加载,但是如果我退出并且我使用不同皮肤的其他用户登录,则包含的片段与previuos用户相同。 我想我对facelets缓存机制的理解是错误的。 我用facelets.REFRESH_PERIOD等于0但没有任何改变。
提前感谢您的帮助