什么是OGNLObject-Graph Navigation Language

一种功能强大的表达式语言。
通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
它使用相同的表达式去存取对象的属性。

这种功能是模板语言的一个重要补充,像JSP2.0,Velocity,jelly等都有类似的功能。
但是ognl比它们完善得多,而且以一个独立的lib出现,方便我们构建自己的框架。

OGNL是通常要结合Struts 2的标志一起使用。主要是#、%和$这三个符号的使用

OGNL支持各种纷繁复杂的表达式。但是最基本的是访问用点串联起来的对象及其引用值。
1. 基本对象树的访问
  对象树的访问就是通过使用点号将对象的引用串联起来进行。
  例如:xxxx,xxxx.xxxx,xxxx. xxxx. xxxx. xxxx. xxxx 
2. 对容器变量的访问
  对容器变量的访问,通过#符号加上表达式进行。
  例如:#xxxx,#xxxx. xxxx,#xxxx.xxxxx. xxxx. xxxx. xxxx 
3. 使用操作符号
  OGNL表达式中能使用的操作符基本跟Java里的操作符一样,除了能使用 +, -, *, /, ++, --, ==, !=, = 等操作符之外,还能使用 mod, in, not in等。
4. 容器、数组、对象
  OGNL支持对数组和ArrayList等容器的顺序访问:例如:group.users[0]
  同时,OGNL支持对Map的按键值查找:
  例如:#session['mySessionPropKey']
  不仅如此,OGNL还支持容器的构造的表达式:
  例如:{"green", "red", "blue"}构造一个List,#{"key1" : "value1", "key2" : "value2", "key3" : "value3"}构造一个Map
  你也可以通过任意类对象的构造函数进行对象新建:
  例如:new Java.net.URL("xxxxxx/")
5. 对静态方法或变量的访问
  要引用类的静态方法和字段,他们的表达方式是一样的@class@member或者@class@method(args):
  例如:@com.javaeye.core.Resource@ENABLE,@com.javaeye.core.Resource@getAllResources
6. 方法调用
  直接通过类似Java的方法调用方式进行,你甚至可以传递参数:
  例如:user.getName(),group.users.size(),group.containsUser(#requestUser)
7. 投影和选择
  OGNL支持类似数据库中的投影(projection) 和选择(selection)。
 投影就是选出集合中每个元素的相同属性组成新的集合,类似于关系数据库的字段操作。投影操作语法为 collection.{XXX},其中XXX 是这个集合中每个元素的公共属性。
  例如:group.userList.{username}将获得某个group中的所有user的name的列表。
 选择就是过滤满足selection 条件的集合元素,类似于关系数据库的记录操作。选择操作的语法为:collection.{X YYY},其中X 是一个选择操作符,后面则是选择用的逻辑表达式。
  而选择操作符有三种:
    ? 选择满足条件的所有元素
    ^ 选择满足条件的第一个元素
    $ 选择满足条件的最后一个元素
  例如:group.userList.{? #txxx.xxx != null}将获得某个group中user的name不为空的user的列表。

来源:
http://baike.baidu.com/view/1347280.htm

 

posted @ 2012-02-07 15:49  万法自然~  阅读(176)  评论(0编辑  收藏  举报