OGNL是一种功能强大的表达式语言
Struts2默认的表达式语言就是OGNL
作用
- 支持对象方法调用
- 支持类静态方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名|值名]
- 支持赋值操作和表达式串联
- 访问OGNL上下文(OGNL context)和ActionContext
- 操作集合对象
OGNL的要素
- 表达式
表达式是整个OGNL的核心,OGNL会根据表达式去对象中取值。 - 根对象(Root)
Root对象可以理解为OGNL的操作对象,表达式规定了“做什么”,而Root对象则规定了“对谁操作” - Context对象
OGNL的取值还需要一个上下文环境。设置了Root对象,OGNL可以对Root对象进行取值或写值等操作,Root对象所在环境就是OGNL的上下文环境(Context)。上下文环境规定了OGNL的操作“在哪里进行”,上下文环境Context是一个Map类型的对象,在表达式中访问Context中的对象,需要使用“#”号加上对象名称,即“#对象名称”的形式
OGNL入门
- 访问对象的静态方法
@类的全路径名@方法名称(参数列表)
@类的全路径名@属性名称 - 简单访问对象
OgnlContext context = new OgnlContext();
Object obj = Ognl.getValue("'helloword'.length()", context ,context.getRoot());
值栈(ValueStack)
- 什么是值栈:
ValueStack是Struts的一个接口,字面意义为值栈,OgnlValueStack是ValueStack的实现类,客户端发起一个请求struts2架构会创建一个action实例同时创建一个OgnlValueStack值栈实例,OgnlValueStack贯穿整个Action的生命周期,struts2中使用OGNL将请求Action的参数封装为对象存储到值栈中,并通过OGNL表达式读取值栈中的对象属性值 - 值栈的内部结构:
在OgnlValueStack中包括两部分,值栈和map(即Ognl上下文)
- Context:
即OgnlContext上下文,它是一个map结构,上下文中存储了一些引用,parameters、request、session、application等,上下文的Root为CompoundRoot。 - OgnlValueStack:
存储了action实例,他作为OgnlContext的Root对象
拥有栈的特点,先进后出,后进先出
获取值栈对象(常用操作)
- 通过ActionContext对象获取值栈
ValueStack stack1 = ActionContext.getContext().getValueStack();
- 通过request域获取值栈
ValueStack stack2 = ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
##操作值栈(常用操作)
- 对Action中的属性提供get方法的方式
- 调用值栈的push和set方法对值栈进行操作