JSF managedbean具有不同范围的变量

时间:2013-03-26 13:42:31

标签: jsf scope javabeans managed

我在JSF managedbean中有一些变量具有不同的范围(我觉得)。 在以下代码段中, login() register()方法中使用 userTable 。 但 roleList 仅用于register()方法。

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

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

但是我如何将roleList放在requestScope中,因为UserManagedBean已经在会话范围内了。

非常感谢任何建议。

@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
    }

1 个答案:

答案 0 :(得分:0)

关于具体问题,只需将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不应该在会话范围内,因为它只会在注册页面的组合框中填充。我想请求范围就足够了。

这是一个非常弱的原因。如果是我,我会把它放在应用范围内。无论如何,角色列表对于每个请求/会话都是相同的,对吧?然后,您不需要在每个请求上重新加载/重新填充它,除非您的内存占用非常非常少。

另见: