1.在之前写的一些文章中,有用到<s:debug></s:debug>这个Struts2自带的标签,会在jsp页面中产生一个Debug按钮,点击这个按钮时,就会出现ValueStack(值栈)和Stack Context(栈的上下文环境)的内容,今天就来介绍一下ValueStack(值栈)。

2.ValueStack对象相当于一个栈,它贯穿整个Action的生命周期,每个Action类的对象实例都会拥有一个ValueStack对象。

(1).当Struts2接收到一个*.action请求后,并不是直接调用Action方法,而是先将Action类的相应属性放到ValueStack对象的顶层节点。

值栈也位于内存当中,它也是和parameters,request,session,application,attr对象放在一起的。

值栈属于OGNL Context里面的根对象,即值栈位于整个内存当中最为重要的地方,所以叫根对象。

(1).其中根对象和另外五个对象(parameters,request,session,application,attr)是有区别的,根对象在获得属性值时可以省略#号,比如<s:property value="user.username"/>,而那另外5个对象就要加上#号了,根对象是放在值栈内容中的,另外5个对象是放在值栈上下文环境中的,要使用#key.属性名取得。

(2).值栈的生命周期与request请求有关,每次请求产生一个值栈。默认所有的Action会被自动放到值栈里面去。

3.在服务器跳转时是共有值栈的,假设从一个Action1通过服务器跳转到Action2的话,就意味着这两个Action是共享一个值栈的,因为一次请求只使用一个值栈。这时内存中情况是这样的,首先,接收到Action1请求后,会产生一个值栈,在栈顶存放Action1对象以及它的所有属性。然后经过服务器跳转到Action2,这时会把Action2对象压入值栈的栈顶位置,此时Action1对象以及Action1的所有属性就位于栈底了。

(1).当请求过程是通过服务器跳转的话,它的取值过程是怎样的呢?

栈的特征是后进先出。于是首先到栈顶的对象里查找是否存在这个属性,如果栈顶的Action2对象中不存在这个属性的话,它会继续向下寻找直至栈底对象,一直查找是否存在这个属性,如果最后找到该属性的话,那么就会在JSP页面中通过<s:property value="属性名"/>输出属性值,如果在Action1和Action2都有一个同名的同类型的属性的话,那么将输出Action2中的属性值,因为它是先从栈顶开始寻找属性的,值栈的特征是后进先出,Action2对象及其它对应的属性是后进的,所以先出,就先取得Action2中的属性。

(2).其中有三种语法可以获得Action类中的属性:

首先,设此时想获取Action1中的username属性的话,可以使用值栈的Top语法或者N语法。

使用Top语法获取值栈中的第二个对象的属性:<s:property value="[1].top.username"/>

使用N语法获取值栈中第二个对象的属性:<s:property value="[1].username"/>

另外值栈还有一个@语法,例如@语法调用Action中的静态方法:<s:property value="@vs@getVOMethod()"/>

@vs@get()等价于@vs1@getVOMethod(),指的是栈顶对象的静态getVOMethod()方法,同理,@vs2@getVOMethod()就是取值栈中第二个对象的静态getVOMethod()方法。

4.在客户端跳转时使用各自的值栈,不是像服务器跳转时一样是共享值栈了,假如中间某一步骤中出现了客户端跳转的话,那么两个Action所使用的就是两个不同的值栈了,所以在Action2中就不能再使用Action1中的属性了,在最后跳转的JSP页面中也就无法获取Action1的属性了。

即Action2跳转到JSP页面时使用的是redirect重定向的类型的话,那么最后值栈是没有任何Action对象的。这个时候我们可以通过链接传参,如<result type="redirect">/user_success.jsp?t=${type}</result>,意思就是取出Action2的type属性作为参数,通过浏览器地址栏传递到JSP页面中,然后使用OGNL表达式中的#号获取parameters对象的属性,即::<s:property value="#parameters.t"/>就可以取到值了。这个有点类似我之前写过的向结果集传参的一篇文章,大家可以参考下,文章地址:http://blog.csdn.net/u012561176/article/details/44803435 。

5.我们也可以手工的向值栈压入对象,正常情况下值栈保存的是Action对象,而我们也可以直接往值栈中添加其他对象,这时可以在Action类中添加如下代码:

ActionContext.getContext.getValueStack().push(new Person("林业雄",23));

向值栈中添加对象,即把这个对象压入栈中,我们手工往值栈里添加的Person对象会存放在栈顶当中。

这时Struts2会初始化这个Action,把Action对象放到值栈里面去了,然后调用执行Action类的execute()方法是,就会往值栈中添加了Person对象。

6.以上内容仅供大家学习参考,如有雷同,纯属巧合,我也是根据老师的文档所写的,在我之前的文章里面也有涉及到ValueStack(值栈)里的东西,大家可以去看下,谢谢!



Struts2的ValueStack(值栈)介绍相关推荐

  1. 关于Struts2中的值栈与OGNL表达式

    1.1.1    OGNL概述: Object Graphic Navigation Language(对象图导航语言)的缩写 * EL     :OGNL比EL功能强大很多倍. 它是一个开源项目. ...

  2. struts2中的值栈对象ValueStack

    ValueStack, 即值栈对象. 值栈对象: 是整个struts数据存储的核心,或者叫中转站. 用户每次访问struts的action,都会创建一个Action对象.值栈对象.ActionCont ...

  3. Struts2中的值栈

    一 什么是值栈 值栈: struts2中提供的一种类似于域对象的工具, 用于struts2中的存值和取值. 每次访问Action的时候, 都会创建一个action对象, 而每个action对象中都存在 ...

  4. java 值栈的结构_Struts2 | 深入浅出理解struts2中的值栈

    在没有struts框架的时候,我们通常在Servlet中使用域对象进行存值和取值,将其作为载体来承载页面和后台之间的数据传递. 在struts2中,我们又有了一种新的机制来进行数据的传递. 那就是st ...

  5. Struts2——(3)ValueStack(值栈)

    一.ValueStack 主要用于存储请求相关信息,内部结构如下 root区:被称为根存储区,是一个栈结构,栈顶元素为当前请求的Action对象. context区:被称为变量存储区,是一个Map结构 ...

  6. Struts2数据传输的背后机制:ValueStack(值栈)

    1.     数据传输背后机制:ValueStack(值栈) 在这一切的背后,是因为有了ValueStack(值栈)! ValueStack基础:OGNL 要了解ValueStack,必须先理解OGN ...

  7. Struts2框架--学习笔记(下):OGNL表达式、值栈操作、拦截器、struts2标签、文件上传

    一.OGNL概述:OGNL是一种表达式 (1)在struts2中操作值栈数据. (2)一般把ognl在struts2中操作,和struts2标签一起使用操作值栈. (3)ognl不是strut2的一部 ...

  8. java struts2值栈ognl_Struts2 (三) — OGNL与值栈

    一.OGNL表达式 1.概述 1.1什么是OGNL ​ OGNL是Object-Graph Navigation Language的缩写,俗称对象图导航语言. 它是一种功能强大的表达式语言,通过它简单 ...

  9. struts2值栈分析

    前段日子对ognl表达式不是很理解,看了几本书上关于ognl表达式的描述后还是感觉很难,前几天学习了struts2中值栈的内容,现在感觉ognl表达式其实很容易. struts2中利用值栈来存储数据, ...

最新文章

  1. Git与Ftp协同工作
  2. 安装好Pycharm后如何配置Python解释器简易教程(configure python interpreter)
  3. Python中的shuffle()函数的使用
  4. 快速完成和读懂测试计划
  5. 平滑滤波器模板尺寸与平滑效果的关系_Python Opencv 图像平滑处理
  6. 几种常用HTML5移动应用框架的比较
  7. Linux内核分析-孟宁
  8. 关于对网络学习方法的一点见解
  9. CSDN自定义模块内容编写
  10. python爬取酷狗音乐_python 爬虫 爬取酷狗音乐
  11. 【深入理解Java】一篇文章带你彻底吃透Java NIO
  12. 人工智能学习笔记:基本遗传算法及其改进算法
  13. 【案例】某市社会治理网格化智慧工作平台建设案例
  14. PCI DSS认证到底难在何处?
  15. 某奏云资源网址打不开的N种处理方法(亲测好用)
  16. spyder无法打开的原因
  17. 2013年IT审计师认证的详细资料
  18. GSM模块的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  19. VRRP 出现部分双主情况
  20. ZooKeeper : Curator框架Znode、ACL API介绍

热门文章

  1. JPA ---- 表之间的映射关系
  2. 【安全测试自学】初探web安全处测试(三)
  3. Oracle查询指定表里的触发器
  4. 开源项目之kisso
  5. jQuery DOM/属性/CSS操作
  6. linux 源码编译安装apache
  7. Nginx服务状态监控
  8. Docker解析及轻量级PaaS平台演练(三)--Dockerfile编写
  9. Javascript事件机制兼容性解决方案
  10. Winform GDI+ 绘图