提问人:Mads Mobæk 提问时间:9/22/2011 最后编辑:BalusCMads Mobæk 更新时间:10/31/2023 访问量:29017
JSF 和自动重新加载 Facelets 文件
JSF and automatic reload of Facelets files
问:
我在使用 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 无法检测到?
答:
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,前缀应改为,如 so 和 。javax.
jakarta.
jakarta.faces.PROJECT_STAGE
jakarta.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做到了这一点(甚至更多)。
评论
javax.faces.FACELETS_REFRESH_PERIOD
0
javax.faces.PROJECT_STAGE
Development
javax.faces.FACELETS_REFRESH_PERIOD
以下是我为我修复此问题的方法:
- 验证插件是否已在 JRebel 设置中启用 &
facelets
- 验证
您是否在
Project Stage
web.xml
评论