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、支持赋值操作和表达式串联,如price=100, discount=0.8,
calculatePrice(),这个表达式会返回80;
4、访问OGNL上下文(OGNL context)和ActionContext;
5、操作集合对象。
Ognl有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现
了java.utils.Map的接口.
理解Struts2中的 ValueStack
ValueStack实际是一个接口,在Struts2中利用OGNL时,实际上使用的是实现了该接口的OgnlValueStack类,这个类是Struts2利用OGNL的基础
ValueStack对象).相当于一个数据的中转站.在其中保存当前
Action对象和其他相关对象.
在ValueStack对象的内部有两个逻辑部分:
ObjectStack: Struts 把动作和相关对象压入ObjectStack中--List
ContextMap: Struts 把各种各样的映射关系(一些Map 类型的对象) 压入ContextMap中
Struts会把下面这些映射压入ContextMap中
parameters: 该Map 中包含当前请求的请求参数
request: 该Map 中包含当前request 对象中的所有属性
session: 该Map 中包含当前session 对象中的所有属性
application:该Map 中包含当前application 对象中的所有属性
attr:该 Map按如下顺序来检索某个属性: request, session, application
理解OGNL Context
* 其中root本质上是一个ArrayList.
* 而context是一个Map(更确切的说是一个OgnlContext对象)
注:Struts2将OgnlValueStack的root对象赋值给了OgnlContext中的_root对象,在OgnlValueStack的root对象中,保存着调用Action的实例,因此,在页面上通过Struts2标签访问Action的属性时,就不需要通过#号来引用
总结:ognl Context包含 ObjectStack属性和ContextMap属性
理解ActionContext