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

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

我有一个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页面中访问会话属性?

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

因此它在EL中可用如下:

 #{user} 

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

  

Welcome #{user}, you have been logged in!

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

  ...  

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

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

具体问题无关 ,为什么以下检查?

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

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