Struts2-Value Stack浅析
http://my.oschina.net/mlongbo/blog/88250
Value Stack的作用:
1. 可以作为一个数据中转站
2. 用于在前台-后台之间传递数据,最典型的做法就是struts2标签也ognl表达式的结合。我用得最多的就是数据回显。
Value Stack的生命周期:
在struts-default.xml文件中决定了在web容器启动时将会创建OgnlValueStackFactory对象,该对象实现了ValueStackFactory接口,负责ValueStack的创建工作。
ValueStack的生命周期是随着request的创建而创建,随request的销毁而销毁。具体可见源代码:
在PrepareOperations类的createActionContext中有
至于清理工作,struts统一放在了PrepareOperations类的cleanupRequest方法中。
Value Stack结构:
主要看OgnlValueStack类,此类实现了ValueStack接口。
在OgnlValueStack中有两个至关重要的东西,
,简称“对象栈”和“Map栈”。
CompoundRoot:
CompoundRoot继承了ArrayList类,即是一个List集合,详见源码CompoundRoot类。
Context:而context实际上是一个hashMap,
。
其中_values就是平时使用的map栈,而_root只是对对象栈的引用。
使用Value Stack:
常用方法解析:
1. push方法:
,再查看root的push方法
,顿时明白什么叫将对象压入栈顶了。
2. set(String key,Object o)方法:
再看
,
也就是说第一次使用该方法时,struts会创建一个新的map。
3. pop方法:
,移除栈顶对象,查看root的pop方法
4. peek方法
获取栈顶对象,做法与pop方法相同,只不过是get数据。
所以即可总结出使用方法:
1. 将数据放入值栈
将对象放入栈顶:
a) ActionContext.getContext().getValueStack().push("aa);
b) ActionContext.getContext().getValueStack().getRoot().add(0,"bb");
将数据放入map栈
ActionContext.getContext().getValueStack().set(“a”,”a”);
2. 从值栈中获取数据
a) 获取栈顶数据
i. ActionContext.getContext().getValueStack().peek();
ii. ActionContext.getContext().getValueStack().getRoot().get(0);
一般情况下,将对象放入栈顶之前先移除栈顶对象,这样可以节省内存空间。
重要:
1. Interator标签当前迭代的对象在栈顶。
2. Iterator标签的value可以不写,默认是迭代栈顶元素。
Struts2-Value Stack浅析的更多相关文章
- Struts2源码浅析-ConfigurationProvider
ConfigurationProvider接口 主要完成struts配置文件 加载 注册过程 ConfigurationProvider接口定义 public interface Configurat ...
- Struts2的Stack Context和ValueStack
1.提到Struts2的传值功能时,经常会见到Stack Context和ValueStack等概念,那么它们到底是什么,有什么作用呢. ValueStack(值栈):Struts2将OGNL上下文设 ...
- Struts2拦截器浅析
一.拦截器简介: Struts2大多数核心功能是通过拦截器实现的,每个拦截器完成某项功能. 拦截器方法在Action执行之前或者之后执行. 拦截器栈: 从结构上看,拦截器栈相当于多个拦截器的组合. 在 ...
- Struts2的OGNL标签详解
一.Struts2可以将所有标签分成3类: UI标签:主要用于生成HTML元素的标签. 非UI标签:主要用于数据库访问,逻辑控制等标签. Ajax标签:用于Ajax支持的标签. 对于UI标签,则有可以 ...
- 一站式学习Wireshark(转载)
一站式学习Wireshark(一):Wireshark基本用法 2014/06/10 · IT技术 · 4 评论 · WireShark 分享到: 115 与<YII框架>不得不说的故事— ...
- Struts2.3.15.1源码浅析
Struts2 两大运行主线: 1.初始化主线:初始化主线主要是为Struts2创建运行环境(此处的环境与Struts2身处的Web环境是有区别的),初始化入口StrutsPrepareAndExec ...
- 浅析Struts1和Struts2的Action线程安全问题 转
浅析Struts1和Struts2的Action线程安全问题 转 http://blog.csdn.net/virgoboy2004/article/details/5876133 [问题描述]最近 ...
- 浅析=======Struts2之==========valueStack
今天刚学习了struts2的valueStack,在这里把自己学到的做个分享,说道valueStack就不得不提OGNL表达式=== struts2工作流程 1.OGNL(Object Graph N ...
- struts2.1.6教程四_2、ActionContext 、ValueStack 、Stack Context
ActionContext 一次Action调用都会创建一个ActionContext 调用:ActionContext context = ActionContext.getContext() Va ...
随机推荐
- 倍福TwinCAT(贝福Beckhoff)基础教程2.1 TwinCAT常见类型简介
常见数据类型可以参考EXCEL表格的内容,在准备值中输入非法数据,然后回车会有错误提示(例如BYTE数据输入256) 右击可以切换二进制或十进制显示,wData5可以被挨个采集每个位上的数据,也可 ...
- 系统封装 EasyBoot如何将WIN7安装版提取到光盘
1 将WIN7光盘中的文件提取到Easyboot根目录,注意不要autorun.inf和setup.exe这两个文件.我们这里的Easyboot已经有了一些其他东西(XP的安装版文件,PE的文件等等, ...
- Nginx 限制单个IP的并发连接数及对每个连接速度(限速)
使用Nginx限制单个IP的并发连接数能够减少一些采集程序或者DDOS的攻击. 再lnmp的nginx配置中已经添加了部分代码,但是是注释掉的,可以编辑/usr/local/nginx/conf/ng ...
- linux本地文件上传之RZ/SZ和sftp
将本地的文件上传到服务器或者从服务器上下载文件到本地,rz / sz命令很方便的帮我们实现了这个功能,但是很多Linux系统初始并没有这两个命令. 1.软件安装 (1)编译安装 root 账号登陆后, ...
- java 乱码问题解决思路
"编码一致的条件下,在处理运行正常的情况下,是不会出现乱码的",记住这句金言. 如上所说,如果编码一致是不会出现这种乱码问题,所以解决办法就是仔细再仔细的检查所设置的编码是否是一致 ...
- window 服务(二)
接Window服务(一) ServiceController方法调用 public partial class Service1 : ServiceBase { public Service1() { ...
- C++类型转换运算符 static_cast,dynamic_cast,reinterpret_cast,const_cast
类型转换是一种让程序猿可以临时或永久性改变编译器对对象的解释机制.可改变对象解释方式的运算符称为类型转换运算符. 为何须要进行类型转换 通常为了实现使用不同环境的个人和厂商编写的模块可以相互调用和协作 ...
- squid cache 服务器端的安装,配置
一,什么squid Squid是一个高性能的代理缓存服务器,可以加快内部网浏览Internet的速度,提高客户机的访问命中率.Squid不仅支持HTTP协议, 还支持FTP.gopher.SSL和WA ...
- Java和C++ 比較
总体差别 1. C/C++是直接执行在机器上(编译后为机器码),而java编译后产生*.class文件(字节码)是执行在java虚拟机上在(JVM),经过JVM解译(机器码)再放到真实机器上执行. J ...
- 用Android Studio 执行ndk 程序
近期准备研究一下android双进程守护,因为此前用eclipse 写jni习惯了.如今主要用as 工具.在此也试着写个demo 然后在对双进程守护进行研究 1.所需工具 android studio ...