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 = "+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_struts