支持对象方法调用。例如: objName.methodName()。
支持类静态方法调用和值访问,表达式的格式为@类全名(包含包路径)@方法名(值名)。例如: @java.lang.String@format('foo %s', 'bar')。
支持赋值操作和表达式关联。例如: price = 100, discount = 0.8, 在方法calculatePrice()中进行乘法计算会返回80。
访问OGNL上下文(ognl Context) 和 ActionContext。
操作集合对象。
ognl的操作实际上就是围绕着ognl结构的三个要素而进行的,分别是表达式、根对象、上下文环境, 下面分别讲解这三个要素。
ognl的getValue()方法中有两个参数: 第一个参数是是表达式。表达式是整个ognl的核心,ognl会根据表达式去对象中取值。所有ognl操作都针对表达式解析后进行的。它表明了此次ognl操作要 “做什么”。表达式就是一个带有语法含义的字符串,这个字符串规定了操作的类型和操作的内容。ognl支持大量的表达式语法,不仅支持这种 “链式” 对象访问路径,还支持在表达式中进行简单的运算。
OGNL的getValue()方法中的第二个参数就是Root对象,Root对象可以理解为OGNL的操作对象,表达式规定了 “做什么”, 而Root对象则规定了 “对谁操作”。OGNL称为对象图导航语言,所谓对象图,即以任意一个对象为根,通过OGNL可以访问这个对象关联的其他对象。
实际上OGNL的取值还需要一个上下文环境。设置了Root对象,OGNL可以对Root对象进行取值或写值等操作,Root对象所在环境就是OGNL的上下文环境(Context)。上下文环境规定了OGNL的操作 “在哪里进行”。上下文环境Context是一个Map类型的对象,在表达式中访问Context对象,需要使用 "#" 号加上对象名称, 即 “#对象名称” 的形式。
package cn.lacknb.ognl;
import ognl.Ognl;
import ognl.OgnlException;
import java.util.HashMap;
import java.util.Map;
public class TestOgnlContext {
public static void main(String[] args) throws OgnlException {
User user = new User();
Group g = new Group();
Branch b = new Branch();
b.setBranchId("test");
g.setBranch(b);
user.setGroup(g);
// 用java来导航访问
System.out.println("java方式-" + user.getGroup().getBranch().getBranchId());
// 利用OGNL表达式访问
System.out.println("OGNL方式-" + Ognl.getValue("group.branch.branchId", user));
// 设置user对象的username的属性值为itcast
user.setUsername("itcast");
// 创建context对象
Map context = new HashMap();
// 将user对象放入context对象中
context.put("u", user);
// 输出使用OGNL表达式获取context对象中的user对象的username值
System.out.println("获取context中数据结果为-" + Ognl.getValue("#u.username", context, user));
System.out.println("获取context中对象结果为-" + Ognl.getValue("#u.group.branch.branchId", context, user));
}
}
输出结果
java方式-test
OGNL方式-test
获取context中数据结果为-itcast
获取context中对象结果为-test