【问题标题】:JSF render phase (why is my code being executed?)JSF 渲染阶段(为什么要执行我的代码?)
【发布时间】:2012-12-14 21:01:22
【问题描述】:

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

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

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

谁能解释一下?

谢谢。

【问题讨论】:

标签: jsf jsf-2


【解决方案1】:

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

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

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

另见:

【讨论】:

    【解决方案2】:

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

    相同

    【讨论】:

    • 你没有回答具体的问题。
    猜你喜欢
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    相关资源
    最近更新 更多