Struts2的OGNL表达式语言

 

支持Struts2的OGNL表达式语言(2009-04-25 01:11:36)

OGNL(Object Graph Navigation Language)是一种表达式语言,使用它可以使表达式与java对象中的getter和setter属性绑定,

且一个OGNL表达式可以进行存和取两方面的操作.

1).使用OGNL的好处

  • 是一种 可以把GUI元素和model object绑定的语言!且通过OGNL的TypeConverter

           机制可以更容易实现值类型的的转换!

  • 可以把Web组件和后台的model 绑定(WebOGNL, Tapestry,WeboWork,WebOjbects)

2).OGNL表达式

OGNL使用集合

使用Collection中的元素须用索引,如:得到array中第一个元素表达式为array[0]

List

            例子:           name in{null,"init"}       这个例子 当name属性是 空或"init"返回true ,

      而在这个过程中会创建List接口的一个实例,具体的子类没有指定

本地Arrays     OGNL支持创建Java本地数组!   且允许给定存在的list或设定数组的的大小

                             new int[] {1,2,3}   创建一个int 数组

                               new int[5]   创建了一个int数组,它的元素的值为0

Maps    创建Map      #{"foo":"fool value","bar":"bar value"}

        我们甚至可以指定一个特定的java Map Class 去创建Map

        #@java.util.LinkedHashMap@{"foo":"foo value","bar":bar value"};

        Java Collection各自有一些特殊的属性

Collection Special Properties
Collection(子类有Map List Set) size         集合的大小
isEmpty   如果集合为空值为true
List iterator 得到此list的迭代器
Map keys      得到一个包涵所有键值的Set
values 得到一个包括所有值的Collection
Set iterator 得到此Set的迭代器
Iterator next       得到集合中的下一个object
hasNext如果集合中有下一个object则返回true
Enumeration next 如上
hasNext如上
nextElement 和next一样的作用
hasMoreElements和hasNext一样作用

     

 

OGNL调用JavaBean 索引属性

JavaBean索引属性的格式如下

             public PropertyType[] getPropertyName()

             public void setPropertyName(propertyType[] anArray)

            public PropertyType getPropertyName(int index);

            public void setPropertyName(int index,PropertyType value)

OGNL可以很容易地通过索引存取这些属性, Example

         someProperty[2]

         在这个例子中OGNL会自动找到getSomeProperty(2)或存到setSomeProperty (2,value)中!

调用OGNL对象索引属性

         对象索引属性格式

           public PropertyType getPropertyName(IndexType index)

            public void setPropertyName(IndexType index,PropertyType value)

            PropertyType 和IndexType 必需跟集合和get方法中的类型相配

 

调用方法

              OGNL调用方法和Java调用方法有一点区别,因为OGNL是被解释的并且必需在运行时选择正确的方法,所以OGNL调用方法时除了提供所需要参数没有额外的类型信息,OGNL选择和提供的参数最配的方法,如果有两个或更多的方法符合匹配,它们中的一个会任意的被选择(在WebWork中会选择ValueStack上面的方法)

             特别一提的是 ,null可以匹配所有非基础类型,所有它通常会导致一个不确定的方法被调用

变量的调用

          OGNL有一个简单的变量配置,在这儿你可以存储中间值和重新使用这些中间值,或者仅仅命名以使表达式更易理解! 在OGNL中所有变量都是全局的,使用变量的格式是"#variable"

          OGNL把当前的object在每点的表达式值存放在"this"这个变量中,而且"this"可以像其它变量一样使用!例:

                    listeners.size().(#this>100?2*this:20+#this) 如果listeners中的元素大于100会返回元素数量的两倍,否则数量加上20

          可以显式地给变量赋值,只要在变量的后边写一个表达式即可

               #var -99


一.运算符
OGNL借用了java的大多数符号,而且它还加了一些新的符号,
如下表:
符号 getValue()要注意事项 setValue()注意事项
e1,e2
         顺序运算符
e1和e2都会使用同一个源对象计算值,
且会返回e2的计算值
getValue使用e1
setValue使用e2
e1=e2
      等于运算符
getValue使用e2,setValu使用e1,且e2的结果作为目标的对象
e1?e2:e3
e1||e2,e1 or e2
e1|e2,e1 bor e2
e1^e2, e1 xor e2
e1&e2 ,e1 band e2
e1==e2,e1 eq e2
e1!=e2, e1 neq e2
e1<e2,e1 lt e2
e1<=e2 ,e1 lte e2
e1>e2 ,e1 gt e2
e1>=e2 ,e1 get e2
e1 in e2
e1 not in e2
e1<< e2,e1 shl e2
e1>>e2 ,e1 shr e2
e1>>> e2,e1 ushr e2
e1+e2
e1-e2

e1*e2
e1/e2
e1%e2

+e
-e
!e
~e
e instanceof class
e.method(args)

e.property

e1[e2]

e1.{e2}

e1.{?e2}
         选择
e1.(e2)
   子表达式的计算
e1(e2)
表达式计算
constant
        常量
(e)
        将表达式加入括号内
method(args)
       方法调用
property
       属性调用
[e]
     通过索引得到值
{ e,.....}
     创建List
#variable
     上下文中变量的引用
@class@method
(args)
     静态方法调用
@ class@field
    静态字段调用
new class(args)
构造器调用
new array-component-class[] {e,....}
数组创建
#{e1:e2,...}
     Map创建

#@classname@{e1:e2,....}
   创建指定Map子类型的Map

:[e]
   Lambda表达式

这些是最

http://blog.sina.com.cn/s/blog_5c0522dd0100cnbi.html

你可能感兴趣的:(Struts2的OGNL表达式语言)