OGNL是Object-Graph Navigation Language的缩写,叫做对象图导航语言,它是一种功能强大的
表达式语言通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的
结构图,实现字段类型转化等功能。
OGNL实现的最重要的类有两个,一个是OgnlContext类,是OGNL的上下文。其定义部分如下:
(仅仅保留了类的完整申明和其中两个成员变量)
public class OgnlContext extends Object implements Map
{
private Object _root;
private Map _values = new HashMap(23);
}
OGNL上下文类实现了Map接口,
并且使用了Map类型的成员变量_values,用来存放设置到上下文中
的对象。而_root成员变量用以存放OGNL中唯一的那个根对象。可以通过OgnlContext类的setRoot方法设置
该根对象。访问根对象的OGNL表达式可以比一般对象的更简单。根对象的属性可以直接通过属性名访问,
而访问其他对象的属性则要通过 #key 的方式先取得该对象所在的范围,再取出该对象。
OGNL的最重要的符号:#。
不加表示取根对象的属性,加了(#key)表示上下文的map对象中取出实际的value值所代表的对象。
应用举例:
1)、假设有Person类和Dog类,Person类有name和dog属性,Dog类有name属性。将一个Person
实例和一个Dog实例放入OgnlContext的一个实例中。设置Person实例为根对象,那么
" #person.name",表示访问person的name属性,"name"也表示访问person的name属性,因为
person是根对象。要访问dog的name属性则必须"#dog.name"。还可以连串访问,如"dog.name"或
"#person.dog.name"表示访问person对象的dog属性中的name属性。
2)、OGNL将数组和集合看成相同的,可以通过下标访问它们的元素。例如如果person对象有个
数组类型或 集合类型的friends属性,那么"#person.friends[2]",表示访问person的第三个朋友。如果越
界也会有异常。
3)、访问Map类型的属性时使用key来访问。如person有个Map类型的成员变量map,有
“name”-“jacky”这个键值对,那么可以通过"#person.map['name']"来取得"jacky"值
4)、创建Map对象语法:#{'key1':'value1', 'key2':'value2', 'key3':'value3', ...}
5)、创建List类型集合语法:{'aa', 'bb', 'cc', 'dd', ...}
6)、调用类的静态方法或访问静态属性:@package.Classname@method(params),
@package.Classname@staticField。例如@java.lang.Integer@toBinaryString(10),访问Integer类的
toBinaryString静态方法,并传入参数10。因为java.lang.Math是OGNL的默认类,所以可以简化一下,
如@@max(4, 10),表示调用Math的max静态方法
7)、可以使用类似于"new java.util.LinkedList()"的方式用OGNL表达式创建对象。
OGNL对集合的过滤操作:?,^,,$
?:取出集合中所有符合逻辑的元素。语法 collection.{? expression},取出collection中符合expression的元素
^:取出集合中符合逻辑的第一个元素。 collection.{^ expression}
$:取出集合中符合逻辑的最后一个元素。 collection.{$ expression}
ONGL提供了#this用在上面的expression中,用来表示遍历过程中的当前对象
OGNL的投影操作:collection.{expression}
类比数据库中表的记录,过滤相当于选出符合条件的多行数据,投影相当于选出符合条件的某列数据