为什么 h:link value 在控件未渲染时调用 bean 方法?

Why does h:link value call bean method when the control is not rendered?

我的 JSF 页面上有这个

<h:link rendered="false" value="${mybean.status}" />

控件未呈现,但它仍调用 mybean 中的 getStatus() 方法。为什么?

问题似乎只与 value 属性有关,因为如果我包含 href="${mybean.url}",则不会调用 getUrl() 方法。

我正在使用 Mojarra 2.2.12 附带的 TomEE 7.04 plume。

正如 documentation 所说的 rendered 属性:

Flag indicating whether or not this component should be rendered (during Render Response Phase), or processed on any subsequent form submit.

这意味着 rendered 属性是在最后一个生命周期阶段 (Render Response Phase) 处理的,而组件的值是在 Update model values Phase 期间设置的。在新的 (GET) 请求的情况下,它也在 Render Response Phase 中设置,但显然在检查 rendered 属性之前。设置组件的值意味着调用 getter.

h:link 中没有 href 属性,这就是为什么在这种情况下没有调用 getter。

作为解决方法,您可以将 h:link 包装在 f:subview 中,后者在早期阶段使用渲染属性。

<f:subview rendered="false">
    <h:link rendered="false" value="${mybean.status}" />
</f:subview>

您可能想查看 ,它的答案和评论,其中有指向 JSF 生命周期的链接,也许还有其他有用的信息。