进阶Java之Struts中的值栈

7 篇文章 2 订阅

什么是值栈?

    值栈: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中数据稍微有些不同,这种情况下要加 " # " 符号,如图:

    以上是对值栈的一些简单认识吧,还望大神能补充。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值