我不知道这是否属实,但从我读过的内容来看,我相信 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 寻找它。