JSF和Facelets文件的自动重新加载

26
我在使用JRebel、Spring、JSF Mojarra 2.0.3和WebLogic 10.3时遇到了一些热重载Facelets文件的问题。
JRebel可以成功重载/WebContent下的普通Java类和js/css文件,但无法重载JSF的.xhtml文件。为了让服务器上的xhtml文件更新,需要进行完整的重新发布。
通过试错,我最终通过在web.xml中添加一些facelets参数并创建一个自定义的ResourceResolver来解决了这个问题,具体步骤可以参考这篇博客文章
然而,我想知道为什么这样做可以解决问题,具体来说有以下几点疑问:
- 为什么需要一个自定义的ResourceResolver? - JRebel不应该通过监控包含xhtml文件的/WebContent来处理这个问题吗? - 我猜这可能与Facelets/JSF通过FacesServlet将xhtml编译为servlet有关,而JRebel无法检测到这一点。
2个回答

48
JRebel处理/WebContent文件夹的更改。
问题是Facelets会缓存并不会重新读取已更改的文件。要强制重新加载,请在web.xml中指定以下参数之一。
JSF 2+(Facelets 2+):
<!-- Set the project stage to "Development", "UnitTest", "SystemTest", or "Production". -->
<!-- An optional parameter that makes troubleshooting development stage 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_STAGEjakarta.faces.FACELETS_REFRESH_PERIOD
对于JSF 1.2(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可以做到这一点(甚至更多)。

@Balusc 谢谢回复,答案已更新为 Facelets 2.x 特定版本。 - Andrey
javax.faces.FACELETS_REFRESH_PERIOD 设置为 0,并将 javax.faces.PROJECT_STAGE 设置为 Development,似乎无法在 JSF 2.0.4 和 WebLogic 10.3 上使用 JRebel 触发更新的模板。 - uggedal
1
一定要爱上 Stack Overflow。javax.faces.FACELETS_REFRESH_PERIOD 对我来说完美地解决了问题。JBoss 4,JSF2。 - Magnilex
我们的团队使用Glassfish 3/IceFaces,我们已经将FACELETS_REFRESH_PERIOD设置为-1相当长一段时间了。将其设置为0可以启用XHTML的热重载。 - dseibert
为了使用JRebel,这个更改是必须的。 - mokarakaya
显示剩余2条评论

1
以下是我的解决方法:
  1. 确认在您的JRebel设置中启用了facelets插件并且
  2. 确认您正在web.xml中使用Project Stage Development

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接