【Struts】ValueStack对象

ValueStack对象

ValueStack, 即值栈对象。

是整个struts数据存储的核心,或者叫中转站。

用户每次访问strutsaction,都会创建一个Action对象、值栈对象、ActionContext对象;然后把Action对象放入值栈中;最后再把值栈对象放入request中,传入jsp页面。

(key: struts.valueStack); 开发者只需要通过ActionContext对象就可以访问struts的其他的关键对象。(ActionContext是给开发者用的,便于学习与使用。)

 

ValueStack

       ValueStack实际是一个接口,Struts2中利用OGNL时,实际上使用的是实现了该接口的OgnlValueStack,这个类是Struts2利用OGNL的基础。

 

ValueStack特点

        ValueStack贯穿整个 Action 的生命周期(每个 Action 类的对象实例都拥有一个ValueStack 对象). 相当于一个数据的中转站在其中保存当前Action 对象和其他相关对象.

        Struts2框架把 ValueStack 对象保存在名为 “struts.valueStack” 的request请求属性中。

 

ValueStack存储对象

        ObjectStack: Struts  把动作和相关对象压入 ObjectStack --List

        ContextMap: Struts 把各种各样的映射关系(一些 Map 类型的对象压入 ContextMap

 Struts 会把下面这些映射压入 ContextMap 

     parameters:  Map 中包含当前请求的请求参数

     request:  Map 中包含当前 request 对象中的所有属性

     session:  Map 中包含当前 session 对象中的所有属性

     application:  Map 中包含当前 application  对象中的所有属性

     attr:  Map 按如下顺序来检索某个属性: request, session, application

 

ValueStack获取

方法1

      HttpServletRequest request = ServletActionContext.getRequest();

      ValueStack vs= (ValueStack)request.getAttribute("struts.valueStack");

 

    方法2

       ActionContext ac = ActionContext.getContext();

       ValueStack vs2= ServletActionContext.getContext().getValueStack();

       直接输出类引用变量可见值栈类 com.opensymphony.xwork2.ognl.OgnlValueStack

 

ValueStack分析

      在获取值栈的代码处添加断点查看

       vs变量。

 【Struts】ValueStack对象

CompoundRoot root;     是继承ArrayList的对象栈

Map<String, Object> context;  是实现MapMap

对象栈分析

      默认的对象栈第一个索引存储的是当前的Action

      使用以下代码往对象栈中添加基本数据和对象数据分析存储原理

 【Struts】ValueStack对象

 【Struts】ValueStack对象

 

使用Struts2标签<s:debug>标签在页面中查看对象栈(值栈)

 

 

由于是对象栈是ArrayList集合,因此可以根据索引插入来改变插入数据的位置。

Map栈分析

 【Struts】ValueStack对象

 Map栈中主要存储的是域变量属性值。

【Struts】ValueStack对象

【Struts】ValueStack对象

 

ValueStack总结

        值栈以struts.valueStack的名字存储在request请求中,值栈主要包含两个栈:对象栈和Map栈。

        对象栈存储的是用户的基本数据和对象数据 ;

Map栈主要存储的是域对象属性。

        用户每次一个请求就一个Action实例,对应一个值栈对象。

 

 【Struts】ValueStack对象

 【Struts】ValueStack对象

思考

       放在request中的值栈中可以存储sessionservletContext域数据,显然request的作用于没有那么大?直接使用拷贝的方式以key=value的方式拷贝到Map栈对应的Map中。

 

Map栈中的_root

       debug可见该属性中引用的是对象栈数据。如果在Map栈中不存储_root对于对象栈的引用,那么开发者需要访问数据时候首先要区分是访问对象栈还是Map栈,比较繁琐。因此以后操作数据直接操作Map栈即可。

 

源码分析

      public class OgnlContext extends Object implements Map{

               private Object _root; // 对象栈引用

               private Map _values = new  HashMap(23); // Map

        }      


转自: http://blog.****.net/qq_35448976/article/details/61208080