ValueStack对象
ValueStack, 即值栈对象。
是整个struts数据存储的核心,或者叫中转站。
用户每次访问struts的action,都会创建一个Action对象、值栈对象、ActionContext对象;然后把Action对象放入值栈中;最后再把值栈对象放入request中,传入jsp页面。
(key: struts.valueStack); 开发者只需要通过ActionContext对象就可以访问struts的其他的关键对象。(ActionContext是给开发者用的,便于学习与使用。)
ValueStack
ValueStack实际是一个接口,在Struts2中利用OGNL时,实际上使用的是实现了该接口的OgnlValueStack类,这个类是Struts2利用OGNL的基础。
ValueStack特点
ValueStack贯穿整个 Action 的生命周期(每个 Action 类的对象实例都拥有一个ValueStack 对象). 相当于一个数据的中转站. 在其中保存当前Action 对象和其他相关对象.
Struts2框架把 ValueStack 对象保存在名为 “struts.valueStack” 的request请求属性中。
ValueStack存储对象
ObjectStack: Struts 把动作和相关对象压入 ObjectStack 中--List
ContextMap: Struts 把各种各样的映射关系(一些 Map 类型的对象) 压入 ContextMap中。
Struts 会把下面这些映射压入 ContextMap 中
parameters: 该 Map 中包含当前请求的请求参数
request: 该 Map 中包含当前 request 对象中的所有属性
session: 该 Map 中包含当前 session 对象中的所有属性
application: 该 Map 中包含当前 application 对象中的所有属性
attr: 该 Map 按如下顺序来检索某个属性: request, session, application
ValueStack获取
方法1:
HttpServletRequest request = ServletActionContext.getRequest();
ValueStack vs= (ValueStack)request.getAttribute("struts.valueStack");
方法2:
ActionContext ac = ActionContext.getContext();
ValueStack vs2= ServletActionContext.getContext().getValueStack();
直接输出类引用变量可见值栈类 com.opensymphony.xwork2.ognl.OgnlValueStack
ValueStack分析
在获取值栈的代码处添加断点查看
vs变量。
CompoundRoot root; 是继承ArrayList的对象栈
Map<String, Object> context; 是实现Map的Map栈
对象栈分析
默认的对象栈第一个索引存储的是当前的Action
使用以下代码往对象栈中添加基本数据和对象数据分析存储原理
使用Struts2标签<s:debug>标签在页面中查看对象栈(值栈)。
由于是对象栈是ArrayList集合,因此可以根据索引插入来改变插入数据的位置。
Map栈分析
Map栈中主要存储的是域变量属性值。
ValueStack总结
值栈以struts.valueStack的名字存储在request请求中,值栈主要包含两个栈:对象栈和Map栈。
对象栈存储的是用户的基本数据和对象数据 ;
Map栈主要存储的是域对象属性。
用户每次一个请求就一个Action实例,对应一个值栈对象。
思考
放在request中的值栈中可以存储session和servletContext域数据,显然request的作用于没有那么大?直接使用拷贝的方式以key=value的方式拷贝到Map栈对应的Map中。
Map栈中的_root
debug可见该属性中引用的是对象栈数据。如果在Map栈中不存储_root对于对象栈的引用,那么开发者需要访问数据时候首先要区分是访问对象栈还是Map栈,比较繁琐。因此以后操作数据直接操作Map栈即可。
源码分析
public class OgnlContext extends Object implements Map{
private Object _root; // 对象栈引用
private Map _values = new HashMap(23); // Map栈
}
转自: http://blog.youkuaiyun.com/qq_35448976/article/details/61208080