我的应用主页上有以下代码段:
<h:panelGroup rendered="#{loginBean.loggedIn}">
<p>Welcome, #{loginBean.currentUser.firstName}</p>
</h:panelGroup>
LoginBean是@SessionScoped
。由于它在主页上被引用,因此在页面加载时将创建相同的实例。
现在,假设用户从不登录。在这种情况下,我的LoginBean没有用,因为它不会保存有关用户的任何信息。这不是多余的吗?
我不是说这会导致问题,但我只是想知道不必要的实例化会占用内存空间。
答案 0 :(得分:1)
使#{loginBean}
请求/视图作用域,并在成功登录时手动将用户置于会话范围内。会话范围可由ExternalContext#getSessionMap()
以地图形式提供。
@ManagedBean
@ViewScoped
public class LoginBean {
public void login() {
// ...
if (user != null) {
externalContext.getSessionMap().put("user", user);
}
// ...
}
}
这样你就可以逃脱
<h:panelGroup rendered="#{not empty user}">
<p>Welcome, #{user.firstName}</p>
</h:panelGroup>