Java 如何访问Facelets页面中的会话属性
我已经使用JSF和PrimeFaces实现了一个登录表单。 我在PrimeFaces showcase网站上使用过 我有一个Facelets页面来显示数据表。现在我需要将上面的登录表单与这个表页面集成。所以我在LoginBean.java中添加了几行代码来处理会话属性Java 如何访问Facelets页面中的会话属性,java,jsf,session,login,facelets,Java,Jsf,Session,Login,Facelets,我已经使用JSF和PrimeFaces实现了一个登录表单。 我在PrimeFaces showcase网站上使用过 我有一个Facelets页面来显示数据表。现在我需要将上面的登录表单与这个表页面集成。所以我在LoginBean.java中添加了几行代码来处理会话属性 if (username.equals(getUsername_db()) && password.equals(getPassword_db())) {//valid user and paward
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输出
欢迎{user},您已登录
在隐藏表列的特定情况下,只需按如下方式使用它:
#{user}
...
存储会话属性的更好方法是使用ExternalContextgetSessionMap。这样,您的代码就没有了臭的javax.servlet.*导入
与具体问题无关,为什么要进行以下检查
if (username.equals(getUsername_db()) && password.equals(getPassword_db())) {
你为什么不做一个选择。。。来自用户名=?密码=?在SQL中?或者您不相信DB返回正确的行吗?谢谢BalusC。但是我在视图中将用户作为一个对象。像这样的事情表明User@1a8b71e. 不管怎样,我从你的答案中得到了一部分来解决我的问题。我删除了会话设置部分,并将LoginBean类设置为SessionScoped。我可以直接在我的panelGroup标记中获取值。再次感谢SQL的建议。我用预先准备好的语句修改了它。显然,代码中显示的用户名根本不是字符串。也许你把问题中的代码过于简化了?顺便说一句,SQL注释并不是要暗示准备好的语句。您将在DB中比较用户名和密码两次,然后在Java中比较另一次。这毫无意义。只需检查DB是否返回了一条记录,仅此而已。您不需要再次比较您已经要求DB检查并返回的用户名/密码。明白了!但在我的上一个sql查询中,我只使用了带有Where子句的用户名。比如:字符串查询=选择用户名,用户名为“+uname+”的用户的密码;所以我可以删除username.equalsgetUsername\u db部分。我只需要检查密码在这种情况下。。。谢谢你的建议。这也没有意义。只需将密码添加到WHERE。SQL查询的编写方式应始终确保它能够准确地返回所需的数据,而无需事后进行任何必要的额外检查。顺便说一句,像这样的字符串将用户控制的输入连接到SQL字符串中,会打开一个巨大的SQL注入攻击漏洞。使用事先准备好的陈述。