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方法改变对象栈中对象的属性的值。至于匹配哪个。则依次从对象栈的栈顶向下搜索,找到匹配的就修改

深度解析Struts2中ValueStack的更多相关文章

  1. 深度解析javascript中的浅复制和深复制

    原文:深度解析javascript中的浅复制和深复制 在谈javascript的浅复制和深复制之前,我们有必要在来讨论下js的数据类型.我们都知道有Number,Boolean,String,Null ...

  2. 深度解析VC中的消息(转发)

    http://blog.csdn.net/chenlycly/article/details/7586067 这篇转发的文章总结的比较好,但是没有告诉我为什么ON_MESSAGE的返回值必须是LRES ...

  3. Struts2中ValueStack结构和总结

    [ValueStack和ActionContext的关系] 首先,从结构上来看ValueStack是ActionContext的一个组成部分,是对ActionContext功能的扩展.ActionCo ...

  4. Struts2中 ValueStack、ActionContext、ServletContext、request、session等 表格解析

    变量 从ActionContext中获得 生命周期 用Ongl来读取值 使用ServletConfigInterceptor来注入 ActionContext类 静态方法ActionContext. ...

  5. struts2中valueStack,stackContext以及actionContext的关系

    一,首先给出三者的定义 1.valueStack: 里面存放的是Action类中通过set方法设置的属性值(表单传过来的值等),由OGNL框架实现; 2.stackContext: 也是用来存值的,s ...

  6. 【转载】深度解析Android中字体设置

    原文:http://mobile.51cto.com/android-265238.htm 1.在Android XML文件中设置字体 可以采用Android:typeface,例如android:t ...

  7. 深度解析Java中的那把锁

    锁的本质 我们先来讨论锁的出现是为了解决什么问题,锁要保证的事情其实很好理解,同一件事(一个代码块)在同一时刻只能由一个人(线程)操作. 这里所说的锁为排他锁,暂不考虑读写锁的情况 我们在这里打个比方 ...

  8. 深度解析VC中的消息传递机制

    摘要:Windows编程和Dos编程,一个很大的区别就是,Windows编程是事件驱动,消息传递的.所以,要学好Windows编程,必须 对消息机制有一个清楚的认识,本文希望能够对消息的传递做一个全面 ...

  9. 深度解析VC中的消息

    消息是指什么? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向Windows发出一个通知,告诉应用程序某个事情 ...

随机推荐

  1. 记第一次面试的悲惨经历QAQ

    面试岗位:测试开发 自我介绍 :根据介绍的内容,会问简历上涉及到的东西,主要是项目: 手写代码:给一个数组,求数组中所有数字拼接后能得到的最小数字.例:{3,32,312},输出312323. 关于计 ...

  2. [Noip2004][Day ?][T?]合并果子(?.cpp)

    题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...

  3. cherrypy & gevent patch

    给cherrypy 打gevent WSGIServer的patch 1. patch Serving 类 2. 关闭python的原生WSGIServer 具体使用例子参考 我的开源项目  http ...

  4. 大数据学习——ip改成固定ip

    vi /etc/sysconfig/network-scripts/ifcfg-eth0 修改BOOTPROTO为static 添加IPADDR=192.168.74.100 添加NETMASK=25 ...

  5. Jmeter用于接口测试中,关联如何实现

    Jmeter用于接口测试时,后一个接口经常需要用到前一次接口返回的结果,应该如何获取前一次请求的结果值,应用于后一个接口呢,拿一个登录的例子来说明如何获取. 1.打开jmeter, 使用的3.3的版本 ...

  6. PHP中的字符串替换(str_replace)

    /*替换 字符串处理  str_replace() */ $num = 0; $str = "http://www.phpbrother.net/php/demo.php";$st ...

  7. Euclidean Nim(bzoj 4147)

    Description Euclid和Pythagoras在玩取石子游戏,一开始有n颗石子. Euclid为先手,他们按如下规则轮流操作: ·若为Euclid操作,如果n<p,则他只能新放入p颗 ...

  8. msp430项目编程13

    msp430中项目---温湿度检测系统 1.dht11工作原理 2.电路原理说明 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习

  9. FusionCharts for Flex 如何更改图表数据

    FusionCharts allows to change chart data and re-render the chart, after it has loaded on the user’s ...

  10. 清北省选 DAY last 集锦

    这是题目描述的链接: http://lifecraft-mc.com/wp-content/uploads/2018/03/problems1.pdf (虽然这次没去清北,但还是厚颜无耻的做了一下这套 ...