值栈
在学习web开发时,我们在servlet里面进行操作,把数据放到域对象里面,在页面中使用el表达式获取数据,域对象在一定范围内存值和取值。
struts2本身就提供一种存储机制,类似于域对象,叫值栈,用于存值和取值。
在action把数据放到值栈里面,在页面中获取到值栈数据。
servlet和action区别
Servlet:默认在第一次访问时候创建,创建一次,单实例对象。
Action:访问时候创建,每次访问action时候,都会创建action对象,创建多次,多实例对象。
值栈存储位置
每次访问action时候,都会创建action对象,在每个action对象里面有且只有一个值栈对象。
获取值栈对象
使用ActionContext类里面的方法得到值栈对象
public String execute() throws Exception {
// 1 获取ActionContext类的对象
ActionContext context = ActionContext.getContext();
//2 调用方法得到值栈对象
ValueStack stack1 = context.getValueStack();
ValueStack stack2 = context.getValueStack();
System.out.println(stack1==stack2);
return NONE;
}
值栈内部结构
使用debug查看stack1值栈对象,可以看出,值栈主要分为两部分
第一部分 root,结构是list集合
- root结构是list集合
- 一般操作都是root里面数据
public class CompoundRoot extends ArrayList
第二部分 context,结构是map集合
- context结构是map集合
public class OgnlContext extends Object implements Map
struts2里面标签 s:debug,使用这个标签可以查看值栈结构和存储值
<body>
<!-- 使用struts2标签查看值栈结构 -->
<s:debug></s:debug>
</body>
- 访问action,执行action的方法有返回值,配置返回值到jsp页面中,在jsp页面中使用这个标签
- 点击超链接看到结构
- 在action没有做任何操作,栈顶元素是action引用
- action对象里面有值栈对象,值栈对象里面有action引用