Tuesday, October 17, 2006

翻译webwork user guide上关于OGNL的部分

无论webwork还是struts2都用到了OGNL,学习之余,顺便把webwork user guide上关于OGNL的部分翻译出来

原文路径:http://www.opensymphony.com/webwork/wikidocs/OGNL.html

OGNL意指对象图形导航语言(Object Graph Navigation Language),你可以到http://www.ognl.org看关于OGNL的完整资料。在本文,我们只会讲述OGNL的在WebWork中用到的部分。并就次说明一些基本的OGNL概念。

WebWork使用一个标准的命名上下文来获取OGNL表达式。OGNL所处理的最上一级的对象是一个MAP(通常看作一个上下文MAP)。OGNL有一个根对象(在WebWork里,为GNLValueStack).与根对象一起放入上下文MAP的其他对象包括session/application/request/attrmap。这些对象与根对象是无关的,它们只是一同存在于上下文MAP中而已。所以访问这些对象,需要添加#号。#号是用来告诉OGNL在上下文的其他部分,而不是在根对象中执行查找。


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



请注意还有其他的对象存在于上下文MAP中。这里只是列出了一部分作为例子。actions实际上是放在OGNLValueStack(译:即Root,根对象)里的,所以你可以访问你的bean属性,而无须使用#号。如:
<ww: value="myBean.myProperty">
对于sessions,request, 等其他上下文map中的对象:
<ww:property value="#session.mySessionPropKey"> or
<ww:property value="#session['mySessionPropKey']"> or
<ww:property value="#attr.mySessionPropKey">

Collections (Maps, Lists, Sets)

处理collection在webwrok 中是相当普遍的,这里列出了一些使用select 标签的例子:
list的语法:{e1,e2,e3}. 这将会创造一个包含‘name1','name2','name3的 list,并把 "name2" 作为默认值. 请注意,需要使用 Alt语法 来获得name2的值.

<ww:select label="label" name="name" list="{'name1','name2','name3'}" value="%{'name2'}">


map的语法: #{key1:value1,key2:value2}.这将会创造一个包含map。该MAP中 "foo" 是“foovalue" 的键,"bar"是 "barvalue"的键
<ww:select label="label" name="name" list="#{'foo':'foovalue', 'bar':'barvalue'}">

如果你需要判断一个元素是否已经存在于collection中,你可以用 in 和not in来完成:

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

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

你还可以使用以下的通配符来获取collection中的一个子集:
* ? - 所有匹配选择逻辑的元素
* ^ - 第一个匹配选择逻辑的元素
* $ - 最后一个匹配选择逻辑的元素

比如,要在persion对象中获取子集:

person.relatives.{? #this.gender == 'male'}

Lambda Expressions

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)"></ww:property>

No comments: