10

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

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

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

谁能解释一下?

谢谢。

4

2 回答 2

10

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

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

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

也可以看看:

于 2012-12-15T13:17:48.477 回答
1

Jsf 必须知道您的组件是否被渲染或禁用或其他。假设您说 disabled="false" 它显示在 clint 端,并且客户端可能会更改值并提交表单,即使客户端禁用了 javascript,jsf 也会检查它在服务器端是否禁用 false 或 true。如果这是真的,那么由于 jsf 的流程验证阶段,它是不可接受的并且永远不会出现在您的 bean 中,与 render="false" 相同

于 2012-12-14T21:27:26.443 回答