Struts2的值栈深入理解

对Struts2这个框架用了很久,最近开发遇到一个关于值栈的问题,所以决定深入研究一下,

我们要知道OGNL只是显示数据的表达式语言

ValueStack值栈:存储数据的

研究源码:得到如下的理解

 

往对象栈(CompoundRoot extends ArrayList)中放数据

        //把departmentList放入到了对象栈的栈顶
        //ActionContext.getContext().getValueStack().push(departmentList);
        //把departmentList放入到了对象栈的栈顶
        //ActionContext.getContext().getValueStack().getRoot().add(0, departmentList);
        //把departmentList放入到了对象栈的栈底
        //ActionContext.getContext().getValueStack().getRoot().add(departmentList);
        //获取对象栈的栈顶的元素
        //ActionContext.getContext().getValueStack().peek();
        //移除对象栈的栈顶的元素
        //ActionContext.getContext().getValueStack().pop();
        //移除对象栈的栈顶的元素
        //ActionContext.getContext().getValueStack().getRoot().remove(0);
        //把一个map放入到对象栈的栈顶
        //ActionContext.getContext().getValueStack().set(key, o);      

* 对象栈的说明
         *    *  处于对象栈的对象中的属性是可以直接访问的
         *    *  如果在对象栈中有一样名称的属性,从栈顶开始查找,直到找到为止
         *    *  一般情况下,回显的数据应该放在对象栈中,这样效果比较高
         *    *  用ognl表达式访问对象栈,直接属性名称就可以了,不用加#

向map栈存放数据的方法

 

说明
         *   *  reuqest,session,application都在map栈中
         *   *  可以把一个对象放入到map中
         *   *  ognl表达式访问map栈中的内容
         *       如果一个对象在request中
         *          #request.对象的key值.属性
         *       如果一个对象直接放入到map中
         *          #对象的key值.属性
         *       把一个对象放入到map栈中,是不能直接访问该对象的属性

//#request.deparmentList
        //ServletActionContext.getRequest().setAttribute("departmentList", departmentList);

 list中含有list
//        List<List<Department>> lists = new ArrayList<List<Department>>();
//        Department department1 = new  Department();
//        department1.setDname("department1_name");
//        Department department2 = new  Department();
//        department2.setDname("department2_name");
//        List<Department> departmentList1 = new ArrayList<Department>();
//        departmentList1.add(department1);
//        List<Department> departmentList2 = new ArrayList<Department>();
//        departmentList2.add(department2);
//        lists.add(departmentList1);
//        lists.add(departmentList2);
//         list中含有map
//        List<Map<String, Department>> lists2 = new ArrayList<Map<String,Department>>();
//        Map<String, Department> map1 = new HashMap<String, Department>();
//        map1.put("d1", department1);
//        Map<String, Department> map2 = new HashMap<String, Department>();
//        map2.put("d2", department2);
//        lists2.add(map1);
//        lists2.add(map2);
//          map中含有list
//        Map<String, List<Department>> maps = new HashMap<String, List<Department>>();
//        maps.put("list1", departmentList1);
//        maps.put("list2", departmentList2);
//        ActionContext.getContext().put("maps", maps);

 

总结:    *  ValueStack是ognl存放数据的对象  

               *  得到ValueStack有三种方案          

                ActionContext.getContext().getValueStack()          

                 ServletActionContext.getValueStack(request);        

                request.getAttribute("struts.valueStack");    

*  ValueStack作用域为request    

*  当action创建的时候,ValueStack就创建了,当action被销毁时,ValueStack就销毁了

   *  ValueStack可以利用对象栈和map栈存放数据    

*  向对象栈中存放数据        

 ActionContext.getContext().getValueStack().push  栈顶   对象      

   ActionContext.getContext().getValueStack().add()  栈底  对象        

 ActionContext.getContext().getValueStack().add(index,object);

按照指定的位置存放在对象栈中          

ActionContext.getContext().getValueStack().set()  栈顶   Map    

*   向map栈中        

  request,session,application   setAttibute()   map-->_values--->requst,session,application          

ActionContext.getContext().put(key,value)  直接存放在map栈中

如何利用ognl表达式取ValueStack中的数据

* <s:property/>去栈顶的元素

* <s:iterator/> 取栈顶的元素

* s:iterator标签的value属性的值无论来自对象栈还是map栈,都可以不加#,s:select标签也适合

* 在s:iterator标签迭代的时候,把当前正在迭代的元素放入到栈顶

属性驱动:    

*  在action中,有属性,属性的名称和页面上form表单中的name的值对应    

*  属性必须有set和get方法  

 *  原理          在提交一个请求以后,action中的属性在栈顶。ParametersInterceptor拦截器          会把页面上的form表单的值获取,然后调出ValueStack,给栈顶的属性赋值。

模型驱动    *  StudentAction implements ModelDriver<Student>    *  在action中需要有一个私有的对象          private Student model = new Student();    *  原理         *  先经过ModelDriverInterceptor,作用是把model放入到栈顶         *  再经过ParametersInterrceptor,把栈顶的属性赋值     这两个拦截器不能颠倒执行

 

 

 

 

 

 

 

     <!-- 
                iterator说明
                  *  当前正在迭代的元素在栈顶
                  *  如果value属性不写,则默认迭代栈顶的元素
                  *  value值如果为top,则也是迭代栈顶的元素

             -->

<!-- 
                 list中含有list
              -->
              <!-- 
              <s:iterator>
                  <s:iterator>
                      <s:property value="dname"/>
                  </s:iterator>
              </s:iterator>
               -->
              <!-- 
                  list中含有map
               -->
               <!-- 
               <s:iterator value="#list">
                     <s:iterator value="top">
                         <s:property value="key"/>
                         <s:property value="value.dname"/>
                     </s:iterator>
               </s:iterator>
                -->
                <!-- 
                    map中含有list
                 -->
                 <!-- 
                 <s:iterator value="#maps">
                     <s:property value="key"/>
                     <!-- 
                         该迭代就是一个list
                      -->
                    <!-- 
                     <s:iterator value="value">
                         <s:property value="dname"/>
                     </s:iterator>
                 </s:iterator>
                  -->

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值