现在的位置: 首页 > 综合 > 正文

ONGL–详解!

2013年10月07日 ⁄ 综合 ⁄ 共 3278字 ⁄ 字号 评论关闭

OGNL(Object Graph Navigation Language)是一种强大的表达式语音,它能够自动导航对象的结构和设置对象数据,它的核心是Context(相当于一个Map容器),Struts2中OGNL的Context为ActionContext,由值栈、命名对象(web元素对象)等对象组成,其中值栈是OGNL Context的根,值栈中的对象可以直接访问,但访问ActionContext中其他对象时需要使用“#”。
1.访问值栈中的对象
  Struts2框架总是把Action实例放在栈顶。因为Action在值栈中,而值栈又是OGNL中的根,所以引用Action的   属性可以省略“#”标记,这也是为什么我们在结果页面中可以直接访问Action的属性的原因。在Struts2框架
  中使用OGNL表达式需要借助Struts2的标签进行输出。
  ⊙访问普通属性和方法
    访问普通属性的方法主要有两种,分别为:
  <s:property value="user.id"/>
  <s:property value="user[id]"/>

    调用普通方法:

    <s:property value="user。say()"/>
  ⊙访问静态属性和方法
    访问普通属性:
    @com.lyq.bean.Bean@name  上述代码相当于访问了Bean.name静态属性
    访问普通属性:
    @com.lyq.bean.Bean@greeting() 上述代码相当于调用了Bean@greeting()方法
    注意:Struts2框架中提供了一个是否允许OGNL调用静态方法的常量,他的名称为“struts.ognl.            allowStaticMethodAccess”,其默认属性为“false”。也就是说,在默认的情况下,Struts2不允许OGNL     调用静态方法。所以,如果开发中需要使用OGNL调用静态方法,必须将此常量的值设置为“true”,否则,
    将不能调用对象的静态方法。要更改这个常量的值,可以再struts.xml配置文件中加入如下代码:
    <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>   
2.访问命名对象
  Struts2还提供了一些命名对象,这些对象没有保存在值栈中,而是保存在ActionContext中,因此访问这些对   象需要使用“#”标记。这些命名对象都是Map类型。

 request

 用于访问请求属性。如:#request["user"]或#request.user,相当于调用了HttpServletrequest对象的      getattribute()方法。

 session

 用于访问session属性。如:#session["user"]或#session.user,相当于调用了Httpsession对象的          getattribute()方法。

 application

 用于访问application属性。如:#application["user"]或#application.user,相当于调用了                ServletContext的getattribute()方法。

  parameter


  用于访问请求参数。如:#meters["id"]或#meters.id,相当于调用了HttpServletrequest对象的            getparameter()   方法。
  注意,parameter本质上是一个使用HttpServletrequest对象中的请求参数构造的Map对象,一量对象被创建
   (在调用Action实例之前就已经创建好了),它和HttpServletrequest对象就没有了任何关系。

 attr

 如果不指定范围,可以使用attr来获取属性值,将按page、request、session、application的次序进行搜索   PageContext



OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。

OGNL表达式

  OGNL[1]支持各种纷繁复杂的表达式。但是最最基本的表达式的原型,是将对象的引用值用点串联起来,从左到右,每一次表达式计算返回的结果成为当前对象,后面部分接着在当前对象上进行计算,一直到全部表达式计算完成,返回最后得到的对象。OGNL则针对这条基本原则进行不断的扩充,从而使之支持对象树、数组、容器的访问,甚至是类似SQL中的投影选择等操作。

  1. 基本对象树的访问

  对象树的访问就是通过使用点号将对象的引用串联起来进行。

  例如:xxxx,xxxx.xxxx,xxxx. xxxx. xxxx. xxxx. xxxx 

  2. 对容器变量的访问

  对容器变量的访问,通过#符号加上表达式进行。

  例如:#xxxx,#xxxx. xxxx,#xxxx.xxxxx. xxxx. xxxx. xxxx 

  3. 使用操作符号

  OGNL表达式中能使用的操作符基本跟Java里的操作符一样,除了能使用 +, -, *, /, ++, --, ==, !=, = 等操作符之外,还能使用 mod, in, not in等。

  4. 容器、数组、对象

  OGNL支持对数组和ArrayList等容器的顺序访问:例如:group.users[0]

  同时,OGNL支持对Map的按键值查找:

  例如:#session['mySessionPropKey']

  不仅如此,OGNL还支持容器的构造的表达式:

  例如:{"green", "red", "blue"}构造一个List,#{"key1" : "value1", "key2" : "value2", "key3" : "value3"}构造一个Map

  你也可以通过任意类对象的构造函数进行对象新建:

  例如:new Java.net.URL("xxxxxx/")

  5. 对静态方法或变量的访问

  要引用类的静态方法和字段,他们的表达方式是一样的@class@member或者@class@method(args):

  例如:@com.javaeye.core.Resource@ENABLE,@com.javaeye.core.Resource@getAllResources

  6. 方法调用

  直接通过类似Java的方法调用方式进行,你甚至可以传递参数:

  例如:user.getName(),group.users.size(),group.containsUser(#requestUser)

  7. 投影和选择

  OGNL支持类似数据库中的投影(projection) 和选择(selection)。

  投影就是选出集合中每个元素的相同属性组成新的集合,类似于关系数据库的字段操作。投影操作语法为 collection.{XXX},其中XXX 是这个集合中每个元素的公共属性。

  例如:group.userList.{username}将获得某个group中的所有user的name的列表。

  选择就是过滤满足selection 条件的集合元素,类似于关系数据库的纪录操作。选择操作的语法为:collection.{X YYY},其中X 是一个选择操作符,后面则是选择用的逻辑表达式。而选择操作符有三种:

  ? 选择满足条件的所有元素

  ^ 选择满足条件的第一个元素

  $ 选择满足条件的最后一个元素

  例如:group.userList.{? #txxx.xxx != null}将获得某个group中user的name不为空的user的列表。

抱歉!评论已关闭.