JSF managedbean具有不同作用域的变量



我在JSF managedbean中有一些具有不同作用域的变量(我感觉)。在下面的代码片段中,userTablelogin()register()方法中都使用了。但是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
    }

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

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

参见:

  • 如何选择合适的bean scope?

相关内容

  • 没有找到相关文章

最新更新