OGNL基础-转自WebWork2文档中文化计划

OGNL官方文档:http://www.ognl.org/2.6.9/Documentation/html/LanguageGuide/basicExpressions.html

OGNL Basics

 
 

XWork专署语言功能

XWork在OGNL之上提供的最大改进就是支持ValueStack. OGNL操作假设这里只有一个 "根", XWork的ValueStack概念需要这里有很多 "根".

例如, 假设我们使用标准OGNL (不使用XWork), 这时如果有两个对象在 OgnlContext map 中: "foo" -> foo 而 "bar" -> bar, foo对象被配置为唯一的 根(root) 对象. 下面的代码演示了OGNL如何处理这三种情况:

#foo.blah // 返回 foo.getBlah()
#bar.blah // 返回 bar.getBlah()
blah      // 返回 foo.getBlah() 因为foo是根对象

着意味着OGNL允许上下文中保存多个对象, 但是除非你正在试图访问的这个对象是根对象, 否则必须预先跟上一个命名空间如 @bar. 现在让我们看看XWork, 它有一些不同之处...

有用的信息

在 XWork 中, 整个 ValueStack 是上下文的根对象. 不只根据你的表达式从栈 (stack) 中获取对象, 还从对象中获取属性 (例如: peek().blah), XWork有一个特殊的OGNL PropertyAccessor (属性访问器), 它可以自动搜寻栈内的所有实体 (从上到下), 直到找到一个具有与你所寻找的对象和属性匹配的.

例如, 假设栈中包括两个对象: Animal(动物)和Person(人). 两个多项都有 "name" 属性, Animal具有一个 "species" 属性, 而Person有一个 "salary" 属性. Animal是栈顶元素, Person在它后面. 下面的代码片断帮助你理解这个过程:

species    // 调用 animal.getSpecies()
salary     // 调用 person.getSalary()
name       // 调用 animal.getName() 因为animal是栈顶元素

最后一个例子, 这种关系让 animal 的 name 被返回. 一般这就是希望的效果, 但是有时你希望访问的是顺序靠后的对象的属性. 如果这样的话, XWork 还提供了按照索引 (index) 访问VlueStack的方法. 你只需这样做:

[0].name   // 调用 animal.getName()
[1].name   // 调用 person.getName()

通过表达式如 [0] ... [3] 等, WebWork将会截取栈的部分且返回一个 CompoundRoot(复合根) 对象. 获取那个特殊的部分栈 (stack cut), 使用[0].top

ognl 表达式描述
[0].top 将会返回这个部分栈 (stack cut)的栈顶元素, 也就是从整个栈的第0个开始 (这里与top相似)
[1].top 将会返回这个部分栈 (stack cut)的栈顶元素, 也就是从整个栈的第1个开始

访问静态属性

OGNL支持访问静态属性和静态方法. 如OGNL文档指出的, 你可以精确的调用静态内容, 通过如下方法:

@some.package.ClassName@FOO_PROPERTY
@some.package.ClassName@someMethod()

而且, XWork允许你不指定详细的类路径, 通过 "vs" 前缀调用你的action类中的静态属性或方法:

@vs@FOO_PROPERTY
@vs@someMethod()

@vs1@FOO_PROPERTY
@vs1@someMethod()

@vs2@BAR_PROPERTY
@vs2@someOtherMethod()

"vs" 代表 "value stack". 重要的是要注意如果你指定的类名仅仅是 "vs", 将使用栈顶对象的类. 如果你在 "vs" string后面指定了一个数字, 那么取而代之, 将使用栈中靠下面的对象的类.

与WebWork 1.x EL的区别

除了前面的例子和描述, 相对于WebWork 1.x 这里有一些主要的改变. 最大的改变是属性不再通过一个正斜杠 (/) , 而是使用 (.). 还有, 代替使用 ".." 来向上引用栈, 我们现在使用 "[n]" , 这里n是一个正数. 最后, 在WebWork 1.x 你可以通过 "@foo" 访问特别的命名对象 (准确的说是request scope的属性), 但是现在特殊的变量使用 "#foo"访问. 然而, 一定要注意 "#foo" 不再 访问request属性. 因为 XWork 不只是为Web而设计的, 这里没有 "request属性" 这样的概念, 这样 "#foo" 仅仅是OgnlContext中除了根以外的另外一个对象.

老的表达式 新的表达式
foo/blah foo.blah
foo/someMethod() foo.someMethod()
../bar/blah [1].bar.blah
@baz 不直接支持, 但是#baz是类似的
. top 或 [0]

WebWork专署的命名对象

名称
#parameters['foo'] 或 #parameters.foo request parameter ['foo'] (相当于request.getParameter())
#request['foo'] 或 #request.foo request attribute ['foo'] (相当于request.getAttribute())
#session['foo'] 或 #session.foo session attribute 'foo'
#application['foo'] 或 #application.foo ServletContext attributes 'foo'
#attr['foo'] 或 #attr.foo 如果可以访问到则访问PageContext, 否则将分别访问 request/session/application 上下文!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值