我在使用 JRebel、Spring、JSF Mojarra 2.0.3 和 WebLogic 10.3 热重载 Facelets 文件时遇到了一些问题。
JRebel 成功重新加载 /WebContent 下的常规 Java 类和 js/css 文件,但不能成功加载 JSF 的 .xhtml 文件。需要完全重新发布才能在服务器上更新 xhtml 文件。
通过反复试验,我终于通过向 web.xml 添加一些 Facelets 参数并创建自定义 ResourceResolver(如本博客文章中所述)来工作。 但是,我想知道为什么这会起作用,更具体地说:
为什么需要自定义ResourceResolver?
问题是 Facelets 会进行缓存,并且不会重新读取更改的文件。要强制重新加载,请在
web.xml
中指定以下参数之一。
JSF 2+(Facelets 2+):
<!-- Set the project stage to "Development", "UnitTest", "SystemTest", or "Production". -->
<!-- An optional parameter that makes troubleshooting errors much easier. -->
<!-- You should remove this context parameter before deploying to production or override via Server's JNDI config! -->
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
这将自动将“Facelets刷新周期”配置设置为0,从而有效禁用Facelets缓存。
或者,如果您不想改变项目阶段,那么
<!-- Time in seconds that facelets should be checked for changes since last request. A value of -1 disables auto-refresh. -->
<!-- You should remove this context parameter before deploying to production or use PROJECT_STAGE instead! -->
<context-param>
<param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
<param-value>0</param-value>
</context-param>
对于 Faces 4.x,
javax.
前缀应改为
jakarta.
,如 jakarta.faces.PROJECT_STAGE
和 jakarta.faces.FACELETS_REFRESH_PERIOD
。
对于 (Facelets 1.x),等效参数是:
<context-param>
<param-name>facelets.DEVELOPMENT</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>facelets.REFRESH_PERIOD</param-name>
<param-value>0</param-value>
</context-param>
有关 JSF 上下文参数的更多信息:http://docs.jboss.org/jbossas/6/JSF_Guide/en-US/html/jsf.reference.html#standard.config.params
您的情况不需要该自定义资源解析器。该资源解析器只是从自定义文件系统文件夹获取 xhtml 文件的一种棘手方法。在你的例子中,JRebel 做到了这一点(甚至更多)。
验证您的 JRebel 设置中是否启用了
facelets
Project Stage
中使用
Development
web.xml