Struts2-02-OGNL及值栈

来源:互联网 发布:java set用法 编辑:程序博客网 时间:2024/05/22 15:42

一.OGNL简介

OGNL的全称是对象图导航语言 (Object-Graph Navigation Langimge) ,它是一种功能强大的开 源表达式语言,使用这种表达式语言,可以通过它的表达式语法,存取Java对象的任意属性,调用 Java对象的方法,同时能够自动实现必要的类型转换。

二.OGNL 的作用

Struts2 默认的表达式语言就 是 OGNL, 它具有以下特点:
1.支持对象方法调用
例如:objName.methodName()
2.支持类静态方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名(参数)]
例 如 :@ java .lang.String@ format(‘foo % s’,’bar’)
3.支持赋值操作和表达式串联
例如:price=100,discount=0.8,calcuIatePrice(),在方法中进行乘法计算会返回80
4.可以访问OGNL上下文(OGNL context) 和 ActionContext
5.操作集合对象

三.OGNL 的要素

OGNL的操作实际上就是 围 绕 着OGNL结 构 的 三个要素进行,分 别 是 表 达 式 (Expression) 、根 对 象 (Root Object) 、上 下 文 环 境 (Context)

1、 表达式

表达式是整个OGNL的核心,OGNL会根据表达式去对象中取值。所有OGNL操作都是根据表达式进行的。表达式传达了此 次操作要 “做什么 ”。表达式就是一个带有语法含义的字符 串,这个字符中规定了操作的类型和操作的内容。OGNL支持大量的表达式语法,不仅支持这种“链式”对象访问路径,还支持在表达式中进行简单的计算。

2 、 根对象 (Root)

Root对象可以理解为OGNL的操作对象,表达式规定了“做什么”,而Root对象则规定了“操作谁”。OGNL称为对象图导航语言,所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象。

3 、Context对象

实 际 上OGNL的取值还需要一个上下文环境。设 罝 Root对象,OGNL可以对 Root对象进行取值或写值等操作,Root对象所在环境就是OGNL的 上下文环境 (Context) ,上下文环境规定了 OGNL的操作“在哪里进行 “,下文环境Context是一个Map类型的对象,在表达式中访问Context 中非Root的对象,需要使用“# ”号加上对象名称即“#对象名称”的形式,而访问Root对象则不需要加“# ”

这里写图片描述

四.值栈的概念

ValueStack是Struts2的一个接口,字面意义为值栈,OgnlValueStack是ValueStack的实现类,客户端发起一个请求Struts2架构就会创建一个action实例同时创建一个OgnlValueStack值栈实例,OgnlValueStack贯穿整个Action的生命周期,Struts2中使用OGNL将请求Action的参数封装为对象存储到值栈中,并通过OGNL表达式读取值栈中的对象属性。

五.值栈的内部结构

在OgnlValueStack中包括两部分,值栈和map,这个map集合还有个通俗的名字叫做ognl上下文

1.OgnlValueStack类部分源码

public class OgnlValueStack implements Serializable, ValueStack, ClearableValueStack, MemberAccessValueStack {    public static final String THROW_EXCEPTION_ON_FAILURE = OgnlValueStack.class.getName() + ".throwExceptionOnFailure";    private static final long serialVersionUID = 370737852934925530L;    private static final String MAP_IDENTIFIER_KEY = "com.opensymphony.xwork2.util.OgnlValueStack.MAP_IDENTIFIER_KEY";    private static final Logger LOG = LoggerFactory.getLogger(OgnlValueStack.class);    CompoundRoot root;    transient Map<String, Object> context;    Class defaultType;    Map<Object, Object> overrides;    transient OgnlUtil ognlUtil;    transient SecurityMemberAccess securityMemberAccess;    private transient XWorkConverter converter;    private boolean devMode;    private boolean logMissingProperties;

CompoundRoot root;

继承了ArrayList,可以实现压栈和出栈功能,用于存储action实例及请求的参数等。

transient Map < String, Object > context;

即OgnlContext上下文,它是一个map结构的集合,其中存储了一些引用:parameters,request,response,session,application等。上下文的Root为CompoundRoot

2.OgnlContext中的一些引用

属性 该属性对应的功能 parameters 包含当前请求的请求参数 request 包含当前request对象中所有的属性 session 包含当前session对象中所有的属性 application 包含当前application对象中所有的属性 attr 按如下顺序来检索某个属性:request,session,application CompoundRoot 存储了action实例,它作为OgnlContext的Root对象CompoundRoot继承了ArrayList,有压栈和出栈功能,拥有栈的特点,先进后出,后进先出,最后压进栈的数据在栈顶,又名对象栈

六.Struts2对OGNL的继承和改进

Struts2对原OGNL做出的改进就是Root使用CompoundRoot(自定义栈),使用OnglValueStack的findValue方法可以在CompoundRoot中从栈顶向栈底找查找对象的属性值。
CompoundRoot作为OgnlContext的Root对象,并且在CompoundRoot中action实例位于栈顶,当读取action的属性值时会先从栈顶对象中找对应的属性,如果找不到则继续找栈中的其他对象。如果找到则停止查找

这里写图片描述

原创粉丝点击