
4.1 Struts 2的值栈及访问
Struts 2框架中存储数据的容器是ActionContext,包含着Action运行需要的对象。在该容器下,有“值栈”对象(ValueStack),它贯穿整个Action的生命周期(即每个Action类的对象实例都拥有一个ValueStack对象),在该对象内保存当前Action对象及其他相关对象。值栈对象分为ObjectStack(对象栈)和ContextMap(Map栈)。
1.ActionContext容器及其操作
(1)ActionContext通常存储的数据如下。
● request的parameters:请求中的参数。
● request、session和application的attribute:请求中的属性(以Map方式存储数据)。
● 利用put方法,存放到该容器内的属性。
● ValueStack:值栈。OGNL在没有特别指明的情况下,访问的是ValueStack。
(2)ActionContext常用方法
ActionContext的常用方法如下。
● ActionContext ActionContext.getContext():使用ActionContext静态方法获取其容器对象。
● Object get(String key):从ActionContext中返回key对应的值。
● void put(String key, Object value):保存值到ActionContext。
● Map<String, Object>getApplication():返回ServletContext中返回的值。
● Map<String, Object>getSession():返回HttpSession的值。
● Map<String, Object>getContextMap():返回context map对象(Map栈对象)。
● Map<String, Object>getParameters():返回HttpServletRequest请求参数。
(3)在Action中访问Web资源
Struts 2提供了ActionContext类的一个子类:ServletActionContext类,利用该类可以直接在Action中访问Web资源。如下面的代码所示。
ServletContext servletContext = ServletActionContext.getServletContext(); //获取ServletContext HttpServletRequest request=ServletActionContext.getRequest(); //获取request HttpServletResponse response = ServletActionContext.getResponse(); //获取response
2.Map栈
Map栈是对ActionContext的一个引用。主要存取以下对象中的数据。
● parameters:存放包含当前请求的请求参数。
● request:存放包含当前request对象中的所有属性。
● session:存放包含当前session对象中的所有属性。
● application:存放包含当前application对象中的所有属性。
● attr:在Map栈中,按下列顺序来检索某个属性的值:request、session、application。
3.对象栈
对象栈中保存着各种与当前Action实例相关的对象。
(1)ValueStack的获取
直接由ActionContext对象的getValueStack()方法即可获得。
(2)常用方法
● Object findValue(String expr):从该栈中查找参数expr的值。
● void setValue(String expr, Object value):以键-值对方式,将值保存到该栈中。
● Object pop():从栈中删除栈顶对象。
● void push(Object o):将对象o存放到该栈的栈顶。
图4-1给出了Struts 2中ActionContext、ValueStack、ObjectStack及ContextMap之间的关系。

图4-1 ActionContext结构图
4.对值栈中数据的访问
对值栈中的数据可以利用EL、Struts 2的ONGL等方式访问。
(1)EL访问格式
对于在ObjectStack中的数据,其访问格式如下。
${属性名} 或者 ${对象名.属性名}
对于在ContextMap中的数据(如request、session及application等对象中的数据),其访问格式如下。
${域对象名.属性名} 或 ${域对象名.对象.属性名}
(2)Struts 2的ONGL访问格式
对于在ObjectStack中的数据,其访问格式如下。
属性名 或 对象.属性名
对于在ContextMap中的数据,其访问格式如下。
#属性名 或 #对象.属性名
若是存储在request、session和application中的数据,其访问分别采用下列方式。
#域对象名.属性名 或 #域对象名.对象.属性名
其中域对象名可以是request、session、application和attr。其中attr按顺序依次从request、session、application中查找对象或属性,直到找到为止。