为什么不对JSF页面进行预编译(至少部分),而是在每次构建视图时进行解析,评估?

我不知道它是否真实,但据我所知,我相信,JSF EL和xhtml页面不是预编译的,只是在需要时使用,而是每次查看时都会对它们进行解析,评估和编译建成。

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

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

  javax.faces.FACELETS_REFRESH_PERIOD -1  

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

如有必要,您可以通过提供自定义FaceletsCacheFactoryFaceletsCache控制Facelets缓存。 请注意,这仅在JSF 2.1之后可用,因此您需要重新声明faces-config.xml符合JSF 2.1,以使配置设置

为了更进一步,基于XML树构建的视图(因此,整个UIViewRoot )理论上也可以合并。 MyFaces目前已经在努力实现这一目标,另请参阅问题3664 。 我的同事Arjan Tijms也在业余时间为Mojarra看待它。