我在JSF managedbean中有一些具有不同作用域的变量(我感觉)。在下面的代码片段中,userTable在login()和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?