【问题标题】:JSF and automatic reload of xhtml filesJSF 和 xhtml 文件的自动重新加载
【发布时间】:2011-11-22 16:01:59
【问题描述】:

我在使用 JRebel、Spring、JSF Mojarra 2.0.3 和 WebLogic 10.3 热重载 XHTML 文件时遇到了一些问题。

JRebel 成功地重新加载了 /WebContent 下的常规 Java 类和 js/css 文件,但不是 JSF 的 .xhtml 文件。需要完全重新发布才能在服务器上更新 xhtml 文件。

通过反复试验,我终于通过向 web.xml 添加一些 facelets 参数并创建自定义 ResourceResolver 来实现它,如in this blog post 所述。

但是,我想知道为什么会这样,更具体地说:

  • 为什么需要自定义 ResourceResolver?
  • JRebel 不应该通过监视 xhtml 文件所在的 /WebContent 来处理这个问题吗?
  • 我猜这与Facelets/JSF 通过FacesServlet 将xhtml 编译为servlets(?) 有关,而JRebel 无法检测到?

【问题讨论】:

    标签: java jsf facelets mojarra jrebel


    【解决方案1】:

    JRebel 处理 /WebContent 文件夹更改。

    问题在于 Facelets 进行缓存并且不会重新读取更改的文件。要强制重读,​​请在 web.xml 中指定以下参数。

    JSF 2(Facelets 2.x):

    <!-- Time in seconds that facelets should be checked for changes since last request. A value of -1 disables refresh checking. -->
    <context-param>
        <param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
        <param-value>0</param-value>
    </context-param>
    
    <!-- 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! -->
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    

    对于 JSF 1.2 (Facelets 1.x) 参数为:

    <context-param>
        <param-name>facelets.REFRESH_PERIOD</param-name>
        <param-value>0</param-value>
    </context-param>
    <context-param>
        <param-name>facelets.DEVELOPMENT</param-name>
        <param-value>true</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 1.x 特定的,并且 OP 使用的是 Facelets 2.x。
    • @Balusc 感谢您的回复,已更新为 Facelets 2.x 特定的答案。
    • javax.faces.FACELETS_REFRESH_PERIOD 设置为0javax.faces.PROJECT_STAGE 设置为Development 似乎不会触发在JSF 2.0.4 和WebLogic 10.3 上使用JRebel 更新的模板。
    • @uggedal OP 注意到“最终通过向 web.xml 添加一些 facelets 参数并创建自定义 ResourceResolver 来使其工作”。如果没有自定义资源解析器,我不知道它是否适合他。
    • 爱堆栈溢出。 javax.faces.FACELETS_REFRESH_PERIOD 非常适合我。 JBoss 4,JSF2。
    【解决方案2】:

    这是我为我解决此问题的方法:

    1. 验证 facelets 插件已在您的 JRebel 设置中启用 &
    2. 验证您在web.xml 中使用的是Project Stage Development

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 2012-04-21
      • 2012-04-30
      • 2011-05-26
      • 1970-01-01
      • 2012-05-25
      相关资源
      最近更新 更多