## OGNL常用语法总结
OGNL(Object-Graph Navigation Language),即对象图导航语言,是Struts2默认的表达式语言.
访问属性
OGNL对不同类型的对象采取不同的属性访问方式。- Map对象
找到键对应的值,例如map["key"]
,等价于map.key
- List或数组对象
采用下标访问元素,例如array[1]
、list[0]
对象的属性访问与map类似
例如,若要访问数组的长度,可以使用array.length
,或者array["length"]
- 普通Java对象
调用对象的get、set方法,如student.name
- Map对象
访问变量
ONGL有一个简单可变的表,用来存储中间结果并再次使用它,或者是用来命名一些东西使得表达式更容易理解。OGNL中的所有变量对整个表达式而言是全局变量。你可以这样访问它:#var
。
ONGL还存储表达式中每一个.
号后的当前变量,下面这个例子将根据数组的长度返回相应的值,若长度大于100,返回两倍该值,反之返回该值加上20的结果:
students.size().(#this > 100? 2*#this : 20+#this)
此处的#this
指代数组的大小(students.size())。
※注:这和后面提到的投影、选择的#this含义不同若要对一个变量赋值可以像这样做:
#var = 99
集合对象的构造
Lists
见如下语句:name in {null,"Untitled"}
该例子中判断name属性是否为空(null)或者等于”Untitled”,此处构造了一个临时List对象,由此可知,由花括号扩起来的一组值构造了一个List。Native Arrays
new int[] {1,2,3}
或new int[5]
Maps
Maps的构造采用一种独特的语法:#{"foo":"foo value", "bar":"bar value"}
此处相当于构造了一个键值均为字符串的Map,键值的类型不一定得是String,也可以是int等类型。
还可以通过调用构造函数构造特定类型的Maps,如
#@java.util.LinkedHashMap@{"foo":"foo value","bar":"bar value"}
集合的投影(Projection)
投影的含义是:对集合的每个元素执行同一操作,并返回一个与原集合大小相同的新集合。
下面是一个例子:objects.{#this instance of String ? #this : #this.toString()}
这个例子返回一个新集合,其元素为原集合元素的字符串值。因为这条表达式对每个集合元素进行一个判断,如果元素是String类型则保持原值,反之调用该元素的toString()方法返回其字符串值。
※注:此处的#this指代集合元素,而不是集合对象本身集合元素的选择(Selection)
OGNL提供了一种简单的方式来从一个集合中拣选出符合特定要求的元素。
其语法如下:listeners.{? #this instanceof ActionListener}
这个例子返回监听器集合中的所以类型为ActionListener的监听器。
除此之外,还可以选择出集合中首个或最后一个符合要求的元素,其语法依是:objects.{^ #this instanceof String}
objects.{$ #this instanceof String}
※注:此处的#this指代集合元素,而不是集合对象本身
OGNL中重要的3个符号:#、%、$
1.#符号
#符号的用途一般有三种:
访问非根对象属性,例如
#session.msg
,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext.getContext()。#session.msg
表达式相当于
ActionContext.getContext().getSession(). getAttribute("msg")。
用于过滤和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name==’pla1’}.{age}[0]。
用来构造Map,例如:
#{'foo':'foo value', 'bar':'bar value'}
。
2.%符号
%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。
例如:<s:url value="%{items.{title}[0]}"/>
3.$符号
$符号主要有两个方面的用途:
在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在 min同 {max}之间。
在Struts 2框架的配置文件中引用OGNL表达式,例如:
<validators> <field name="intb"> <field-validator type="int"> <param name="min">10</param> <param name="max">100</param> <message>BAction-test校验:数字必须为${min}为${max}之间!</message> </field-validator> </field> </validators>