一、OGNL简介
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去
存取对象的属性。
二、相对其它表达式语言具有下面几大优势
1、支持对象方法调用,如xxx.doSomeSpecial();
2、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;
3、支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(price*discount),这个表达式会返回80
4、访问OGNL上下文(OGNL context)和ActionContext
5、操作集合对象
6、可以直接new一个对象
三、结合Struts2符号(#、%、$)使用,主要有三种用途
1、访问OGNL上下文和Action上下文,#相当于ActionContext.getContext()
2、用于过滤和投影(projecting)集合,如books.{?#this.price<100}
3、构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}
四、表达式
1、基本对象树的访问:用 . (点号)连接对象和属性
2、对容器变量的访问:用 # (井号)加上表达式
3、使用操作符号
4、数组、ArrayList等容器顺序访问,Map按键查找,容器的构造表达式、对象构建
如:group.users[0]
#session['mySessionPropKey']
{"green", "red", "blue"}构造一个List、
#{"key1" : "value1", "key2" : "value2", "key3" : "value3"}构造一个Map
new Java.net.URL("xxxxxx/")
5、对静态方法或变量的访问,如:@com.javaeye.core.Resource@ENABLE
6、方法调用:group.containsUser(#requestUser)
7、投影或选择:投影 group.userList.{username} 选择group.userList.{? #txxx.xxx != null}
选择操作符有三种: