Struts2的值栈深入理解

2023-12-16 22:38
文章标签 深入 理解 struts2 值栈

本文主要是介绍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>
                  -->

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

这篇关于Struts2的值栈深入理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/502135

相关文章

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

MySQL数据库约束深入详解

《MySQL数据库约束深入详解》:本文主要介绍MySQL数据库约束,在MySQL数据库中,约束是用来限制进入表中的数据类型的一种技术,通过使用约束,可以确保数据的准确性、完整性和可靠性,需要的朋友... 目录一、数据库约束的概念二、约束类型三、NOT NULL 非空约束四、DEFAULT 默认值约束五、UN

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

一文带你深入了解Python中的GeneratorExit异常处理

《一文带你深入了解Python中的GeneratorExit异常处理》GeneratorExit是Python内置的异常,当生成器或协程被强制关闭时,Python解释器会向其发送这个异常,下面我们来看... 目录GeneratorExit:协程世界的死亡通知书什么是GeneratorExit实际中的问题案例

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的