第三方的开源框架,全名 对象图导航语言,是Struts默认的表达式语言
OGNL有个实现了Map接口的上下文Context
想要理解OGNL,首先我们要来看Struts2一个重要的值栈(ValueStack)的概念
ValueStack
ValueStack是一个接口,Struts2中使用的OGNL表达式实际是使用了实现了ValueStack接口的OgnlValueStack类
ValueStack贯穿整个Action的生命周期,每一个Action都有一个ValueStack,用来保存Action相关对象。
Struts把ValueStack对象保存在一个名为 struts.valueStack 的属性中
ValueStack又包含两个重要的部分:
1.ObjectStack:主要用来存放action中的相关动作和对象 【List形式】
2.ContextMap:主要用来存放各种映射关系,比如:parameters、request、session、application、attr【Map形式】
OGNL Context
OgnlValueStack类中包含两个重要的属性:root和context
root是一个ArrayList对象
context是一个OgnlContext对象,本质也是一个Map对象。而这个context对象中包含一个顶级对象root,context里面的root其实就是Struts2将OgnlValueStack的root对象赋值给了它,而这个顶层对象root中包含了Action的实例对象,所以通过这个root对象可以很轻易的获取到Action中的属性,而且这个顶层对象调用的时候前面不需要加#,而request,session,attr这些属性则需要。
当Struts2接收请求的时候会自动创建ActionContext、ValueStack、action对象,然后将action对象存放到ValueStack对象中,所以OGNL可以很轻易的访问到action中的数据
特别注意:Struts2中OGNL表达式需要配合Struts标签才能使用
ActionContext
ServletActionContext.getRequest().setAttributet"username", "username.request");
ServletActionContext.getServletContext().setAttribute("username", "username application");
ServletActionContext.getContext().getSession().put("username", "username.session");
ValueStack valueStack= ServletActionContext.getContext().getValueStack());
System.out.println(valueStack "+ValueStack);
valueStack.set("username", "username valueStack");
ActionContext提供了对ognl上下文对象中数据操作的方法.