【问题标题】:JSF managedbean has variables with different scopeJSF managedbean 具有不同范围的变量
【发布时间】:2013-03-16 08:05:20
【问题描述】:

我在 JSF managedbean 中有一些不同范围的变量(我觉得)。 在下面的 sn-p 中,userTable 用于 login()register() 方法。 但是 roleList 只在 register() 方法中使用。

userTable 应该在会话范围内,因为它应该可以在用户会话期间访问。

我觉得 roleList 不应该在会话范围内,因为它只会在注册页面期间填充在组合框中。我想请求范围就足够了。

但是由于 UserManagedBean 已经在会话范围内,我如何将 roleList 放入 requestScope 中。

非常感谢您的建议。

@Named("user")
@Scope("session")
public class UserManagedBean implements Serializable {

    private UserTable userTable = new UserTable(); 
    private List roleList = new ArrayList();

    public String login() {
     // login process here
    }

    public String register() {
     // register user here
    }

【问题讨论】:

  • 为什么不创建另一个请求范围的托管bean,并在注册页面中使用它?我认为,用户将使用一次注册页面进行注册
  • 你确定你真的需要在这个中注入另一个托管 bean 或者你正在考虑将 UserTable 作为你的业务逻辑类吗?
  • 我也在考虑。但是如果在一个方法中有两个不同范围的变量(例如在 register() 中)呢?
  • @Luiggi Mendoza UserTable 只是一个 POJO,没有业务逻辑。
  • 那就不用担心了。您在另一个内部没有托管 bean。请参阅Difference between managed bean and backing bean 了解什么是托管 bean。

标签: jsf scope javabeans managed


【解决方案1】:

至于具体问题,只需将 bean 分成 2 个单独的 bean。由于某些不清楚的原因,您显然是通过 Spring 而不是 JSF 或 CDI 管理 bean,因此您可以使用 @Autowired 将一个 bean 作为另一个 bean 的属性注入。

@Named
@Scope("request")
public class Login implements Serializable {

    private List<Role> roles;

    @AutoWired
    private User user;

    public String submit() {
         UserTable userTable = user.getTable();
         // ...
    }

    // ...
}
@Named
@Scope("session")
public class User implements Serializable {

    private UserTable table;

    // ...
}

如果您通过 JSF @ManagedBean 管理 bean,则可以使用 @ManagedProperty。如果您通过 CDI @Named 管理 bean,则可以使用 @Inject


回到具体的功能需求,

而且我觉得 roleList 不应该在会话范围内,因为它只会在注册页面期间填充在组合框中。我想请求范围就足够了。

这是一个很弱的理由。如果是我,我会把它放在应用程序范围内。无论如何,每个请求/会话的角色列表都是相同的,对吧?你不需要在每个请求上重新加载/重新填充它,除非你的内存占用非常非常低。

另见:

【讨论】:

  • 这是一个很好的答案。所以我应该把豆子分开。是否可以在单个 ManagedBean 中拥有具有不同范围的实例变量?我曾经认为登录、注册、注销功能都与 User 相关,所以我应该将所有这些功能放在一个 UserManagedBean 中。是否有任何好的做法来拆分功能和托管 bean?绝对 roleList 应该在我的案例的应用范围内。非常感谢。
  • 这是紧耦合。对于初学者,请根据&lt;h:form&gt; 使用单独的请求/视图范围 bean。它会自动以干净的代码结束。请注意,我已使用“如何选择正确的 bean 范围?”链接更新了我的答案,我建议您阅读一下。
  • 我在某处读到,通过在 Spring 中使用 JSR330,我可以在另一个 CDI 环境中重用该 managedbean。这就是我将 Spring 与 JSR330 混合的原因。你对此有何评论?
  • 对不起,反正我不使用 Spring。只是标准的 Java EE 堆栈。我只是使用 EJB 而不是 Spring 服务和 CDI 而不是 Spring DI 和 @Interceptor 而不是 Spring AOP。在 J2EE 时代,当 EJB 很糟糕且 CDI 不存在时,Spring 非常好。 Java EE 5/6 吸取了很多 Spring 的教训,使得 Spring 变得多余。更重要的是,现在 Spring 被认为是“遗产”。它甚至最终成为比 Java EE 更多的 XML 样板。
猜你喜欢
  • 2016-02-11
  • 2011-10-17
  • 2021-07-12
  • 2014-12-06
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
相关资源
最近更新 更多