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"/>