OGNL详解(单纯的OGNL,并未和struts2内容关联)

       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}

        类比数据库中表的记录,过滤相当于选出符合条件的多行数据,投影相当于选出符合条件的某列数据




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值