如何在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返回正确的行?