1、什么是值栈?
* 值栈相当于Struts2框架的数据的中转站,向值栈存入一些数据,从值栈中获取到数据。
* ValueStack 是 Struts2 提供的一个接口,实现类 OgnlValueStack --- 值栈对象(OGNL是从值栈中获取数据的)
* Action是多例的,有一个请求,创建Action实例,创建一个ActionContext对象,代表的是Action的上下文对象,还会创建一个ValueStack对象。
* 每个Action实例都有一个ValueStack对象(一个请求对应一个ValueStack对象)
* 在其中保存当前Action对象和其他相关对象
* Struts框架把ValueStack对象保存在名为”struts.valueStack“的请求属性中,request中(值栈对象是request的一个属性)
> ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack");
2、值栈的内部结构
* 值栈由两部分组成
> root --- Struts把动作和相关对象压入 ObjectStack中 --> List
> context --- Struts把各种各样的映射关系(一些Map类型的对象)压入ContextMap中
* Struts会默认把下面这些映射压入ContextMap(Context)中
注意:request代表的是Map集合的key值,value的值其实也是一个Map集合。
> parameter:该Map中包含当前请求的请求参数 ?name=xxx&password=111
> request :该Map中包含当前request对象中的所有属性
> session :该Map中包含当前session对象中的所有属性
> application:该Map中包含当前application对象中的所有属性
> attr :该Map按照顺序来检索某个属性: request、session、application
* ValueStack中存在root属性(CompoundRoot)、context属性(OgnlContext)
> CompoundRoot 就是ArrayList
> OgnlContext 就是Map
* context 对应Map引入root 对象
> context中还存在request、session、application、attr、parameters 对象引用
> OGNL表达式访问值栈中的数据
* 访问root 中数据时,不需要 #
* 访问 request、session、application、attr、parameters 对象数据 必须写 #
> 操作值栈 默认指的是 操作root
3、值栈对象的创建,ValueStack 和 ActionContext 是什么关系?
* 值栈对象是请求时创建的
* ActionContext 是绑定到当前的线程上,那么在每个拦截器或者Action中获取到的ActionContext是同一个
* ActionContext中存在一个Map集合,该Map集合和ValueStack的context是同一个地址
* ActionContext中可以获取到ValueStack的引用,开发的时候,使用ActionContext来获取值栈对象
4、如何获取值栈对象
三种方法:
> ValueStack vs1 = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");
> ValueStack vs2 = (ValueStack) ServletActionContext.
getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
> ValueStack vs3 = (ValueStack) ActionContext.getContext().getValueStack();
5、向值栈保存数据(主要针对root 栈)
* valueStack.push(Object obj):
> push方法的底层调用root对象的push方法(把元素添加到0位置)
* valueStack.set(String key, Object obj):
> 源码获取Map集合(map有可能已经存在,有可能是新创建的),把map集合push到栈顶,再把数据存入到map集合中
* 在jsp中 通过 <s:debug /> 查看值栈内容