根据我的理解,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 bean被破坏会有什么影响吗?根据我的记忆,如果将STATE_SAVING_METHOD设置为客户端,则需要有一种手动控制会话到期的方法。
最后,有没有办法管理活动的ViewScoped bean,以便在用户点击“logout”时可以销毁它们?
答案 0 :(得分:1)
我通过向每个@ViewScoped bean添加一个@PreDestroy方法并在它被销毁时进行记录来找出答案。对于可能对此感到好奇的其他人:
对于#1,如果您使用GET请求离开页面,则bean不会被销毁,但随后会发送一个帖子请求。该bean将保留在内存中,直到达到“最大活动视图范围”设置,并且该转出的bean将被销毁,或者会话已失效。
对于#2,上课并不重要。您可以拥有5个Class1实例,5个Class2实例和5个Class3实例,如果阈值为15,则新的ViewScoped bean实例将销毁最旧的bean。
对于#3,即使STATE_SAVING_METHOD设置为client,一旦会话失效,看起来bean也会被销毁。