特定于Xwork的语言特性
XWork在OGNL基础上最大的变化是提供了对值栈(ValueStack)的支持。OGNL在只有一个
根对象的假设下运行,而XWork的值栈概念要求有多个根。
例如,假设我们使用标准的OGNL(不使用XWork)并且在OgnlContext(本身就是一个Map的子类)
的map中有两个对象:"foo"->foo和"bar"->bar(key-value)。foo对象被设置为唯一的根对象。下面
的代码说明了OGNL怎样处理这三中情况:
#foo.blah //返回 foo.getBlah() #bar.blah //返回 bar.getBlah() blah //返回 foo.getBlah(),因为foo是OGNL上下文的根对象 |
这意味着OGNL允许在其上下文中有多个对象,但如果访问的不是根对象,那么必须在前面加上
一个命名空间,例如@bar。现在让我们来看看XWork不同的地方。
有用信息 在XWork中,整个值栈都是上下文的根对象。XWork不只是从栈中获得你的表达式的对象然后再获得其属性,XWork有个特别的OGNL属性访问器,它会自动地搜索栈中的所有对象(从上到下)直到找到了包含你正在寻找的属性的对象才停止。 |
例如,假设栈中有两个对象:Animal和Person。两个对象都有一个name属性,Animal有一个species
属性,Person有一个salary属性。Animal位于栈顶,Person在它下面。下面的代码片段可以帮助你了解
发生了什么:
|
在最后的示例中,当有并列属性时(值栈中多个对象有相同的属性)animal的name被返回。通常
这是希望的结果,但有时你想获得更底层的对象的该属性。为了实现这个目标,XWork增加了对值栈
的索引支持。你需要做的就是:
|
使用[0], [1] ... [3]等表达式,Struts2会截取值栈并返回一个复合根对象。为了获得这个特别的栈的
顶对象,可以使用0.top
ognl表达式 | 描述 |
[0].top | 会从截取的栈的元素0开始取得栈顶元素 |
[1].top | 会从截取的栈的元素1开始取得栈顶元素 |
访问静态属性
OGNL既支持访问静态属性,也支持访问静态方法。
在默认情况下,Struts2不支持这个特性——为了启用OGNL的静态成员访问支持,必须通过
任何一种常量配置方法(struts-default.xml,,struts-plugin.xml,struts.xml,struts.properties,web.xml)
将常量struts.ognl.allowStaticMethodAccess设置为true。
OGNL的静态访问方式如下:
|
然而,XWork允许不用指明完整的包名,通过"vs"前缀来访问你所编写的action类的静态属性和
方法。
|
"vs"代表值栈。值得注意地是如果你指明的类名只是"vs",那么栈顶对象会被访问。如果在"vs"
字符串后指明了一个数字number,那么栈中的第number个对象会被访问。
Struts2的命名对象
名 | 值 |
#parameters['foo'] 或 #parameters.foo | 相当于request.getParameter("foo") |
#request['foo'] 或 #request.foo | 相当于request.getAttribute("foo") |
#session['foo'] 或 #session.foo | 相当于session.getAttribute("foo") |
#application['foo'] 或 #application.foo | 相当于application.getAttribute("foo") |
#attr['foo'] 或 #attr.foo | 从page->request->session->application中找属性 |