1、值栈的生命周期
值栈是在struts2拦截请求创建ActionContext后创建的,是由框架的配置文件静态注入的。值栈的声明周期是一次请求。
2、如何获取值栈
通常通过ActionContext.getContext().getValueStack()来获取
3、值栈的数据结构
值栈分为对象栈和Map栈。值栈的整个上下文可通过ActionContext.getContext().getValueStack().getContext()来获取
对象栈(CompoundRoot)实际上是一个List(实现了List),里面默认有两个对象,一个就是当前访问的Action,另一个时Struts处理国际化的DefaultTextProvider。可以通过ValueStack的getRoot().add([index],Object)往对象栈中添加数据,指定index为0则会将对象放入对象栈的栈顶。ValueStack的push方法底层也是利用add(0,obj)来实现往栈顶放对象。
Map栈(ognlContext)实际上是一个Map,里面放了request、session、application等servlet域对象。
4、将数据放入值栈的方式
对象栈
ValueStack的push(往栈顶放对象),add([index,]obj),peek(获取栈顶对象),pop(移除栈顶对象),set(key,obj)把一个map放入对象栈。
Map栈
ActionContext.getContext().put(key,obj)
5、对象栈和Map栈有什么区别
对象栈中的对象的属性能够直接访问,方便做数据回显。访问对象栈中的对象直接使用属性名.对象属性的ognl表达式即可。而访问Map栈中的数据如request域中的user对象的用户名需要使用“#”,即#request.user.username,要通过map的名、对象的key找到对象。而对象栈是自顶向下寻找指定的属性名,找到即返回。
6、对象栈有什么特点
使用ognl表达式访问对象栈的对象的属性时,将从栈顶依次往下找到属性名,先找到的为准。使用struts标签s:iterator迭代
集合时,当前迭代的元素将位于对象栈栈顶。你要用使用ognl表达式访问对象栈的对象的属性时,将从栈顶依次往下找到属性
名,先找到的为准。使用struts标签s:iterator迭代集合时,当前迭代的元素将被放于对象栈栈顶。当往对象栈的栈顶放对象后
,若该对象是一个集合且你要使用iterator标签迭代它,那么你可以不指定标签的value属性值,或指定value属性值为
top。
迭代map时,指定s:propert标签的value值为key或value即可获得当前迭代元素包含的对象和对象在map中key。