【问题标题】:JSF 2 - How to destroy a session-scoped beanJSF 2 - 如何销毁会话范围的 bean
【发布时间】:2012-04-15 13:20:12
【问题描述】:

如何销毁会话范围的 bean?

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

有没有更好的方法来做到这一点? (自定义范围的 Bean?)

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

    会话范围 bean 在涉及此 bean 的第一个 HttpRequest 上创建。当session 失效时销毁。您也可以通过将其从HttpSessionsessionMap 中删除来手动销毁它(通过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

    希望对您有所帮助!

    【讨论】:

    • 第一次请求时会创建会话 bean,而不是在创建会话时自动创建。
    • @Matt Handy 是的,抱歉,不知道我在写这篇文章时在想什么,这样的错误......竖起大拇指指出。现在还好吗?
    • 没问题。我不会在这里使用会话范围。
    • 感谢@Fallup,但是如果我只使用 AJAX 导航,那么 View 和 Session Scopes 之间并没有真正的区别。对吧?
    • @Ben 如果您只考虑在选项卡之间切换,那么不会。但是如果你离开view 你的标签在哪里,那么View scoped 会被销毁,但Session scoped 仍然会存在。
    猜你喜欢
    • 1970-01-01
    • 2019-04-14
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多