如果不使用,则阻止创建SessionScoped bean

时间:2013-01-08 12:45:39

标签: jsf-2

我的应用主页上有以下代码段:

<h:panelGroup rendered="#{loginBean.loggedIn}">
    <p>Welcome, #{loginBean.currentUser.firstName}</p>
</h:panelGroup>

LoginBean是@SessionScoped。由于它在主页上被引用,因此在页面加载时将创建相同的实例。

现在,假设用户从不登录。在这种情况下,我的LoginBean没有用,因为它不会保存有关用户的任何信息。这不是多余的吗?

我不是说这会导致问题,但我只是想知道不必要的实例化会占用内存空间。

1 个答案:

答案 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>

另见: