【发布时间】:2012-04-15 13:20:12
【问题描述】:
如何销毁会话范围的 bean?
这样做的目的是控制 bean 的生命周期,使其仅在 Web 应用程序中的选项卡处于活动状态时才存在。 (在 webapp 中使用基于 Ajax 的选项卡导航)
有没有更好的方法来做到这一点? (自定义范围的 Bean?)
【问题讨论】:
标签: jsf-2
如何销毁会话范围的 bean?
这样做的目的是控制 bean 的生命周期,使其仅在 Web 应用程序中的选项卡处于活动状态时才存在。 (在 webapp 中使用基于 Ajax 的选项卡导航)
有没有更好的方法来做到这一点? (自定义范围的 Bean?)
【问题讨论】:
标签: jsf-2
会话范围 bean 在涉及此 bean 的第一个 HttpRequest 上创建。当session 失效时销毁。您也可以通过将其从HttpSession 或sessionMap 中删除来手动销毁它(通过FacesContext)。
事实上,创建 Session scoped bean 是 不合逻辑 的,该 bean 仅在选项卡视图期间存在。为此,定义 Custom scoped bean 会更好,但请先考虑一下:
这可能很棘手,想象一下用户只是经常在选项卡之间切换,而您正在一遍又一遍地重新创建 bean。如果您从constructor 或@PostConstruct 中的DB 获取数据 会更糟。它不会真正有效。
我的意见是你应该忘记它(除非你需要它用于其他目的)并选择一个 View scoped bean。该 bean 在访问视图后被初始化并一直存在,直到您不切换到另一个视图 - 所以在每个选项卡开关上都没有数据库获取(仍然是相同的视图)。 IMO最好一次获取大量数据而不是例如。 15 次...如果您没有获取任何数据,那么一定要选择 View scoped。但这只是我所说的。
如果您买不起 View scoped,请选择 Custom scoped bean,但绝对不要 Session scoped。
进一步阅读:BalusC on JSF 2.0
希望对您有所帮助!
【讨论】:
view 你的标签在哪里,那么View scoped 会被销毁,但Session scoped 仍然会存在。