struts2中的值栈的详解

struts2中的值栈的详解

1、什么是值栈?
简单的说:值栈是对应每一个请求对象的轻量级的内存数据的中心。在struts2中每次访问Action的时候都会创建action对象,每个action对象里面都会有一个值栈对象。在action中我们可以把数据放到值栈中,然后从页面中取值。
2、值栈中设置值与取值的常用方法
import com.haha.domain.user;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class Demo2Action extends ActionSupport implements ModelDriven<user>{
	private user user=new user();
	@Override
	public user getModel() {
		return user;
	}
	@Override
	public String execute() throws Exception {
		ActionContext.getContext().getValueStack().set("user", user);
		System.out.println(ActionContext.getContext().getValueStack().findValue("user"));
		return "success";
	}

}
只有当访问action之后才会创建值栈对象,这是在action中取值的代码,在页面上取值方法如下:
<s:debug></s:debug> //点击可以查看值栈中存放的数据
	el表达式取值栈中的数据:${user.username }${user.userage } <br/>
	利用ognl表达式取值栈中的值:<s:property value="user.username"/>
通过el表达式也可以获取到值栈中的存取的数据,是因为el中的request被struts2改造了,如下:



3、值栈的内部结构
值栈的内部结构与栈的内部结构相同,都是采用的是先进后出的数据结构。但是值栈中分为两部分,一部分为Root,一部分为context.如下图:

Root:
我们可以查看源码发现CompoundRoot是继承的ArrayList,上面我举得那个例子中,点击<s:debug></s:debug>在页面中的显示为链接的形式,点进去之后,你会发现刚才的例子中的数据,这些都是Root中的数据。

ActionContext.getContext().getValueStack().set("user", user);
访问这个action的时候,首先会创建一个action对象,压栈。然后通过struts2中默认的20个拦截器,其中一个为模型驱动的拦截器,会创建一个user对象,然后压栈,接着通过一个params的拦截器,会为这个user对象赋值,然后当我把user对象set进值栈中,会在Root中创建一个HashMap值,然后压栈。这就是上面数据的由来,不过这是我自己的理解。
Context
它就相当于是ActionContext对象,是一个数据中心,它里面保存的都是一些固定的值
举一些例子:

request
session
application
parameters
attr

就举这些例子吧,在Debug中也可以查看。











  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值