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

标签 jsf jsf-2

我目前正在研究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>

也可以看看:
  • JSTL in JSF2 Facelets... makes sense?
  • 关于JSF渲染阶段(为什么执行我的代码?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13886185/

    相关文章:

    jsf - 通过 PrimeFaces 超时 p :idleMonitor

    java - 如何使用 AJAX 使两个 JSF selectOneMenu 相互依赖?

    javascript - 显示来自其他网站的内容并跟踪 URL

    javascript - PrimeFaces 设置 tabView 始终查看第一个选项卡

    java - 我如何隐藏 f :selectItem tag under h:selectOneRadio

    java - SelectOneMenu 没有任何可供选择的值

    jsf - 如何在不绑定(bind)到托管 bean 中的 UI 组件的情况下访问 primefaces 树中的当前 TreeNode(以标记或编程方式)?

    jsf-2 - 通过js禁用按钮

    jsf-2 - 将鼠标悬停在标题列数据表上时显示工具提示

    jsf-2 - JSF 呈现的问题