JSF渲染阶段(为什么我的代码被执行?)

Chr*_*s B 10 jsf jsf-2

我正在研究JSF应用程序的性能.我注意到即使渲染设置为false,代码仍在执行.例如,拿这段代码:

<h:panelGroup rendered="#{bean.render}">
    <my composite component here/>
</h:panelGroup>    
Run Code Online (Sandbox Code Playgroud)

即使#{bean.render}返回false,我可以从调试日志中清楚地看到,我的复合组件的代码正在渲染阶段执行.在#{bean.render}被调用之前,它看起来似乎正在执行代码.它不会在返回给客户端的HTML中呈现,但仍然显示服务器正在执行代码.

有谁能解释一下?

谢谢.

Bal*_*usC 10

复合组件在渲染响应阶段构建.JSF需要首先填充组件树,然后基于组件树生成HTML.您在复合组件内部显然引用了一些bean属性,这些属性在视图构建期间必须进行评估.

如果您想有条件地控制复合组件的构建而不是渲染,那么您需要使用条件视图构建时标记而不是rendered属性.JSTL提供<c:if><c:choose>为.

<c:if test="#{bean.build}">
    <my:composite />
</c:if>
Run Code Online (Sandbox Code Playgroud)

也可以看看: