OGNL官网部分翻译

语法

 

表达式

这一部分阐述了OGNL表达式每一个元素的细节。

常量

OGNL有下列的种类的常量:

字符串,就像在java中一样:由单引号或双引号界定,带有全套的字符转义

字符,也像在java中一样:由单引号界定,带有全套的字符转义

数字,比在java中多一些种类。除了java的ints,longs,floats,doubles,OGNL让你指定BigDecimal(大小数的)用一个“b“或“B”后缀,和BigIntegers(大整数)以一个“h“或”H“后缀。(考虑”huge“---我们选择”h“用于大整数因为它不会和16进制数冲突)。

布尔(true和false)

null值

属性的引用

OGNL对待不同种类的对象是不同的在它处理属性引用中。映射把全部的属性引用看作查询或存储,属性名作为键。列表和数组对待数字属性是相似的,属性名作为索引,但是字符串属性的工作方式跟ordinary对象相似。Ordinary对象(也就是全部的其他种类)仅仅能处理字符串属性和这样做通过使用“get“和“set”方法(或者“is”和“set”),如果对象有它们的话,或者一个字段带有被给予的名字。

注意这里的新术语。属性“名”可以是任何类型,不仅仅是字符串。但是想引用非字符串的属性,你必须使用我们之前称为“index”的符号。

例如,想要获得数组长度,你可以使用这个表达式

array.length

但是,想要获得数组的元素0,你必须使用一个表达式像这样:

array[0]

注意java集合有一些特殊的属性和他们关联。

索引

 

方法调用

OGNL调用方法跟java有点不同,OGNL是被解释的和必须选择正确的方法在运行时,因为没有额外的被提供参数的类型信息。OGNL总是选择最指定的方法在它能发现方法的类型匹配提供的参数类型。如果这里有两个或更多的方法同样匹配被给予的参数,它们中的一个将被任意匹配。

特比,一个空参数匹配全部非原始的类型,和因此是最有可能导致一个意外的方法被调用的。

注意一个方法的参数是被逗号分隔的,和因此逗号运算符不能被使用除非它被包括在圆括号内。例如,

method( ensureLoaded(), name )

是对2个参数方法的调用,

method( (ensureLoadED(), name) )

是对1个参数方法的调用。

变量引用

OGNL有一个简单的变量模式,它让你存储中间的结果和再一次使用他们,或者就是命名它们来使一个表达式更容易理解。在OGNL中全部的变量是全局的对于整个表达式。你引用一个变量使用一个#号在它的名字前面,像这样:

#var

OGNL也存储当前对象为this变量在一个表达式的计算中,它能被引用就像其他变量一样。例如,下列的表达式操作了listener的数量,返回number二倍,如果它超过100的话,否则给number的数量加20

listeners.size().(#this > 100? 2*#this : 20+#this)

OGNL能调用一个给变量初始化了值的映射。

想要强制分配一个值给一个变量,简单的写一个分配语句形如变量引用在左侧:

#var = 99

圆括号表达式

正如你预期的,在圆括号内的表达式被计算作为一个单元,除了周围的任何操作符。这能被用于强制一个执行顺序不同于OGNL操作符的顺序。它也是在一个方法参数中使用逗号运算符的唯一方式

链式子表达式

集合构建

列表

想创建一个对象列表,用花括号闭合一个表达式列表。正如方法中的参数,这些表达式不能使用逗号运算符除非它被圆括号包围。这里是一个例子:

name in {null,”Untitled”}

这测试了是否name属性是null或者等于”Untitled”。

上述被描述的语法将创建一个List接口实例。The exact subclass is not defined。

原生数组

有时候你想要创建Java原生数组,例如int[]或者Integer[]。OGNL支持这些,方式跟构造函数通常被创建相似,但是允许原生数组初始化从一个存在的列表活着一个被给予尺寸的数组。

new int[] {1,2,3}

这创建了一个新的int数组包含着3个整数1,2,3。

想要创建一个数组元素全部为null或者0个元素,使用可替代的尺寸构造器

new int[5]

这创建了一个int数组带有5个位置,全部都被初始化为0。

映射

映射也能被创建使用一个特殊的语法。

#{ “foo” : “foo value”, “bar” : “bar value” }

这创建了一个映射同时初始化了”foo”和”bar”。

希望选择指定映射类的高级用户能指定类在花括号之前。

#@java.util.LinkedHashMap@{ “foo” : “foo value”, “bar” : “bar value” }

上述的例子将会创建一个JDK1.4类LinkedHashMap的实例,确保元素的插入顺序是被保护的。

通过集合构建项目

从集合中选择

选择第一个匹配

选择最后一个匹配

调用构造器

调用静态方法

获得静态字段

表达式计算

虚拟Lambda表达式

集合的虚拟属性

不同于java操作符的操作符

设置值vs获得值

强制对象转换为类型

解释对象作为布尔值

解释对象作为数字

解释对象作为整数

解释对象作为集合

扩展:OGNL语言参考

操作符

posted @ 2017-11-13 11:26  clause_a  阅读(369)  评论(0编辑  收藏  举报