Java EE框架开发技术与案例教程
上QQ阅读APP看书,第一时间看更新

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中查找对象或属性,直到找到为止。