9

我已经使用 JSF 和 PrimeFaces 实现了一个登录表单。我在 PrimeFaces 展示网站中使用了这个示例。

我有一个 Facelets 页面来显示一个数据表。现在我需要将上面的登录表单与这个表格页面整合起来。所以我在 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
        ...

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

4

1 回答 1

21

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

所以它在 EL 中可用如下:

#{user}

您可以只使用emptyEL 中的关键字来检查它是否存在(即是否已登录),您可以使用 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())) {

你为什么不只是SELECT ... FROM user WHERE username=? AND password=?在 SQL 中做一个?还是您不相信它返回正确行的数据库?

于 2012-10-24T10:57:09.290 回答