JSF 2 - 如何销毁一个会话作用域的Bean

5

如何销毁会话作用域的bean?

这样做的目的是控制bean的生命周期,使其仅在Web应用程序中的选项卡处于活动状态时才存在。 (在Web应用程序中使用基于Ajax的选项卡导航)

是否有更好的方法?(自定义作用域bean?)

1个回答

5

Session scoped bean是在第一次涉及此bean的HttpRequest时创建的。当session失效时,它会被销毁。您还可以通过从HttpSessionsessionMap(通过FacesContext获取)中删除它来手动销毁它。

事实上,在选项卡视图期间仅存在的Session scoped bean的创建是不合逻辑的。为此,定义Custom scoped bean将更好,但首先考虑以下问题:

  • 为什么需要这种功能?因为内存原因吗?

这可能非常棘手,想象一下用户经常在选项卡之间切换,您正在反复创建bean。更糟糕的是,如果您在constructor@PostConstruct从DB提取数据,那么它将不会真正有效。

我的意见是,您应该忘记它(除非您需要它用于其他目的),并选择View scoped bean。此bean在访问视图后初始化,并一直存在,直到您切换到另一个视图为止-因此每次选项卡切换都不会从DB中提取数据(仍然是同一视图)。在我看来,一次获取大量数据要比例如15次... 如果您不提取任何数据,则肯定选择View scoped。但那只是我的意见。

如果您负担不起View scoped,则选择Custom scoped bean,但绝对不要选择Session scoped

更多阅读:BalusC on JSF 2.0

希望它有所帮助!


2
会话Bean是在第一次请求时创建,而不是在会话创建时自动创建。 - Matt Handy
@Matt Handy,对不起,写那个的时候不知道我在想什么,犯了这样的错误...感谢你的指出。现在可以了吗? - Fallup
没问题。我不会在这里使用会话作用域。 - Matt Handy
谢谢 @Fallup,但是如果我只使用 AJAX 导航,那么视图和会话范围之间就没有真正的区别了,对吗? - Ben
@Ben 如果你只是考虑在选项卡之间切换,那么不需要。但是如果你离开了包含选项卡的“视图”,那么“视图范围”将被销毁,但“会话范围”仍将保持。 - Fallup
@MattHandy 我知道为什么会对我不利使用会话范围(花了我一些时间,我知道 :-)) 当我使用服务器状态保存方法时,服务器有一个约20个会话的状态队列。 假设我有21个选项卡,并且我按顺序浏览所有选项卡,然后返回到第一个选项卡,我将收到视图过期异常。这并不是一个牵强附会的例子。如果您有3个选项卡,迭代其中2个20次,然后返回第三个选项卡,您将收到相同的异常。能够在选项卡更改时清除会话将避免此问题。 - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接