近期项目用到ognl,才发现我对ognl不太熟悉,特意温习下:
ognl的语法
基本的OGNL语法是十分简单的,当然OGNL支持丰富的表达式,一般情况下,不用担心OGNL的复杂性。例如有一个man对象,该对象有一个name属性,那么使用OGNL来获得该name属性可以使用如下表达式:
man.name
OGNL表达式的基础单元称为导航链,简称为链。一个最简单的链由如下部分组成。
属性名称:如上述示例中的name。
方法调用:hashCode()返回当前对象的hash code。
数组元素:listeners[0]返回当前对象的监听器列表中的第一个元素。
OGNL表达式基于OGNL上下文中的当前对象,一个“链”将使用上一个“链”的处理结果,开发者可以任意扩展该链的长度,OGNL没有限制。
这个是网上比较经典的例子:
name.toCharArray()[0].numericValue.toString()
具体例子:
以下例子会使用到ognl.jar,大家可以到这个网址下载:http://www.ognl.org
定义复合类型:
1.团队类Team
public class Team {
// 团队名称
private String teamname;
// 定义团队人员属性
private Person person;
// 团队人数
private int personnum;
// 属性的getter和setter方法
public String getTeamname() {
return teamname;
}
public void setTeamname(String teamname) {
this.teamname = teamname;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public int getPersonnum() {
return personnum;
}
public void setPersonnum(int personnum) {
this.personnum = personnum;
}
}
2.定义人员类
// 定义人员类
public class Person {
// 姓名
private String name;
// 年龄
private int age;
// 人员出生日期
private Date birthday;
// 属性的getter和setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
3.测试类
public class TestOGNL {
public static void main(String[] args) {
// 定义一个Map对象
Map m = new HashMap();
// 定义一个Team对象
Team team1 = new Team();
team1.setTeamname("团队1");
// 定义一个Person对象
Person person1 = new Person();
person1.setName("pla1");
// 添加team元素
team1.setPerson(person1);
// 定义一个Team对象
Team team2 = new Team();
team2.setTeamname("团队2");
// 定义一个Person对象
Person person2 = new Person();
person2.setName("pla2");
// 添加team元素
team2.setPerson(person2);
// 添加Map元素
m.put("team1", team1);
m.put("team2", team2);
try {
System.out.println(Ognl.getValue("team1.teamname", m));
System.out.println(Ognl.getValue("team2.person.name", m));
System.out.println(Ognl.getValue("teamname", team2));
System.out.println(Ognl.getValue("person.name", team2));
} catch (OgnlException e) {
}
}
}
4.ognl中map的视图:
5.运行结果:
团队1
pla2
团队2
pla2
(待续)