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

Raj*_*pta 4 java performance jsf facelets el

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

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

Bal*_*usC 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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