值栈:能够线程安全地为每个请求提供公共的数据存取服务。Struts2会为每次请求创建一个新的值栈,值栈和请求是一一对应的,不同的请求,值栈也不一样,而值栈封装了一次请求所有需要操作的相关的数据
值栈分类:
狭义值栈:通常指实现com.opensymphony.xwork2.util.ValueStack接口的对象,目前就是com.opensymphony.xwork2.ognl.OgnlValueStack对象,狭义值栈存放OGNL可以存取访问的数据:
- Action的实例,可以通过OGNL访问Action中的属性
- OGNL表达式运算的值,可以设置到值栈中,可以主动访问值栈对象,强行设置
- OGNL表达式产生的中间变量
广义值栈:指的是ActionContext的对象,ActionContext是Action运行的上下文,每个ActionContext是一个基本的容器,包含着Acttion运行需要的数据,比如请求参数、会话等。
ActionContext是线程安全的,每个线程都有一个独立的ActionContext,这样就不用担心值栈中值的线程安全问题了。ActionContext里面存放有很多的值,典型如下:
- Request的parameters:请求中的参数,要注意这里的数据是从请求对象中复制出来的,因此这里数据的变化是不会影响到请求对象里面的参数的值的
- Request的Attribute:请求中的属性,这里其实是一个Map,存放着请求对象的属性数据,这些数据和请求对象的Attribute是连动的
- Session的Attribute:会话中的属性,这里其实是一个Map,存放着会话对象的属性数据,这些数据和会话对象的Attribute是连动的
- Application的Attribute:应用中的属性,这里其实是一个Map,存放着应用对象的属性数据,这些数据和应用对象的Attribute是连动的
- Value Stack:也就是狭义值栈,ActionContext以value stack作为被OGNL访问的根,简单地说,OGNL在没有特别指明的情况下,访问的就是value stack里面的数据
- attr:在所有的属性范围中获取值,一次搜索page,request,session,application
ActionContext的使用:
(1)获取
- ActionContext ctx = ActionContext.getContext();
- ActionContext ctx = actionInvocation.个体InvocationContext();
(2)使用:ActionContext主要的功能是用来存放数据的,典型的方法如下:
- get(String key):根据keycongActionContext当前的存储空间里面获取相应的值
- put(String key,Object value):把值存储在ActionContext的存储空间里面
- Map<String,Object> getAppliaction():返回ServletContext中存储的值
- Map<String,Object> getSession():返回HttpSession中存储的值
- Map<String,Object> getContextMap():返回当前context存储的值
- Map<String,Object> getParameters():返回HttpServletRequest()对象里面存储的参数
- Value Stack 个体ValueStack():获取OGNL的值栈