[英]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组件的id
或binding
属性中都引用了其属性之一)。 否则将无法构建。 至少,当以“通常的方式”设计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.