Struts2值栈内部结构详解
通过教程《值栈是什么》的学习,读者对值栈的知识已经有了一定的了解。为了让初学者更好地理解值栈,本节将讲解值栈的内部结构。
ValueStack 对象的内部有两个逻辑部分。
了解了 ValueStack 对象的内部组成后,下面通过运行项目查看 ValueStack 中的信息。
首先,在 struts2Demo05 项目的 com.mengma.ognl 包中新创建一个名称为 ValueStackAction 的类,并在类中编写一个获取 ValueStack 对象的方法,如下所示。
图 1 valueStack结构
在图 1 所示的 ValueStack 结构中,只需关注 context 对象和 root 对象。从图 1 中可以看到,context 对象的类型为 OgnlContext,root 对象的类型为 CompoundRoot。如果要查看这两个类的源码,则可以看到如下语句:
一般情况下,root 对象在存储 Action 的相关信息时会把相关的映射压入 ContextMap 中,这些相关的映射具体如下。
需要注意的是,在 context 对象中包含了 root 对象,从 context 对象的结构中就可以查看到相关信息,具体如图 2 所示。
图 2 context对象结构
从图 2 中可以看到 context 对象中的 root 对象,这也就证明了 context 对象中包含了 root 对象,并且该对象的类型为 CompoundRoot。
ValueStack 对象的内部有两个逻辑部分。
- ObjectStack(对象栈):是 CompoundRoot 类型,用 ArrayList 定义,Struts2 把动作和相关对象压入 ObjectStack 中。
- ContextMap(Map 栈):是 OgnlContext 类型,是一个 Map 集合,Struts2 把各种各样的映射关系(一些 Map 类型的对象)压入 ContextMap 中。
了解了 ValueStack 对象的内部组成后,下面通过运行项目查看 ValueStack 中的信息。
首先,在 struts2Demo05 项目的 com.mengma.ognl 包中新创建一个名称为 ValueStackAction 的类,并在类中编写一个获取 ValueStack 对象的方法,如下所示。
package com.mengma.ognl; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.util.ValueStack; public class ValueStackAction extends ActionSupport { public String execute() throws Exception { // 通过ActionContext获取valueStack对象 ValueStack valueStack = ActionContext.getContext().getValueStack(); System.out.println(valueStack); return SUCCESS; } }然后,将新建的 Action 信息添加到 struts.xml 中,所添加的代码如下所示:
<action name="valueStack" class="com.mengma.ognl.ValueStackAction"> <result name="success">index.jsp</result> </action>最后,在 ValueStackAction 类中的第 11 行处设置断点,以 Debug 模式启动项目。在浏览器的地址栏中输入地址 http://localhost:8080/struts2Demo05/valueStack.action后,MyEclipse 会进入 Debug 模式。从 Variables 窗口中可以看到 valueStack 的结构信息,如图 1 所示。
图 1 valueStack结构
在图 1 所示的 ValueStack 结构中,只需关注 context 对象和 root 对象。从图 1 中可以看到,context 对象的类型为 OgnlContext,root 对象的类型为 CompoundRoot。如果要查看这两个类的源码,则可以看到如下语句:
OgnlContext extends Object implements Map
CompoundRoot extends ArrayList
一般情况下,root 对象在存储 Action 的相关信息时会把相关的映射压入 ContextMap 中,这些相关的映射具体如下。
- parameters:该 Map 中包含当前请求的请求参数。
- request:该 Map 中包含当前 request 对象中的所有属性。
- session:该 Map 中包含当前 session 对象中的所有属性。
- application:该 Map 中包含当前 application 对象中的所有属性。
- attr:该 Map 按如下顺序检索某个属性:request,session,application。
需要注意的是,在 context 对象中包含了 root 对象,从 context 对象的结构中就可以查看到相关信息,具体如图 2 所示。
图 2 context对象结构
从图 2 中可以看到 context 对象中的 root 对象,这也就证明了 context 对象中包含了 root 对象,并且该对象的类型为 CompoundRoot。
所有教程
- socket
- Python基础教程
- C#教程
- MySQL函数
- MySQL
- C语言入门
- C语言专题
- C语言编译器
- C语言编程实例
- GCC编译器
- 数据结构
- C语言项目案例
- C++教程
- OpenCV
- Qt教程
- Unity 3D教程
- UE4
- STL
- Redis
- Android教程
- JavaScript
- PHP
- Mybatis
- Spring Cloud
- Maven
- vi命令
- Spring Boot
- Spring MVC
- Hibernate
- Linux
- Linux命令
- Shell脚本
- Java教程
- 设计模式
- Spring
- Servlet
- Struts2
- Java Swing
- JSP教程
- CSS教程
- TensorFlow
- 区块链
- Go语言教程
- Docker
- 编程笔记
- 资源下载
- 关于我们
- 汇编语言
- 大数据
- 云计算
- VIP视频