Struts2的ValueStack(值栈)介绍
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(值栈)介绍相关推荐
- 关于Struts2中的值栈与OGNL表达式
1.1.1 OGNL概述: Object Graphic Navigation Language(对象图导航语言)的缩写 * EL :OGNL比EL功能强大很多倍. 它是一个开源项目. ...
- struts2中的值栈对象ValueStack
ValueStack, 即值栈对象. 值栈对象: 是整个struts数据存储的核心,或者叫中转站. 用户每次访问struts的action,都会创建一个Action对象.值栈对象.ActionCont ...
- Struts2中的值栈
一 什么是值栈 值栈: struts2中提供的一种类似于域对象的工具, 用于struts2中的存值和取值. 每次访问Action的时候, 都会创建一个action对象, 而每个action对象中都存在 ...
- java 值栈的结构_Struts2 | 深入浅出理解struts2中的值栈
在没有struts框架的时候,我们通常在Servlet中使用域对象进行存值和取值,将其作为载体来承载页面和后台之间的数据传递. 在struts2中,我们又有了一种新的机制来进行数据的传递. 那就是st ...
- Struts2——(3)ValueStack(值栈)
一.ValueStack 主要用于存储请求相关信息,内部结构如下 root区:被称为根存储区,是一个栈结构,栈顶元素为当前请求的Action对象. context区:被称为变量存储区,是一个Map结构 ...
- Struts2数据传输的背后机制:ValueStack(值栈)
1. 数据传输背后机制:ValueStack(值栈) 在这一切的背后,是因为有了ValueStack(值栈)! ValueStack基础:OGNL 要了解ValueStack,必须先理解OGN ...
- Struts2框架--学习笔记(下):OGNL表达式、值栈操作、拦截器、struts2标签、文件上传
一.OGNL概述:OGNL是一种表达式 (1)在struts2中操作值栈数据. (2)一般把ognl在struts2中操作,和struts2标签一起使用操作值栈. (3)ognl不是strut2的一部 ...
- java struts2值栈ognl_Struts2 (三) — OGNL与值栈
一.OGNL表达式 1.概述 1.1什么是OGNL OGNL是Object-Graph Navigation Language的缩写,俗称对象图导航语言. 它是一种功能强大的表达式语言,通过它简单 ...
- struts2值栈分析
前段日子对ognl表达式不是很理解,看了几本书上关于ognl表达式的描述后还是感觉很难,前几天学习了struts2中值栈的内容,现在感觉ognl表达式其实很容易. struts2中利用值栈来存储数据, ...
最新文章
- Git与Ftp协同工作
- 安装好Pycharm后如何配置Python解释器简易教程(configure python interpreter)
- Python中的shuffle()函数的使用
- 快速完成和读懂测试计划
- 平滑滤波器模板尺寸与平滑效果的关系_Python Opencv 图像平滑处理
- 几种常用HTML5移动应用框架的比较
- Linux内核分析-孟宁
- 关于对网络学习方法的一点见解
- CSDN自定义模块内容编写
- python爬取酷狗音乐_python 爬虫 爬取酷狗音乐
- 【深入理解Java】一篇文章带你彻底吃透Java NIO
- 人工智能学习笔记:基本遗传算法及其改进算法
- 【案例】某市社会治理网格化智慧工作平台建设案例
- PCI DSS认证到底难在何处?
- 某奏云资源网址打不开的N种处理方法(亲测好用)
- spyder无法打开的原因
- 2013年IT审计师认证的详细资料
- GSM模块的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- VRRP 出现部分双主情况
- ZooKeeper : Curator框架Znode、ACL API介绍