ONGL--详解!

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的列表。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值