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. JSTL标签判断list是否为空

    jsp页面判断获得action传的list的是否为空或者list.size的长度,就可以用fn这个标签: <c:if test="${list== null || fn:length( ...

  2. Flash学习笔记(01)

    一:动画基础原理 二:Flash的动画的制作方式 三:元件与实例的关系 四:Flash实例     可以做出网上常见的网页动画   Flash能为我们做什么 1.网站.贺卡.配乐短片.短剧.游戏.教学 ...

  3. python的unittest单元测试框架断言整理汇总

    自动化脚本最重要的是断言,正确设置断言以后才能帮助我们判断测试用例执行结果. 一.先说说unittest常用的断言吧 常用的就以下几个,网上一搜一大堆.python版本2.7以上都可以调用了. 断言语 ...

  4. LR百分比模式

    1  场景模式切换 Vuser Group Mode转换为Percentage Mode:如下 Scenario->Convert Scenairio to the VuserGroup Mod ...

  5. python020 Python3 OS 文件/目录方法

    os 模块提供了非常丰富的方法用来处理文件和目录.常用的方法如下表所示: 序号 方法及描述 1 os.access(path, mode) 检验权限模式 2 os.chdir(path) 改变当前工作 ...

  6. 【字符串+BFS】Problem 7. James Bond

    https://www.bnuoj.com/v3/external/gym/101241.pdf [题意] 给定n个字符串,大小写敏感 定义一个操作:选择任意m个串首尾相连组成一个新串 问是否存在一个 ...

  7. Vim pre-work

    1.先学会touch typing盲打是一切的基础 重点在于手眼协调 如果实现不了盲打.一切高效率的Vim操作都将无从做起 2.vim的使用 2.1.hjkl的移动 推荐练习贪吃蛇  和3D平衡球   ...

  8. 跳石头(codevs 4768)

    题目描述 Description 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有N ...

  9. 2017"百度之星"程序设计大赛 - 初赛(B)度度熊的交易计划

    n个村庄m条带权路,权值为花费,村庄可以造东西卖东西,造完东西可以换地方卖,给出每个村庄造东西花费a和最多个数b.卖东西价值c和最多个数d,求最大收益. 裸的费用流.然而还WA了一发.很好. 建源向每 ...

  10. QueenAttack

    问题分析: 1.对于行和列,要求得每行或每列的棋子个数,只需要把横坐标或纵坐标相同的棋子数目相加即可,然后使用k*(k-1)/2就可求得攻击次数 2.对于对角线上的点,需要分析对角线上点的坐标关系.分 ...