我不知道这是否属实,但从我读过的内容来看,我相信 JSF EL 和 xhtml 页面不是预编译的,只是在需要时使用,而是每次查看时都会对其进行解析、评估和编译建成。

我不明白为什么要这样做!为什么不只解析和编译一次,至少部分可以,某些组件的呈现可能取决于动态获取的变量,因此它们可能会在稍后呈现,但为什么要延迟页面上的所有组件呢?无论可以预编译和准备使用的最大值是多少,为什么不在部署应用程序时才这样做呢?这不会改善页面的渲染时间吗?

最佳答案

Facelets 实际上能够“预编译”。您可以使用上下文参数 javax.faces.FACELETS_REFRESH_PERIOD 控制 Facelets 刷新周期。您可以将其设置为 -1 以告诉 JSF 永远不要重新编译/重新解析 Facelets 文件,并且实际上将整个 SAX 编译/解析的 XML 树(基于 XHTML 组合)保存在缓存中:

<context-param>
    <param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
    <param-value>-1</param-value>
</context-param>

但是不要在开发期间使用此设置,否则您必须在每次编辑 Facelets 文件时重新启动整个服务器。 Mojarra 有一个默认设置 2 (意思是,缓存将每 2 秒刷新一次)。当 -1 未设置为 javax.faces.PROJECT_STAGE 时,MyFaces 的默认设置为 Development

如有必要,您可以通过提供自定义 FaceletsCacheFactory FaceletsCache 来控制 Facelets 缓存。请注意,这仅从 JSF 2.1 开始可用,因此您需要重新声明您的 faces-config.xml 符合 JSF 2.1 以使 <facelet-cache-factory> 配置设置工作。

为了更进一步,理论上也可以合并基于 XML 树(因此,整个 UIViewRoot )构建的 View 。 MyFaces 目前已经在为此做出一些努力,另见 issue 3664 。我的同事 Arjan Tijms 在业余时间也在为 Mojarra 寻找它。

10-07 13:15