进阶Java之Struts中的值栈

来源:互联网 发布:cad网络培训班 编辑:程序博客网 时间:2024/06/14 02:33

什么是值栈?

    值栈: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对象就会在栈顶.
    下面用代码解释一下:
//第一种:获取值栈对象,调用值栈对象里面的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中数据稍微有些不同,这种情况下要加 " # " 符号,如图:

    以上是对值栈的一些简单认识吧,还望大神能补充。
1 0
原创粉丝点击