什么是值栈?
值栈:ValueStack,类似于域对象,值栈应用在Struts2的action里面,在值栈中可以存值和取值。其贯穿整个 Action 的生命周期(每个 Action 类的对象实例都拥有一个 ValueStack 对象). 相当于一个数据的中转站,我们知道,每次访问action时候,都会创建action对象,那么,在每个action对象里面就都存在一个值栈对象。
值栈的使用范围:
值栈使用在action范围。
值栈的内部结构
值栈的内部结构有两个逻辑单元:
* 一个对象栈:root ,CompoundRoot就是一个ArrayList.
* 一个ContextMap ,context OgnlContext就是一个Map.
向值栈保存数据
一般情况下说操作值栈:指的是操作值栈的root部分.
* push :将对象压入到栈顶.
* set :将对象压入到栈顶.
如果没有手动调用push或者set的时候:Action对象默认是在栈顶的.
*那么 Action中的属性是否在栈中? 答案是一定在.
如果Action实现ModelDriven接口了:
* ModelDriven对象就会在栈顶.
* push :将对象压入到栈顶.
* set :将对象压入到栈顶.
如果没有手动调用push或者set的时候:Action对象默认是在栈顶的.
*那么 Action中的属性是否在栈中? 答案是一定在.
如果Action实现ModelDriven接口了:
* ModelDriven对象就会在栈顶.
下面用代码解释一下:
//第一种:获取值栈对象,调用值栈对象里面的set方法
public String execute() throws Exception {
ValueStack stack = ActionContext.getContext().getValueStack();
stack.set("us","user");
return "stack";
}
调试运行后,得到,
从上图中也可以看出,在没有用set 方法放数据之前,在栈顶位置的是,这个正是我的Action对象,然后下面是Push方法,代码如下:
public String execute() throws Exception {
ValueStack stack = ActionContext.getContext().getValueStack();
stack.push("push");
return "second";
}
调试运行后,得到:
最后测试没有手动调用set和push,结果如下;
最后调试结果:
此时,action对象在栈顶。
向值栈中获取数据
在值栈中获取数据我们一般都是通过Struts2标签和ognl表达式一起,分为获取root数据,和获取context数据。获取root中的数据较为简单,如图:
获取context中数据稍微有些不同,这种情况下要加 " # " 符号,如图:
以上是对值栈的一些简单认识吧,还望大神能补充。