5

I have been noticing that all of my beans used in the page are unnecessarily getting instantiated on updating any small portion of the page. Ok, they are request scoped so will be instantiated on every request but it should be done only when those beans are needed by that part of the page which is being updated. Isn't it ?

Why this bad design in JSF?

Update:

I found the real culprit that was causing this behavior, I had f:event type="preRenderView" at certain places in my webpage. That actually caused those beans to be re-instantiated in order to invoke the listener. The fix was to use f:event type="preRenderComponent" instead. This reduced most of the unnecessary bean instantiations at each request but still I see a few unnecessary bean instantiations.

4

2 回答 2

4

在这种情况下,bean 只会在它参与构建视图时被构建(阅读:它的一个属性在 taghandler 的任何属性或UI 组件的idor属性中被引用)。binding否则它不会被构建。至少,在“常规方式”设计 JSF 视图时,我无法在 Mojarra 2.1.11(也不是 2.0.0)中重现您的问题。

视图不能部分构建,但可以部分保存和恢复其状态,并且可以部分呈现 UI 组件树。

您的“JSF 中的糟糕设计”投诉没有任何论据。

也可以看看:

于 2012-07-23T21:56:58.423 回答
2

希望我正确地解释了您的问题!

您的页面由表单提交,因此第一次检索或构造组件树(JSF 生命周期的第一步)。

组件树由所有内容组成,而不仅仅是您当前所在的视图。

因此,绑定到任何请求范围 bean 的任何 JSF 组件都会在此阶段进行实例化。

tabView 就是一个很好的例子。想象一个带有四个选项卡的 tabView,每个选项卡绑定到不同的页面,每个页面绑定到相应的请求范围的支持 bean。

尽管并非所有选项卡都同时可见,但它们都是组件树的一部分,因此,如果设置断点,您将看到在请求阶段为每个页面实例化 bean。

于 2012-07-24T16:09:57.433 回答