OGNL常用语法总结

## OGNL常用语法总结

OGNL(Object-Graph Navigation Language),即对象图导航语言,是Struts2默认的表达式语言.

  • 访问属性
    OGNL对不同类型的对象采取不同的属性访问方式。

    1. Map对象
      找到键对应的值,例如map["key"],等价于map.key
    2. List或数组对象
      采用下标访问元素,例如array[1]list[0]
      对象的属性访问与map类似
      例如,若要访问数组的长度,可以使用array.length,或者array["length"]
    3. 普通Java对象
      调用对象的get、set方法,如student.name
  • 访问变量
    ONGL有一个简单可变的表,用来存储中间结果并再次使用它,或者是用来命名一些东西使得表达式更容易理解。OGNL中的所有变量对整个表达式而言是全局变量。你可以这样访问它:#var
    ONGL还存储表达式中每一个.号后的当前变量,下面这个例子将根据数组的长度返回相应的值,若长度大于100,返回两倍该值,反之返回该值加上20的结果:
    students.size().(#this > 100? 2*#this : 20+#this)
    此处的#this指代数组的大小(students.size())。
    ※注:这和后面提到的投影、选择的#this含义不同

    若要对一个变量赋值可以像这样做:#var = 99

  • 集合对象的构造

    1. Lists
      见如下语句:name in {null,"Untitled"}
      该例子中判断name属性是否为空(null)或者等于”Untitled”,此处构造了一个临时List对象,由此可知,由花括号扩起来的一组值构造了一个List。

    2. Native Arrays
      new int[] {1,2,3}new int[5]

    3. 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>  

参考文献:
Apache Commons
Object-Graph Navigation Language

展开阅读全文

没有更多推荐了,返回首页