1.什么是ValueStack

对于每一个action的调用,Struts在执行相应的动作方法之前会先创建一个名为ValueStack的对象。Value Stack用来保存该动作对象或者对象。由于最终在执行Action类相应的action方法之前,拦截器需要先访问ValueStack。视图也需要访问ValueStack。Struts框架将其保存在一个名为struts.valueStack的请求属性中。

2.获取valueStack的三种方法:

 ValueStack v1 = ActionContext.getContext().getValueStack();
ValueStack v2 = ServletActionContext.getValueStack(ServletActionContext.getRequest());
ValueStack v3 = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

打印其HashCode码一模一样。 
说明: 
1、 值是一样的,说明只有一个对象 
2、 因为有一种是从request域中获取的,所以是一次请求

3.ValueStack的内容

valueStack分为对象栈(Object Stack)和Map栈(Context Map).

Struts将把动作和相关对象压入Object Stack,而把各种各样的映射关系压入Context Map。

通常说的ValueStack就是指Object Stack,它是一个真正数据结构意义的栈。Object Stack也常常被称为root(其实是一个ArrayList)。Context Map我们一般称其为context(是一个HashMap)它是整个OGNL其中包括了root

4.OGNL中的两种对象

OGNL中包含两种对象,即_root和_value. 
_value即:request, session, application, parameters, attr等命名对象,但这些命名对象都不是根。 
_root即:当前请求的Action实例等 
“根”对象和普通命令对象的区别在于: 
“根”对象(root) 对象栈: 实际上是 CompoundRoot 类型, 是一个使用 ArrayList 定义的栈. 里边保存各种和当前 Action 实例相关的对象(如果这个Action实例包括域对象的话域对象会进root).是一个数据结构意义的栈.

1)访问Context Map里的对象需要在对象名之前添加 # 
2)访问Object Stack对象的属性时,可以省略#而直接通过属性名来搜索

说明: 
从上图中也可以看出valueStack总共分为两个部分:

      对象栈:root (CompoundRoot类)
Map栈:_values和_root (OgnlContext 类)

5.Struts会把当前访问的Action实例压入值栈栈定

压入时间点为: 
由于Struts2最后终将调用Action类中的action方法。但在调用此方法之前:

*先创建一个StrutsActionProxy (ActionProxy默认实现的子类) 
*在创建StrutsActionProxy之后,对其进行初始化,把Action对象压入值栈

在调用该方法前该Action被压入栈顶,如果在初始化的过程中,在Action的构造函数中又初始化了其他类,这这个类也会被压入值栈。所以最后栈顶的元素会是这个新初始化的类。

6.ValueStack中对象的存取

Object Stack 的存放: push 或者 add:

将一个对象放入Object Stack的栈顶:

ActionContext.getContext().getValueStack().push(object);
ActionContext.getContext().getValueStack().getRoot().add(0,object);
  • 1
  • 2
  • 1
  • 2

Object Stack的提取: peek() 或 pop()

peek()取得的是栈顶元素:

Object object  =    ActionContext.getContext().getValueStack().peek();
  • 1
  • 1

Object Stack的元素的弹出:pop:

Object object  =    ActionContext.getContext().getValueStack().pop();
  • 1
  • 1

7.动态修改ValueStack中对象的属性

说明: 
可以利用valueStack.setParameter方法改变对象栈中对象的属性的值。至于匹配哪个。则依次从对象栈的栈顶向下搜索,找到匹配的就修改

最新文章

  1. hibernate框架int和Integer类型区别
  2. Swift: 在Swift中桥接OC文件(自己创建的类文件、第三方库文件)
  3. 教你如何查看一款App里面所包含的图片
  4. 神奇的expect
  5. Linux 中的零拷贝技术,第 2 部分
  6. PHP生成二维码【谷歌API+qrcode+圆角Logo】
  7. CCNA 6.5
  8. 字符串截取数字和点击radio显示不同内容
  9. gen-cpp/.deps/ChildService.Plo: No such file or directory
  10. mysql安装出现error Nr.1045
  11. Android从相册中获取图片以及路径
  12. php内核--SAPI概述
  13. Visual Studio 2015编译安装配置QT5.5.1(含QTWEBKIT)
  14. printf交替使用
  15. 【ASP.NET MVC 学习笔记】- 14 HtmlHlper的扩展方法
  16. Clickhouse v18编译记录
  17. window10单机安装storm集群
  18. openstack之镜像管理
  19. ASP.NET Web API实践系列03,路由模版, 路由惯例, 路由设置
  20. 第二种方式,修改python unittest的执行顺序,使用猴子补丁

热门文章

  1. Spring Boot Web开发中Thymeleaf模板引擎的使用
  2. set()集合基本操作
  3. C#中如何使用正则表达式
  4. String类型根据逗号分隔转为list
  5. ajax传递参数给springmvc
  6. jenkins在linux环境搭建需要用到的linux命令
  7. 五、PL/SQL循环、游标、函数和过程
  8. 解决Genymotion运行Android 5.0一直卡在开机界面
  9. 收集整理Android开发所需的Android SDK、开发中用到的工具、Android开发教程、Android设计规范,免费的设计素材等。
  10. 2016 Multi-University Training Contest 4 solutions BY FZU