原文http://blog.sina.com.cn/s/blog_87216a00010137t0.htmlhtml
一、值栈的简单定义:安全
(1)简单的说,值栈是对应每个请求对象的轻量级的数据存储中心,在这里统一管理着数据,供Action、Result、Interceptor等Struts2的其余部分使用,这样数据被集中管理起来而不凌乱。session
(2)当有请求的时候,Struts2会为每一个请求建立一个新的值栈,也就是说,值栈和请求是一一对应的,不一样的请求,值栈也不同, 而值栈封装了一次请求全部须要操做的相关的数据。app
(3)正是由于值栈和请求的对应关系,所以值栈能保证线程安全的为每一个请求提供公共的数据存取服务。框架
(4)就是ROOT根对象,ognl访问值栈不用加任何的访问前缀,只需action中声明相应的属性,而且生成属性对应的set和get方法,页面中经过struts2标签就能够存放/取出值栈中的值,EL表达式${username}若是没有加访问范围,访问的也是值栈,这只是最简单的值栈应用线程
(5)值栈的特色:若是访问的值栈里有多个对象,且相同的属性在多个对象中同时出现,则值栈会按照从栈顶到栈底的顺序,寻找第一个匹配的对象。htm
二、actionContext(action上下文)的简单定义:对象
(1)ActionContext对象,非根对象,是Action运行的上下文,每一个ActionContext是一个基本的容器,包含着Aciton运行须要的数据,好比请求参数,会话等。blog
(2)ActionContext也是线程安全的,每一个线程都有一个独立的ActionContext,这样就不用担忧值栈中值得线程安全问题了。ci
(3)得到ActionContext对象的方式:
第一种,使用ActionContext自身的方法来获取: ActionContext ctx = ActionContext.getContext();
第二种,使用ActionInvocation来获取:ActionContext ctx = actionInvocation.getInvocationContext();
(4)ActionContext里面存储着不少值:
a:Request的Parameters,请求中的参数,注意这里的数据是从数据对象中复制来的,所以这里的数据的变化是不会影响到请求对象里面的参数的值的。
b:Request的Attribute,请求中的属性,这里是一个Map,存放着请求对象的属性数据,这些数据和请求对象的Attribute是联动的。
c:Session的Attribute,会话中的助兴,这里是一个Map,存放着会话对象的属性数据,这些数据和会话对象的attribute是联动的。
d:Application的Attribute,应用的属性,这里是一个Map,存放着应用对象的属性数据,这些数据和应用对象的attribute是联动的。
e:attr,在全部的属性范围中获取值,依次搜索page, request, session 和applicaion
(5)ongl表达式取出action上下文中的值:
因为Struts2框架把OGNLContext设置为ActionContext,还把表明application、session、request这些对象的Map对象也放到ActionContext中去。
又由于ActionContext为非根对象,因此OGNL表达式访问ActionContext(action上下文)里面的application、session、request、attr对象中的值时,
须要加访问前缀#,以便告诉OGNL,寻值不是从根对象中,而是从action上下文的其余对象中寻找
三、再补充一下EL表达式与ognl表达式从值栈与actionContext中取值的方式对比:
(1)EL表达式:
取值栈:
取actionContext:
(2)ognl表达式:
取值栈:
去actionContext: