如何在Facelets页面中访问会话属性

时间:2012-10-24 10:33:54

标签: java jsf session login facelets

我已经使用JSF和PrimeFaces实现了一个登录表单。 我在PrimeFaces展示网站上使用了this example

我有一个Facelets页面来显示dataTable。现在我需要将上面的登录表单与此表页面集成。所以我在LoginBean.java中添加了几行来处理会话属性。

     if (username.equals(getUsername_db()) && password.equals(getPassword_db())) {//valid user and paward
        loggedIn = true;
        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Welcome", getUsername_db());
        //new lines
        FacesContext context2 = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context2.getExternalContext().getSession(true);
        session.setAttribute("user", username);
        //end of new lines
        ...

如果用户未登录,我需要隐藏dataTable中的列。 现在我的问题是,如何在Facelets页面中访问会话属性?

1 个答案:

答案 0 :(得分:16)

您已将登录用户存储为名为“user”的会话属性。

所以它在EL中可用如下:

#{user}

您可以在EL中使用empty关键字来检查它是否存在(即它是否已登录)并且您可以使用JSF组件的rendered属性来指示是否生成是否输出HTML。

<h:panelGroup rendered="#{not empty user}">
    <p>Welcome #{user}, you have been logged in!</p>
</h:panelGroup>

在隐藏表列的特定情况下,只需按如下方式使用它:

<p:column rendered="#{not empty user}">
    ...
</p:column>

存储会话属性的更好方法是使用ExternalContext#getSessionMap()。这样您的代码就没有臭javax.servlet.*个导入。

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("user", username);

无关到具体问题,为什么要进行以下检查?

if (username.equals(getUsername_db()) && password.equals(getPassword_db())) {

为什么不在SQL中执行SELECT ... FROM user WHERE username=? AND password=??或者你不相信DB返回正确的行吗?