OGNL详解

JAVA ginotang 1356℃ 0评论

OGNL简介

OGNL是一种表达式语言,用于简化从特定对象中获取数据的方式。要使用ognl提供的功能,项目中必须导入两个包,分别是ognl-xxx.jar和javassist-xxx.jar。

OGNL的主要组成部分:

  • 根对象
  • 上下文对象

什么是根对象

首先OGNL操作的是数据,也就是获取和设置数据的值。那么数据从哪里来?这个就是根对象。根对象只能有一个,但是根对象里面的数据可以很复杂。简单来说,根对象可以是一个javabean。例如一个Person对象,Person对象除了保存简单的字段如String nameint age,还可以保存复杂的对象如Pat,例如这个人养了一只宠物。

使用OGNL表达式操作对象

一般来说,我们是这样操作这个对象的:

要和上面的代码获得同样的效果,使用ognl的方式,只需要改动一行代码:

我们来看看getValue()方法的签名:

其中expression参数就是ognl的表达式,而第二个参数就是我们获取数据的对象,也就是数据源。expression表达式就是从第二个参数中获取数据的。这个参数就是OGNL中的根对象。

详细一点的代码如下:

 

OGNL的基本语法

像上面的代码中,我们通过pat.name的方式来获取宠物的名称,这种写法在OGNL中称为导航链,导航链是OGNL的基本单位,通常简称为链。最简单的链包括下面几个部分:

  • 属性名称
  • 方法调用
  • 数组元素

也就是说,OGNL除了能够获取对象的属性外,还能调用它们的方法,例如:

甚至获取的数据是数组类型,OGNL处理起来也是轻松自如:

什么是上下文对象

OGNL的根对象只能有一个,根对象中保存的数据往往都是相关的。如果我们有更多的数据需要处理,而且这些数据看起来并没有多大的联系,那么就可以使用上下文对象。上下文对象是Map类型的对象,因此上下文中的数据理所当然就是以键值的方式保存的。

Ognl除了提供两个参数的getValue()方法外,还有三个参数的getValue()方法,如下:

其中第二个参数就是我们要说的上下文对象。

创建和使用上下文对象

既然上下文对象只是一个Map类型的对象,那么只需要和平时一样创建Map对象即可:

使用OGNL的getValue()方法获取上下文中的数据,我们分别使用两个参数和三个参数的getValue()方法。

两个参数和三个参数的方法有什么区别呢?如果同时使用上下文对象和根对象,get方法会优先从根对象获取数据,如果根对象找不到对应的属性,就抛出OgnlException,不会继续到上下文中寻找

使用#号操作根对象和上下文对象

作为OGNL的两个主要数据源,可以直接在表达式中使用#号来访问这两个对象,例如:

输出结果:

然后,我们就可以指定表达式的数据源:

OGNL高级应用

过滤和投影。这两个概念主要是用来操作数组或者是集合的,过滤和投影可以把数组或集合中不符合条件的数据过滤掉然后返回一个全新的包含指定数据的集合。

基本语法:dataSource.{property}

例如, 我要获取person中拥有的车辆的名称,可以简单使用下面的方式:

上面的cars.{name} 语法就是用来获取数组或集合的,括号中的name就是要获取的字段,该字段是使用点"."前面的对象作为上下文的,这里是cars对象,而cars对象也是person根对象的字段属性。

过滤不符合条件的数据

使用OGNL表达式,我们可以很轻松地把不符合要求的数据过滤掉,然后返回一个全新的集合。

下面的代码获取所有名称为BMW的车辆

#this是对cars的一个引用。#this.name可用来获取所有cars对象的名称并把它们封装到一个新集合中。因此,cars.{#this.name}实际相当于上面的cars.{name} 。也就是说,可以这样获取名称为BMW的所有车辆

  • 获取名称不是BMW的车辆的名称,采用了链式写法

  • 获取数据中第一辆名称不为BMW的车辆,使用 “^”符号

  • 获取数据中最后一辆名称不是BMW的车辆,使用”$”符号

使用OGNL调用静态方法

基本语法 @package_name@method_name

完整代码

 

转载请注明:Pure nonsense » OGNL详解

喜欢 (1)
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
()
x