Struts2 OGNL详解
1.概念:
OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。OGNL表达式为Struts2标签库服务,就像EL表达式为JSTL服务。因此要学习Struts2标签库,就要了解OGNL
2.OGNL层次结构:
注意:上下文中的根对象(ValueStack)可以直接使用名来访问或直接使用它的属性名访问它的属性值。否则要加前缀“#key”。
ValueStack对象。这个对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。当 Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到 ValueStack对象的顶层节点(ValueStack对象相当于一个栈)。
在Action中获得ValueStack对象:ActionContext.getContext().getValueStack()
l Top语法
使用Top获取值栈中的第二个对象:<s:property value="[1].top.对象"/>
l N语法
使用N获取值栈中的第二个对象:<s:property value="[N].对象"/>
l @语法
调用action中的静态方法:<s:property value="@vs1@静态方法"/> vs:值栈 1:表示第一个。
3.OGNL API:
OGNL的API看起来就是两个简单的静态方法:
public static Object getValue( Object tree, Map context, Object root ) throws OgnlException;
public static void setValue( Object tree, Map context, Object root, Object value ) throws OgnlException
1) OGNL表达式的计算是围绕OGNL上下文进行的。
OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。它有一个上下文根对象。
上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。否则要加前缀“#key”。
2) Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。如:<s:propertyvalue="xxx"/>。
3) Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。
4) 值栈(ValueStack) :
可以在值栈中放入、删除、查询对象。访问值栈中的对象不用“#”。
Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。
5) 调用ActionContext的put(key,value)放入的数据,需要使用#访问。
4.OGNL中三个重要的符号
"#"的三种主要用法
访问OGNL上下文和Action上下文,#相当于ActionContext.getContext()
名称 | 作用 | 例子 |
parameters | 包含当前HTTP请求参数的Map | #parameters.id[0]作用相当于 request.getParameter("id") |
request | 包含当前HttpServletRequest的属性(attribute)的Map | #request.userName相当于 request.getAttribute("userName") |
session | 包含当前HttpSession的属性(attribute)的Map | #session.userName相当于 session.getAttribute("userName") |
application | 包含当前应用的ServletContext的属性(attribute)的Map | #application.userName相当于 application.getAttribute("userName") |
attr | 用于按request > session > application顺序访问其属性(attribute) |
|
用于过滤和投影集合
构造Map,如#{key1:value1,key2:value2...}
"%"的用途
在标志的属性为字符串类型时,计算OGNL表达式的值
"$"的主要用途
用于国际化资源文件中,引用OGNL表达式的值
在Struts2配置文件中,引用OGNL表达式