1、ValueStack 和 ActionContext 的关系与区别:
-- 相同点:它们都是在一次HTTP请求的范围内使用的,它们的生命周期都是一次请求
-- 不同点:ValueStack 分为对象栈(Object Stack) 和 Map栈(Map Context),而ActionContext就是一个映射的Map结构
-- 联系 : ValueStack.getContext()方法得到的Map 其实就是ActionContext 的Map。在查看Struts2的源代码可知(Struts2.3.1.2的org.apache.struts2.dispatcher.ng.PrepareOperations的第79行,createActionContext方法),在创建ActionContext的时候,就是把ValueStack.getContext()作为ActionContext的构造函数的参数,而Aaction中,可以通过 Action.getContext().getValueStack()方法获取ValueStack对象。所以本质上,这两个对象是可以相互获得的。
-- 有关于VauleStack,可以通过下图基本了解:
2、ValueStack:由上图可知ValueStack是由 Map栈 和 对象栈 组成的。ValueStack的基础是ONGL,要想了解ValueStack,必须理解OGNL(Object Graphic Navigatino Language)。OGNL是Struts2中使用的一种表达式语言,它可以使用Jsp标签库,以便可以访问各种对象的属性,它用于页面将参数传递到Action中(并进行类型转换)。OGNL这里就不介绍了。下篇随笔会介绍
--> Map栈 : 实际上是OgnlContext类型,是个Map,也是 ActionContext的一个引用,里面包括 requestMap,sessionMap,applicationMap,parameterMap,attr
--> 对象栈 : 实际上是CompoundRoot类型,是一个使用ArrayList定义的栈,里面保存着各种和当前Action实例相关的对象。是一个数据结构意义的栈
3、在Jsp页面上可以通过OGNL(Object Graphic Navigatino Language 对象-图导航语言)来直接访问值栈(ValueStack)里的对象属性。若想访问Object Stack的某个对象的属性。可以使用以下几种形式
--> object.propertyName 、object['propertyName']、object["propertyName"]
--> Object Stack 里的对象可以通过一个从零开始的下标来引用,Object Stack 里的栈前对象可以用[0]来引用,它下面的对象可以用[1]引用 [0].message
--> [n]的含义是从第N个元素开始搜索,不是只搜索第N个对象
--> 若是从栈顶开始搜索 [0]是可以省略的,直接写出message
--> 结合 s:property 标签 :如果又下标的情况下可以使用 <s:property value=[0].message"/> 等同于 <s:property value=message"/>
--> 若是访问的是对象栈中的数据 <s:property value="object.columnName"/> 或 <s:property value="object['columnName']"/>,如果又下标的情况下可以使用 <s:property value=[0].message"/> 等同于 <s:property value=message"/>