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. 3.3.3 使用 join 连接字段

        join 命令可以将多个文件结合在一起,每个文件里的每条记录,都共享一个键值(key),键值指的是记录中的主字段,通常会是用户名称.个人姓氏.员工编号之类的数据.举例来说,两个文件,一个列出所 ...

  2. LINUX常用文件说明

    一.网络配置 1.修改主机名 /etc/sysconfig/network或/etc/hosts 2.开启或关闭网卡 ifconfig eth0 down/up 3.linuxa下查看一个网卡绑定的所 ...

  3. 新建oracle连接远程服务

    更新下面两个文件夹中的 D:\app\shisan\product\11.2.0\client_1\network\admin D:\ORACLE\product\11.2.0\dbhome_1\NE ...

  4. Robberies(01背包)

    The aspiring Roy the Robber has seen a lot of American movies, and knows that the bad guys usually g ...

  5. CodeForces 554B--Ohana Cleans Up

    B. Ohana Cleans Up time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  6. BZOJ3027 - [CEOI2004]Sweet

    Portal Description 给出\(n(n\leq10),a,b(a,b\leq10^7)\)与\(\{c_n\}(c_i\leq10^6)\),求使得\(\sum_{i=1}^n x_i ...

  7. vscode安装插件

    十分简单,知道名字叫啥后,直接搜索,安装,就完了,还可以查看自己已经安装了哪些插件. step1 如图.png step2 image.png step 3 去网上查找想要安装的插件的名字 step ...

  8. [CodePlus2017]汀博尔

    Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 158  Solved: 61[Submit][Status][Discuss] Description ...

  9. POJ 1502 水 dij

    题意:给N,表示N个节点. 给半个邻接矩阵,本身到本身的距离是0,边是双向的.当两个节点之间没有直接的边连接的时候,用x表示. 问从第一个节点到其他所有节点至少花费的时间. 这题唯一的处理是处理邻接矩 ...

  10. CDI Services *Decoretions *Intercepters * Scope * EL\(Sp EL) *Eventmodel

    1.Decorators装饰器综述 拦截器是一种强大的方法在应用程序捕捉运行方法和解耦.拦截器可以拦截任何java类型的调用.  这使得拦截器适合解决事务管理,安全性,以及日记记录.  本质上说,拦截 ...