ognl表达式的小知识点
今天在做一个登录模块时,想再登录之后的首页上显示登陆者姓名,自然就想到在action里将登陆者姓名传入session中,然后在页面通过ognl提取信息,action代码如下:
1 if(us.getUser_name().equals(username)&&us.getPassword().equals(password)) 2 { 3 ActionContext.getContext().getSession().put("user_login",username);//将登陆信息放入actioncontext中 4 //ServletActionContext.getRequest().getSession().setAttribute("user_login",username); 5 return SUCCESS; 6 }
页面显示代码:
1 <div id="huanying"><s:property value="#user_login"/>,欢迎你!
然后,就出问题了……取不到值;
当时我就在想啊,session应该是在valueStack中的context中的,通过ognl的#+属性值的方法应该可以的啊,怎么也想不通。于是用request(用的是转发即默认,不是重定向)和context都试了一下,结果是只有放入context中的值才能被取出来。这就尴尬了,,,,开始,我还怀疑是值没存进session和request中,因此我用el表达式测了一下,完全没问题,所以我就想是不是自己的ognl写错了。结果一度娘,果然出了问题,ognl虽然可以提取所有值域中的值,但是如果是session或者request中的值就必须要加上相关的域名:
1 <s:property value="#session.user_login"/>//取存在sessiong中的值 2 <s:property value="#request.user_login"/>//取存在request中的值(前提是转发而不是非定向)
ognl默认是直接从context中取值,所以才出了问题。EL表达式是从四大作用域按从小到大的顺序取值。
哎……还是学艺不精啊。。。。。。不过问题虽然小,但也算是一种积累啦……