OGNL(Object-Graph Navigation Language)的全称是对象图导航语言,它是一种功能强大的开源表达式语言,比EL(只能从域或内置对象中)表达式更强大,使用这种表达式语言,可以通过某种表达式语法,OGNL可以存取Java任意对象的任意属性,调用Java对象的方法,同时能够自动实现必要的类型转换。如果把表达式看作是一个带有语义的字符串,那么OGNL无疑成为了这个语义字符串与Java对象之间沟通的桥梁。
Struts2的默认表达式语言就是OGNL
1.支持对象方法调用 objName.methodName()
2.支持类静态方法调用和值访问 @java.lang.String@format('name','mark')
3.支持赋值操作和表达式串联 price=100,calculatePrice()
4.支持访问OGNL上下文(OGNL context)和ActionContext
5.支持操作集合对象
OGNL的操作实际上就是围绕着OGNL结构的三个要素而进行的,分别是表达式(Expresssion)、根对象(Root Object)、上下文环境(Context)
表达式是整个OGNL的核心,OGNL会根据表达式去对象中取值。所有OGNL操作都是针对表达式解析后进行的。它表明了此次OGNL操作要"做什么"。表达式就是一个带有语法含义的字符串,这个字符串规定了操作的类型和操作的内容。OGNL支持大量的表达式语法,不仅支持这种"链式"对象访问路径,还支持在表达式中进行简单的计算
实际上OGNL的取值还需要一个上下文环境。设置了Root对象,OGNL可以对Root对象进行取值或写值等操作,Root对象所在环境就是OGNL的上下文环境(Context)。上下文环境规定了OGNL的操作"在哪里进行"。上下文环境Context是一个Map类型的对象,在表达式中访问Context中对象,需要使用"#"号加上对象名称,即"#对象名称"的形式
实际上OGNL的取值还需要一个上下文环境,设置了Root对象,OGNL可以对Root对象进行取值或写值等操作,Root对象所在环境就是OGNL的上下文环境(Context)。上下文环境规定了OGNL的操作"在哪里进行"。上下文环境Context是一个Map类型的对象,在表达式中访问Context中的对象,需要使用"#"号加上对象名称,即"#对象名称"的形式
public void testOGNL(){
//获得上下文环境Context
OgnlContext context = new OgnlContext();
//获得根对象Root
Object root = context .getRoot();
//执行表达式
Object obj = Ognl.getValue("'helloWorld'.length()",context ,root);
}
public void testOGNL(){
//获得上下文环境Context
OgnlContext context = new OgnlContext();
//获得根对象Root
Object root = context .getRoot();
//执行表达式 @类名@方法名
Object obj = Ognl.getValue("@java.lang.Math@random()",context ,root);
}
public void testOGNL(){
//获得上下文环境Context
OgnlContext context = new OgnlContext();
//向root传入Java对象
context.setRoot(new User("mark", 15));
//获得根对象Root
Object root = context .getRoot();
//执行表达式 获取对象中属性值
Object username = Ognl.getValue("username",context ,root);
Object age = Ognl.getValue("age",context ,root);
}
public void testOGNL(){
//获得上下文环境Context
OgnlContext context = new OgnlContext();
//获得根对象Root
Object root = context .getRoot();
//向Context传入值
context.put("username","mark");
//执行表达式 获取Context中属性值
Object username = Ognl.getValue("#username",context ,root);
}