OGNL表达式语言介绍
OGNL是Object Graphic Navigation Language(对象图形导航语言)的缩写。Struts2框架使用OGNL作为默认的表达式语言。
OGNL相对于其他表达式语言的优势:
1、 支持对象方法的调用,如xxx.doSomeSpecial();
2、 支持类静态的方法调用和值访问,表达式的格式:
@[类全名(包括路径)]@[方法名 | 值名],例如: @[email protected](‘foo%s’,’bar’)或@[email protected]_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); } /* * [email protected] * [email protected] */ /* ActionContext,ServletContext,ognlContext是一个工具类,可以通过它访问其他数据 */ return "ValueStack"; } }