我目前正在研究JSF应用程序的性能。我注意到即使渲染设置为false,代码也正在执行。例如,使用以下代码:
<h:panelGroup rendered="#{bean.render}">
<my composite component here/>
</h:panelGroup>
即使#{bean.render}返回false,我也可以从调试日志中清楚地看到,我的复合组件的代码正在渲染阶段执行。看起来代码甚至在调用#{bean.render}之前就已在执行。它没有在返回给客户端的HTML中呈现,但是仍然看起来服务器正在执行代码。
谁能解释一下?
谢谢。
最佳答案
复合组件是在渲染响应阶段构建的。 JSF需要首先填充组件树,然后基于该组件树生成HTML。您在复合组件内部,显然是在引用一些bean属性,这些属性必须在 View 构建期间进行评估。
如果要有条件地控制复合组件的构建而不是渲染,则需要使用条件 View 的构建时间标记而不是rendered
属性。 JSTL为此提供了<c:if>
和<c:choose>
。
<c:if test="#{bean.build}">
<my:composite />
</c:if>
也可以看看:
关于JSF渲染阶段(为什么执行我的代码?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13886185/