This page last changed on Dec 14, 2004 by casey.

综述

OGNL就是Object Graph Navigation Language - 请访问http://www.ognl.org查看OGNL完整文档. 本文中我们仅展示几个与WebWork共存的OGNL特性.

Webwork和OGNL

Webwork使用标准命名上下文(namming context)运算OGNL表达式. OGNL处理的定级对象是一个map(通常被称为context map). OGNL有一个根对象的概念 (在webwork术语中, 就是OGNLValueStack). 其他对象和根对象一起放置在context map(简称context)中, 包括session/application/request属性. 这些对象和根对象没有关系, 只是顺序存在于context map中. 因此, 为访问这些对象需要 使用#告诉ognl不要在根对象中查找, 而应当在其他context中查找

|             

                     |--request
                     |
                     |--application
                     |
       context map---|--OgnlValueStack(root)
                     |
                     |--session
                     |
                     |--attr
                     |
                     |--parameters

N注意context map中还有其他对象, 本例中仅引用了一部分. 现在, 活动对象被放入OGNLValueStack因此可以不使用#访问它的属性.
<ww: property value="myBean.myProperty"/>

要访问session, request和其他对象:

ActionContext.getContext().getSession().put("mySessionPropKey", mySessionObject);
<ww: property value="#session.mySessionPropKey"/> or
<ww: property value="#session['mySessionPropKey']"/>

<ww: property value="#attr.mySessionPropKey"/>

集合 (Maps, Lists, Sets)

在WebWork中经常要处理集合(maps, lists, sets), 因此下面是几个使用select标签的例子:
list的语法: {e1,e2}. 它创建一个List, 包含字符串"name1"和"name2".
<webwork:select label="'lebal'" name="'nmae'" list="{'name1','name2'}" />

map的语法: #{key1:value1,key2:value2}. 它创建一个Map, 将"foo"映射到"foovalue", "bar"映射到"barvalue":
<webwork:select label="'lebal'" name="'nmae'" list="#{'foo':'foovalue', 'bar':'barvalue'}" />

有时需要判断一个元素是否包含在集合中. 可以使用下面的操作innot in

<ui:if test="'foo' in {'foo','bar'}">
   muhahaha
</ui:if>
<ui:else>
   boo
</ui:else>

<ui:if test="'foo' not in {'foo','bar'}">
   muhahaha
</ui:if>
<ui:else>
   boo
</ui:else>

选择集合的一个子集(称为投影), 可以在集合中使用通佩符(wildcard).
  • ? - 所有匹配选择逻辑的元素
  • ^ - 第一个匹配选择逻辑的元素
  • $ - 最后一个匹配选择逻辑的元素

从对象Person中获取男性亲属的子集:
person.relatives.{? #this.gender == 'male'}

Lambda表达式

OGNL支持基本的lamba表达式语法可以用来编写简单的函数.

例如:

你可能不会想到会在数学课外在见到这个.
菲波纳切(Fibonacci)数列: if n==0 return 0; elseif n==1 return 1; else return fib(n-2)+fib(n-1);
fib(0) = 0
fib(1) = 1
fib(11) = 89

Lambda表达式的任何内容都包括在括号中. #this变量保存表达式的参数, 它的初始值是11.
<ww:property value="#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)" />
Document generated by Confluence on Dec 14, 2004 16:36