据我了解,ViewScoped bean 仅在发生以下情况之一时才会被销毁:
1) JSF 向另一个页面发送 POST 请求,其中包含类似<h:commandLink...>
2)打开的bean数量超过最大阈值设置(默认15)
3)用户的会话过期
这是我的困惑:
#1 是否意味着如果用户通过 GET 请求离开页面,bean 将保持打开状态,即使最终 JSF POST 发生在另一个页面的同一浏览器选项卡中?或者,一旦发送 JSF POST,无论用户位于哪个页面,该浏览器选项卡的所有活动 @ViewScoped 实例都会被销毁吗?
#2 是否意味着用户可以为每个 @ViewScoped 类拥有 15 个活动的 bean 实例?或者它是 15 个 bean 实例,无论类如何——这意味着我可以有 5 个 Class1 实例、5 个 Class2 实例和 5 个 Class3 实例,而新 bean 会破坏最旧的活动 bean?
对于 #3,如果 STATE_SAVING_METHOD 设置为“client”,这会对 ViewScoped beans 被销毁产生任何影响吗?据我所知,如果 STATE_SAVING_METHOD 设置为客户端,则需要有一种方法来手动控制会话过期。
最后,有没有一种方法可以管理活动的 ViewScoped beans,以便在用户单击“注销”时销毁它们?
我通过向每个 @ViewScoped bean 添加 @PreDestroy 方法并在其被销毁时进行记录来找到这些问题的答案。对于其他可能对此感到好奇的人:
对于 #1,如果您使用 GET 请求导航离开页面,但稍后发送 post 请求,则 Bean 不会被销毁。该 bean 将保留在内存中,直到达到“最大活动视图范围”设置并且轮到该 bean 被销毁,或者会话已失效。
对于#2,阶级并不重要。您可以有 5 个 Class1 实例、5 个 Class2 实例和 5 个 Class3 实例,并且新的 ViewScoped bean 实例将销毁最旧的 bean(假设您的阈值为 15)。
对于#3,一旦会话失效,即使 STATE_SAVING_METHOD 设置为客户端,bean 也会被销毁。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)