`

ognl----

阅读更多

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 上下文!
评论

相关推荐

    开发工具 ognl-3.1.12

    开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12...

    ognl-3.1.12-API文档-中文版.zip

    赠送jar包:ognl-3.1.12.jar; 赠送原API文档:ognl-3.1.12-javadoc.jar; 赠送源代码:ognl-3.1.12-sources.jar; 赠送Maven依赖信息文件:ognl-3.1.12.pom; 包含翻译后的API文档:ognl-3.1.12-javadoc-API文档-...

    ognl-3.0.5-sources.jar

    ognl-3.0.5源码 本人最近在研究s2sh源码,如有需要请留言。 在使用过程中如果有问题可联系,让我们开始学习s2sh源码总动员吧!

    ognl-2.6.11.jar 官方源码

    **ognl-2.6.11.jar 官方源码详解** OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它被广泛应用于许多Java框架,如Struts2,因为它允许动态地访问和操作对象的...

    ognl-2.6.11.jar

    **标题:“ognl-2.6.11.jar”** **描述:“struts2中ognl-2.6.11.jar源码文件”** **标签:“ognl”,“ognl-2.6.11”** 在Java Web开发领域,`ognl-2.6.11.jar`是一个关键的组件,它属于OGNL(Object-Graph ...

    mina-integration-ognl-2.0.0-M4.jar

    mina-integration-ognl-2.0.0-M4.jar mina-integration-ognl-2.0.0-M4.jar

    ognl-3.0-jars.zip

    这个压缩包包含两个JAR文件,分别是源码版本(ognl-3.0-sources.jar)和编译后的二进制版本(ognl-3.0.jar)。 **Java JAR文件** Java Archive (JAR) 文件是Java平台上的一个标准打包格式,它将多个类文件、资源...

    ognl-3.0.jar

    ognl-3.0.jar ognl-3.0.jar

    ognl-3.2.21-API文档-中文版.zip

    赠送jar包:ognl-3.2.21.jar; 赠送原API文档:ognl-3.2.21-javadoc.jar; 赠送源代码:ognl-3.2.21-sources.jar; 赠送Maven依赖信息文件:ognl-3.2.21.pom; 包含翻译后的API文档:ognl-3.2.21-javadoc-API文档-...

    ognl-2.7 源码 和 jar包.rar

    OGNL-2.7源码和jar包的提供,意味着我们可以深入理解其内部工作机制,并在需要时进行自定义或调试。 **1. OGNL的基本概念** OGNL的主要功能是提供一种简洁的语法来访问和操作Java对象的属性。例如,`user.name`表示...

    ognl-3.0.4.jar

    ognl-3.0.4.jar ognl-3.0.4.jar

    ognl-3.0.14.jar

    ognl-3.0.14.jar

    ognl-3.1.15.jar

    ognl-3.1.15.jar

    ognl-3.2.21-API文档-中英对照版.zip

    赠送jar包:ognl-3.2.21.jar; 赠送原API文档:ognl-3.2.21-javadoc.jar; 赠送源代码:ognl-3.2.21-sources.jar; 赠送Maven依赖信息文件:ognl-3.2.21.pom; 包含翻译后的API文档:ognl-3.2.21-javadoc-API文档-...

    ognl.jar资源包

    camel-ognl-1.6.4.jar, camel-ognl-2.8.1.jar, com.springsource.org.ognl-2.6.9.jar, com.springsource.org.ognl-sources-2.6.9.jar, ognl-2.5.1.jar, ognl-2.6.11.jar, ognl-2.6.3.jar, ognl-2.6.5.jar, ognl-...

    ognl-3.0.5.jar

    ognl-3.0.5.jar 日志开源组件 OGNL表达式 ognl-3.0.5.jar 日志开源组件 OGNL表达式

    JavaEE源代码 ognl-2.6.11

    JavaEE源代码 ognl-2.6.11JavaEE源代码 ognl-2.6.11JavaEE源代码 ognl-2.6.11JavaEE源代码 ognl-2.6.11JavaEE源代码 ognl-2.6.11JavaEE源代码 ognl-2.6.11JavaEE源代码 ognl-2.6.11JavaEE源代码 ognl-2.6.11JavaEE源...

    ognl-3.1.12.pom

    ognl-3.1.12.pom

    ognl-3.1.12-API文档-中英对照版.zip

    赠送jar包:ognl-3.1.12.jar; 赠送原API文档:ognl-3.1.12-javadoc.jar; 赠送源代码:ognl-3.1.12-sources.jar; 赠送Maven依赖信息文件:ognl-3.1.12.pom; 包含翻译后的API文档:ognl-3.1.12-javadoc-API文档-...

    ognl-3.0.21.jar ognl.jar

    标题中的“ognl-3.0.21.jar”和“ognl.jar”是指OGNL(Object-Graph Navigation Language)的特定版本库文件。OGNL是一种强大的表达式语言,广泛用于Java应用程序,尤其是Web开发框架如Struts 2中,用于在模型、视图...

Global site tag (gtag.js) - Google Analytics