Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何访问Facelets页面中的会话属性_Java_Jsf_Session_Login_Facelets - Fatal编程技术网

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

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

我已经使用JSF和PrimeFaces实现了一个登录表单。 我在PrimeFaces showcase网站上使用过

我有一个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
        ...
如果用户未登录,我需要从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注入攻击漏洞。使用事先准备好的陈述。