java – 如何在Facelets页面中访问会话属性
作者:互联网
我已经使用JSF和PrimeFaces实现了一个登录表单.
我在PrimeFaces展示网站上使用了this example.
我有一个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组件的呈现属性来指示是否生成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.* imports.
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("user", username);
与具体问题无关,为什么以下检查?
if (username.equals(getUsername_db()) && password.equals(getPassword_db())) {
你为什么不做一个SELECT … FROM用户WHERE用户名=?和密码=?在SQL?或者你不相信它返回右行的数据库?
标签:java,session,jsf,login,facelets 来源: https://codeday.me/bug/20190927/1822399.html