OGNL

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

例如,当前环境的根对象为user1,则表达式person.address[0].province可以访问到user1的person属性的第一个address的province属性

 

表达式:

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.支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(price*discount),这个表达式会返回80;
5. 容器、数组、对象
 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/")
6. 对静态方法或变量的访问
 要引用类的静态方法和字段,他们的表达方式是一样的@class@member或者@class@method(args):
 例如:@com.javaeye.core.Resource@ENABLE,@com.javaeye.core.Resource@getAllResources
7. 方法调用
 直接通过类似Java的方法调用方式进行,你甚至可以传递参数:
 例如:user.getName(),group.users.size(),group.containsUser(#requestUser)
8. 投影和选择
 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的列表。
 
 

import java.util.HashMap;
import java.util.Map;
import ognl.Ognl;
import ognl.OgnlException;
public class TestOGNL {
public static void main(String[] args) {
	Map m = new HashMap();
	Team team1 = new Team();
	team1.setTeamname("团队1");
	Person person1 = new Person();
	person1.setName("pla1");
	team1.setPerson(person1);	

	m.put("team1", team1);
	
	try {
		System.out.println(Ognl.getValue("team1.teamname", m));
		System.out.println(Ognl.getValue("team1.person.name", m));
		System.out.println(Ognl.getValue("teamname", team1));
		System.out.println(Ognl.getValue("person.name", team1));
	} catch (OgnlException e) {
	}
}
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值