繁体   English   中英

为什么JSF在请求更新视图的一部分时实例化页面上的所有bean而不是页面那部分中使用的bean?

[英]Why does JSF, on request to update a portion of view instantiate all beans on the page instead of beans used in that part of page?

我一直注意到,在更新页面的任何一小部分时,不必要地实例化了页面中使用的所有bean。 好的,它们是请求范围的,因此将在每个请求上实例化,但是只有在要更新的页面的那部分需要这些bean时才应执行此操作。 是不是

为什么在JSF中这种糟糕的设计?

更新:

我找到了导致此问题的真正原因,我在网页的某些位置上有f:event type="preRenderView" 实际上,这些bean被重新实例化以调用侦听器。 解决方法是改用f:event type="preRenderComponent" 这减少了每个请求的大多数不必要的bean实例,但是我仍然看到一些不必要的bean实例。

在这种情况下,只有在参与构建视图时才会构建Bean(阅读:在taghandler的任何属性或UI组件的idbinding属性中都引用了其属性之一)。 否则将无法构建。 至少,当以“通常的方式”设计JSF视图时,我无法在Mojarra 2.1.11中重现您的问题(在2.0.0中也是如此)。

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

您的“ JSF中的不良设计”投诉毫无争议。

也可以看看:

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

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

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

因此,在此阶段将实例化绑定到任何请求范围Bean的任何JSF组件。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM