OGNL基础:特定于Xwork的语言特性

        特定于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在它下面。下面的代码片段可以帮助你了解

发生了什么:

species             //调用  animal.getSpecies()
salary                //调用   person.getSalary()
name                 //调用  animal.getName(),因为animal在栈顶  


        在最后的示例中,当有并列属性时(值栈中多个对象有相同的属性)animal的name被返回。通常

这是希望的结果,但有时你想获得更底层的对象的该属性。为了实现这个目标,XWork增加了对值栈

的索引支持。你需要做的就是:

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


        使用[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的静态访问方式如下:

@some.package.ClassName@FOO_PROPERTY        //访问静态成员变量
@some.package.ClassName@someMethod()               //访问静态方法


        然而,XWork允许不用指明完整的包名,通过"vs"前缀来访问你所编写的action类的静态属性和

方法。

@vs@FOO_PROPERTY
@vs@someMethod()

@vs1@FOO_PROPERTY
@vs1@someMethod()

@vs2@FOO_PROPERTY
@vs2@someMethod()


        "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中找属性

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值