ValueStack对象

    xiaoxiao2021-03-25  118

    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变量。

     

    CompoundRoot root;     是继承ArrayList的对象栈

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

    对象栈分析

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

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

     

     

     

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

     

     

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

    Map栈分析

     

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

     

    ValueStack总结

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

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

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

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

     

     

     

    思考

           放在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

            }      

    转载请注明原文地址: https://ju.6miu.com/read-24764.html

    最新回复(0)