OGNL表达式
OGNL:Object Graph Navigation Language  对象图导航语言
 
 
 
 
 
 
 
 
 
![]() 
 
 
 
 
 
 
 
 
 
 
 
OGNL表达式的计算是围绕OGNL上下文来进行的,OGNL上下文实际上就是一个Map对象。
上下文可以包含一个或多个JavaBean对象
写表达式时,若没有指定使用上下文中的哪一个对象,那么根对象将被假定为表达式所依据的对象。
如果访问的不是OGNL上下文中的根对象,那么必须在前面加上一个名称空间
ognl表达式的基础单元是导航链(navigation chain)
最简单的链包括:属性名,方法调用,数组索引
一个链简单地使用链中先前链接的结果作为下一步计算的当前对象。
OGNL支持的常量类型:
1.字符串常量
2.字符常量
3.数值常量,如123(int常量),123l(long常量),123b(BigDecimal常量),123h(BigInteger常量)
4.布尔常量 true和false
5.null常量
操作符
1.逗号或序列操作符,整个表达式的值是第二个表达式的值 
2.花括号操作符{},用于创建判断一个值是否在集合中。
3.int和not in,判断一个值是否在集合中。
调用静态方法和静态字段,可以使用如下的语法模式:
@class@method(args)
@class@field
调用构造方法
必须使用完整的限定类名,例如new java.util.ArrayList(),而不是new ArrayList()
索引
数组和列表索引,array[0],list[0]
JavaBean的索引属性(难理解,空过去)
OGNL对象索引属性:
JavaBean的索引属性只能使用整型作为索引,OGNL扩展了索引属性的概念,可以使用任意的对象来作为索引。
session.attribute["foo"]相当于session.getAttribute("foo");
对集合进行操作
1.创建集合
创建列表:{"a","adfa","adfas"}创建了一个带有3个元素的List对象,元素的类型是String。
创建数组:new int[]{1,2,3},array[0],array.length
创建Map:#{"key1":"value1","key2":"value2“,...,"keyN":"valueN"}
Map元素通过key来访问,如map["key1"]
集合的伪属性:
投影
OGNL提供了一种简单的方式在一个集合中对每一个元素调用相同的方法,或者抽取相同的属性,并将结果保存为一个新的集合。
#employees.{name}将返回所有雇员名字的列表
在投影期间,使用#this变量来引用迭代中的当前元素
objets.{#this instanceof String?#this:#this.toString()}
选择
OGNL提供了一种简单的方式来使用表达式从集合中选择某些元素,并将结果保存到新的集合中。
#employees.{?#this.salary>3000}
#employees.{^#this.salary>3000}:表示从集合中只选择第一个匹配的元素,并将其作为一个列表返回。如果任何元素都没有匹配成功,那么结果将是一个空列表。
若把^换成$,则是取出最后一个元素。
lambda表达式
语法:   :[...]
表达式只能使用一个参数,这个参数可以通过#this变量来引用。
#fact=:[#this<=1?1:#this*#fact(#this-1)],#fact(30H)//声明一个使用递归来计算阶乘的函数,然后调用
#fib=:[#this==0?0:#this==1?1:#fib(#this-2)+#fib(#this-1)],#fib(11)//计算斐波那契数列,然后调用
OGNL的类型转换
OGNL支持将一个对象转换为Boolean、Number、Integer和集合类型,至于具体的转换过程,实际使用中可不考虑。
Struts2在OGNL基础上的增强
支持了值栈(ValueStack),允许存在许多虚拟根对象。
Struts2把ValueStack作为根对象,所以访问对象不用加“#”
[N]语法(N是从0开始的整数):指定从哪一个位置开始向下查找对象的属性。
top关键字:用于获取栈顶的对象
访问静态成员
除了使用标准的OGNL表达式访问静态字段和静态方法外,Struts2还允许不指定完整的类名,而是通过"vs"前缀来调用保存在栈中的对象的静态字段和静态方法。
例如
@vs@FOO_PROPERTY
@vs@someMethod()
@vs1@someMethod()
vs后跟一个数字,将使用栈中指定位置处的对象的类
值栈中的Action实例
Struts2框架总是把Action实例放置在栈顶。
<s:property value="username"/>
<s:property>标签输出栈顶的Action实例的username属性值。
Struts2中的命名对象
parameters:访问请求参数
如#parameters['id']或#parameters.id
request:用于访问请求属性
如:#request['user']或#request.user
session:
application:
attr:
如果PageContext可用,则访问PageContext,否则将依次搜索request、session,application对象
与JSP2.1的冲突:#字符被JSP内置的表达式语言EL所使用,再在OGNL使用#操作符可能会导致一些问题。
在web.xml中添加如下配置,来禁止JSP EL的使用:
<jsp-config>     
     <jsp-property-group>
          <url-pattern>*.jsp</usl-pattern>
          <el-ignored>true</el-ignored>
     </jsp-property-group>
</jsp-config>
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号