【问题标题】:Accessing one managed bean from another从另一个访问一个托管 bean
【发布时间】:2011-11-04 11:23:53
【问题描述】:

我有一个简单的授权页面,旨在让用户输入登录名和密码。根据用户输入的结果,我定义要显示的下一页。我在 db 中有一个表,其中包含 id、用户的登录名和密码以及用户的角色,因此将根据将从与输入的登录名和密码对应的记录的角色字段中检索到的信息来定义下一页。但是我在 db 中有一个表,其中包含一种用户的所有用户信息(大约 10 个字段)和另一个表,其中包含有关另一种用户类型的信息(4 个字段)。所以我的数据库有这样的结构:

Table 1:
  id
  login
  pass
  role

Table 2:
  id(reference to id of table 1)
  other fields....

Table 3:
  id(reference to id of table 1)
  other info....

我认为我的应用程序必须有一个托管 bean(requestScope) 来进行授权,该授权需要登录名和密码。该 bean 将具有用于提交授权表单的操作控制器。在该动作控制器中,我必须确定用户的角色,并根据该信息为具体类型的用户创建一个会话范围的托管 bean(应用程序将为不同类型的用户提供单独的托管 bean)。此外,我在该动作控制器中为用户(用户的 id)的会话范围 bean 的实例化传递特定信息。但是我可以简单地在请求范围托管bean的操作方法中建立一个会话范围托管bean(在new运算符的帮助下)吗?另外,我如何在另一个会话范围 bean 中使用一个会话范围 bean 的方法(假设我创建了 2 个会话范围托管 bean,它们负责不同的服务,我如何在另一个会话范围内调用方法)。 也许所描述的方法不适合这样的问题?如果是这样,您能否就更好的设计方法提出建议?

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

    从另一个访问一个托管 bean

    要直接回答这个问题,您通常使用@ManagedProperty 将一个托管bean 注入另一个托管bean。是的,它会自动创建 bean,但这应该特别便宜。


    但是我可以简单地在请求范围托管 bean 的操作方法中实例化一个会话范围托管 bean(在 new 运算符的帮助下)吗?

    是的,这是可能的。只需将其存储在 ExternalContext#getSessionMap() 中,并使用托管 bean 名称作为键。

    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.getSessionMap().put("bean", new Bean());
    

    它将由#{bean} 等提供。这是否是一个好方法是第二个。


    至于您的具体功能要求。我认为只有一个会话范围的托管 bean 具有所需的数据作为属性要好得多。例如,您可以检查 User 属性是否不是 null 以确定用户是否已登录。您可以在此答案中找到一个 bean 示例:Programmatically control login with Servlet 3.0

    【讨论】:

    • 感谢您的回答。我已经看过您的示例,但是当系统中的角色不止一个时,这会是一个好方法吗?在这样的解决方案中,UserManger bean 必须为每种可用的角色类型提供类变量,并且在会话中只使用这个变量中的一个。同样,这样的 bean 将具有相应数量的 isLoggedIn 方法。另一个陷阱是 User 类可能有很多字段,如果一次有很多用户(每个用户都有自己的会话)服务器将没有那么多内存。那么在会话中只存储用户 ID 会更好吗?
    • User一个Set<Role>的属性。至于内存问题,让 JPA(或您使用的任何东西)懒惰地获取嵌套属性,如 UserDetail 或其他东西。
    • 不同的用户有不同的属性怎么办?例如。第一个用户可能只有姓名和姓氏作为属性,另一个用户可能具有诸如preferredLanguage 或schoolNumber 等属性。每种类型的用户都有自己的一对 getter/setter。如果仅用户类(具有 Set 属性)负责特定信息,它将有大量的 getter/setter 和大量代码用于在每个方法中确定角色
    猜你喜欢
    • 2013-02-27
    • 1970-01-01
    • 2012-09-03
    • 2012-03-24
    • 1970-01-01
    • 2012-12-26
    • 2016-12-26
    • 2015-04-23
    • 2012-05-22
    相关资源
    最近更新 更多