4

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

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

4

1 回答 1

9

Facelets 实际上能够“预编译”。您可以使用 context 参数控制 Facelets 刷新周期javax.faces.FACELETS_REFRESH_PERIOD。您可以将其设置为-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 秒刷新一次)。MyFaces 的默认设置为-1whenjavax.faces.PROJECT_STAGE未设置为Development

如有必要,您可以通过提供自定义FaceletsCacheFactoryFaceletsCache. 请注意,这仅在 JSF 2.1 之后才可用,因此您需要重新声明您的faces-config.xml符合 JSF 2.1 才能使<facelet-cache-factory>配置设置生效。

为了更进一步,基于 XML 树(因此,整个UIViewRoot)构建的视图理论上也可以被池化。MyFaces 目前已经在为实现这一目标做出一些努力,另请参阅issue 3664。我的同事 Arjan Tijms 在业余时间也在为 Mojarra 寻找它。

于 2013-07-27T04:12:50.337 回答