【问题标题】:JSF - Clearing values in managed beans in session scopeJSF - 在会话范围内清除托管 bean 中的值
【发布时间】:2011-12-09 09:33:33
【问题描述】:

我有许多 menulinks ,每个都与一个会话 bean 相关联。由于 bean 处于会话状态,因此当我在不同的菜单链接之间移动时,这些值将被保留。例如,假设有 2 个菜单链接 - 客户资料和帐户详细信息。在客户资料中,可以通过输入名字和姓氏来搜索客户的详细信息。在账户详情页面,可以通过输入客户账号来获取客户账户的详细信息。在这种情况下,当用户输入无效的帐号时,将显示验证错误,并且用户输入的客户帐号将保留在屏幕上。当用户导航到客户资料链接并返回帐户详细信息屏幕时,将显示之前输入的帐号,因为它是会话范围。

处理这个问题的最佳方法是什么?

  1. 我可以在 beforePhasePhaseListener 中添加一些代码,以便在用户导航到其他菜单链接时从会话中删除 bean?
  2. 我是否应该有某种初始化块,每次单击相关菜单链接时都可以调用它来清理会话 bean 中的变量?

是否有处理这种情况的最佳实践?

【问题讨论】:

    标签: java jsf


    【解决方案1】:

    您不应该在会话范围 bean 中存储请求或查看范围数据。将 bean 放在请求或视图范围中。新的 JSF2 视图范围可以在带有 RichFaces 的 JSF1 中通过向视图添加引用请求范围 bean 的 <a4j:keepAlive> 来实现。

    【讨论】:

    • 嗨 BalusC,整个应用程序都有会话范围的 bean。使用 使其查看范围会涉及很多工作吗?该应用程序目前没有使用太多的 ajax 功能。应用程序是否应该使用 ajax 相关标签将其转换为视图范围?
    • 好吧,如果应用程序从一开始就设计不佳,我将无能为力。不,ajax 功能不是强制性的。
    • 感谢 BalusC - 一如既往的非常有价值的提示。我什么时候应该在会话范围内使用托管 bean。有例子吗?
    • 当你有会话范围的数据时。例如。登录用户、其偏好、选择的语言等。简而言之:Managed bean scopes
    【解决方案2】:

    我们正在使用选项 2,即当我们单击相应的链接时,托管 bean 被“重置”。

    但是,您可能希望查看 Seam Faces,因为它引入了一些可能提供您需要的更多范围(例如对话范围)。

    【讨论】:

    • 谢谢托马斯。我们主要使用 Rich Faces。将研究 Seam Faces 提供的选项。选择选项 1 是不是不好的做法?选项 1 是否有任何问题。
    • @user1042646 好吧,我没有检查,但您可能必须检查会话中的所有 bean,这可能有点过头了。此外,您可能会检查用户当前正在浏览的上下文,因为您不希望在用户浏览器帐户详细信息等时清除这些值。如果在这样的上下文中没有浏览,您可以考虑将这些值放入请求中范围 bean。
    • 在这种情况下,我正在做的是,我为每个菜单链接添加了一个属性“menuLink”。在 phaseListener 中,我检查 menuLink 属性并从会话中删除特定的 bean。当我处于对话中间时,该值不会被删除,因为不会传递参数。在表单重置的情况下,应该在哪里调用表单重置方法?它也应该在相位监听器中吗?
    • @user1042646 我们通常在单击相应的菜单链接并开始对话时为特定的bean调用“reset”方法。这样做是为了准备新的转换,无论之前是否有过转换。
    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 2014-06-30
    • 2012-12-26
    • 2013-01-05
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多