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

时间:2012-12-14 21:01:22

标签: jsf jsf-2

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

<h:panelGroup rendered="#{bean.render}">
    <my composite component here/>
</h:panelGroup>    

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

任何人都能解释一下吗?

感谢。

2 个答案:

答案 0 :(得分:10)

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

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

<c:if test="#{bean.build}">
    <my:composite />
</c:if>

另见:

答案 1 :(得分:1)

Jsf必须知道你的组件是渲染还是禁用或其他什么。假设你说disabled =“false”它显示在clint端,客户端可能会更改值并提交表单,即使客户端禁用了javascript,jsf也会在服务器端检查它是否为false或true。如果它是真的那么它是不可接受的并且永远不会因为jsf的进程验证阶段而来到你的bean,与render =“false”相同