首页 > 代码库 > struts2 ValueStack

struts2 ValueStack

OGNL表达式语言介绍

OGNL是Object Graphic Navigation Language(对象图形导航语言)的缩写。Struts2框架使用OGNL作为默认的表达式语言。

OGNL相对于其他表达式语言的优势:

1、  支持对象方法的调用,如xxx.doSomeSpecial();

2、  支持类静态的方法调用和值访问,表达式的格式:

@[类全名(包括路径)]@[方法名 | 值名],例如: @java.lang.String@format(‘foo%s’,’bar’)或@tutorial.MyConstant@APP_NAME

3、  支持赋值操作和表达式串联

4、  访问OGNL上下文(OGNL context)和ActionContext

5、  操作集合对象

Ognl有一个上下文(Context)的概念,说白了上下文就是一个Map结构,它实现了java.utils.Map接口

 

理解struts2中的ValueStack

ValueStack实际上是一个接口,在Struts2中是利用OGNL时,实际上使用的是实现类该接口的OgnlValueStack类,这个类是Struts2利用OGNL的基础

         ValueStack(值栈):贯穿整个Action生命周期(每个Action类的实例都拥有一个ValueStack对象),相当于一个数据库的中转站,在其中保存当前Action对象和其他相关对象。

         Struts框架把ValueStack对象保存在名为“struts.valueStack”的请求属性中。

在ValueStack对象内部有两个逻辑部分:

         ObjectStack:struts把动作和相关对象压入ObjectStack中---List

         ContextMap:struts把各种各样的映射关系(一些Map类型的对象)压入ContextMap中

Struts会把下面这些映射压入ContextMap中:

Parameters:

Request:

Session:

Application:

Attr:该map将按顺序检索下面属性:request,session,application

 

package cn.itcast.ognl;import java.util.Map;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.util.CompoundRoot;import com.opensymphony.xwork2.util.ValueStack;public class ValueStackAction extends ActionSupport {        public String test(){        System.out.println("ValueStack ********** test");                HttpServletRequest req=ServletActionContext.getRequest();        req.setAttribute("username", "request_username");                Map<String,Object> sessionMap=ServletActionContext.getContext().getSession();        sessionMap.put("username", "session_username");                ServletContext application=ServletActionContext.getServletContext();        application.setAttribute("username","application_username");                                /*         * 获取ValueStack对象         * valueStack对象存储在request的属性中,属性名为“struts.valueStack”         */        /* 方法一: */         HttpServletRequest request=ServletActionContext.getRequest();                ValueStack stack= (ValueStack) request.getAttribute("struts.valueStack");        System.out.println(stack);                /*方法二:*/        stack=ServletActionContext.getContext().getValueStack();        System.out.println(stack);                /*         * 值栈中两个属性用来存数据;         *  public abstract Map<String, Object> getContext();         *  public abstract CompoundRoot getRoot();         *  public class CompoundRoot extends CopyOnWriteArrayList<Object> //CompoundRoot对象是list集合         *           *  context存储键值对信息:request、session、request中的信息         *  root中存储其他信息         */                /*Map<String,Object> o=stack.getContext();        Set<String> sets=o.keySet();        for(String s:sets){            System.out.println("key = "+s);            System.out.println("value = "http://www.mamicode.com/+o.get(s));>*/        /*         * context中存储的好多信息。包括一般信息( ActionContext,actionInvocation,errors, action,struts.actionMapping)和Map集合(request,ServletContext,session,parameters)         */        CompoundRoot  root=stack.getRoot();        for(Object obj:root){            System.out.println(obj);        }        /*         * cn.itcast.ognl.ValueStackAction@207a8313         * com.opensymphony.xwork2.DefaultTextProvider@4b33650d         */                /* ActionContext,ServletContext,ognlContext是一个工具类,可以通过它访问其他数据 */                                        return "ValueStack";    }}

 

技术分享

 

struts2 ValueStack