1.OGNL概述
OGNL,全称为Object-Graph Navigation Language,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性,它旨在提供一个更高的更抽象的层次来对Java对象图进行导航。
OGNL表达式的基本单位是"导航链",一般导航链由如下几个部分组成:
- 属性名称(property)
- 方法调用(method invoke)
- 数组元素
所有的OGNL表达式都基于当前对象的上下文来完成求值运算,链的前面部分的结果将作为后面求值的上下文。例如:names[0].length()。
2.OGNL操作属性
public class OGNL1 { public static void main(String[] args) { /** 创建一个Person对象 **/ Person person = new Person(); person.setName("zhangsan"); try { /** 从person对象中获取name属性的值 **/ Object value = Ognl.getValue("name", person); System.out.println(value); } catch (OgnlException e) { e.printStackTrace(); } } } /** model 实体类 **/ class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
3.OGNL访问context
public class OGNL1 { public static void main(String[] args) { /** 创建一个上下文Context对象,它是用保存多个对象一个环境 对象 **/ Map<String, Object> context = new HashMap<String, Object>(); Person person1 = new Person(); person1.setName("zhangsan"); Person person2 = new Person(); person2.setName("lisi"); Person person3 = new Person(); person3.setName("wangwu"); /* person4不放入到上下文环境中 */ Person person4 = new Person(); person4.setName("zhaoliu"); /** 将person1、person2、person3添加到环境中(上下文中) **/ context.put("person1", person1); context.put("person2", person2); context.put("person3", person3); try { /** 获取根对象的"name"属性值 **/ /** 从根对象person2,直接从person2中查找**/ Object value = Ognl.getValue("name", context, person2); System.out.println("ognl expression "name" evaluation is : " + value); /** 获取根对象的"name"属性值 **/ /** 指定#person2,直接从person1中查找**/ Object value2 = Ognl.getValue("#person2.name", context, person2); System.out.println("ognl expression "#person2.name" evaluation is : "+ value2); /** 获取person1对象的"name"属性值 **/ /** 指定#person1,直接从person1中查找**/ Object value3 = Ognl.getValue("#person1.name", context, person2); System.out.println("ognl expression "#person1.name" evaluation is : "+ value3); /** 将person4指定为root对象,获取person4对象的"name"属性,注意person4对象不在上下文中 **/ /** 从根对象person4中查找,找到 **/ Object value4 = Ognl.getValue("name", context, person4); System.out.println("ognl expression "name" evaluation is : "+ value4); /** 将person4指定为root对象,获取person4对象的"name"属性,注意person4对象不在上下文中 **/ /** 不存在上下文中,找不到,报错 **/ Object value5 = Ognl.getValue("#person4.name", context, person4); System.out.println("ognl expression "person4.name" evaluation is : "+ value5); } catch (OgnlException e) { e.printStackTrace(); } } }
4.OGNL调用方法
public class OGNL2 { public static void main(String[] args) { /* OGNL提供的一个上下文类,它实现了Map接口 */ OgnlContext context = new OgnlContext(); People people1 = new People(); people1.setName("zhangsan"); People people2 = new People(); people2.setName("lisi"); People people3 = new People(); people3.setName("wangwu"); context.put("people1", people1); context.put("people2", people2); context.put("people3", people3); context.setRoot(people1); try { /** 调用 成员方法 **/ Object value = Ognl.getValue("name.length()", context, context.getRoot()); System.out.println("people1 name length is :" + value); Object upperCase = Ognl.getValue("#people2.name.toUpperCase()", context, context.getRoot()); System.out.println("people2 name upperCase is :" + upperCase); Object invokeWithArgs = Ognl.getValue("name.charAt(5)", context, context.getRoot()); System.out.println("people1 name.charAt(5) is :" + invokeWithArgs); /** 调用静态方法 **/ Object min = Ognl.getValue("@java.lang.Math@min(4,10)", context, context.getRoot()); System.out.println("min(4,10) is :" + min); /** 调用静态变量 **/ Object e = Ognl.getValue("@java.lang.Math@E", context, context.getRoot()); System.out.println("E is :" + e); } catch (OgnlException e) { e.printStackTrace(); } } }
5.OGNL操作集合
public class OGNL3 { public static void main(String[] args) throws Exception { OgnlContext context = new OgnlContext(); Classroom classroom = new Classroom(); classroom.getStudents().add("zhangsan"); classroom.getStudents().add("lisi"); classroom.getStudents().add("wangwu"); classroom.getStudents().add("zhaoliu"); classroom.getStudents().add("qianqi"); Student student = new Student(); student.getContactWays().put("homeNumber", "110"); student.getContactWays().put("companyNumber", "119"); student.getContactWays().put("mobilePhone", "112"); context.put("classroom", classroom); context.put("student", student); context.setRoot(classroom); /* 获得classroom的students集合 */ Object collection = Ognl.getValue("students", context,context.getRoot()); System.out.println("students collection is :" + collection); /* 获得classroom的students集合 */ Object firstStudent = Ognl.getValue("students[0]", context,context.getRoot()); System.out.println("first student is : " + firstStudent); /* 调用集合的方法 */ Object size = Ognl.getValue("students.size()", context,context.getRoot()); System.out.println("students collection size is :" + size); System.out.println("--------------------------飘逸的分割线--------------------------"); Object mapCollection = Ognl.getValue("#student.contactWays", context,context.getRoot()); System.out.println("mapCollection is :" + mapCollection);"#student.contactWays['homeNumber']", context, context.getRoot()); System.out.println("the first element of contactWays is :" + firstElement); System.out.println("--------------------------飘逸的分割线--------------------------"); /* 创建集合 */ Object createCollection = Ognl.getValue("{'aa','bb','cc','dd'}", context, context.getRoot()); System.out.println(createCollection); /* 创建Map集合 */ Object createMapCollection = Ognl.getValue("#{'key1':'value1','key2':'value2'}", context, context.getRoot()); System.out.println(createMapCollection); } } class Classroom { private List<String> students = new ArrayList<String>(); public List<String> getStudents() { return students; } public void setStudents(List<String> students) { this.students = students; } } class Student { private Map<String, Object> contactWays = new HashMap<String, Object>(); public Map<String, Object> getContactWays() { return contactWays; } public void setContactWays(Map<String, Object> contactWays) { this.contactWays = contactWays; } }
6.OGNL过滤集合
public class OGNL4 { public static void main(String[] args) throws Exception { OgnlContext context = new OgnlContext(); Humen humen = new Humen(); humen.setName("qiuyi"); humen.setSex("n"); humen.setAge(22); humen.getFriends().add(new Humen("zhangsan", "n", 22)); humen.getFriends().add(new Humen("lisi", "f", 21)); humen.getFriends().add(new Humen("wangwu", "n", 23)); humen.getFriends().add(new Humen("zhaoliu", "n", 22)); humen.getFriends().add(new Humen("qianqi", "n", 22)); humen.getFriends().add(new Humen("sunba", "f", 20)); humen.getFriends().add(new Humen("yangqiu", "f", 25)); context.put("humen", humen); context.setRoot(humen); /** OGNL过滤集合的语法为:collection.{? expression} **/ Object filterCollection = Ognl.getValue("friends.{? #this.name.length() > 7}", context, context.getRoot()); System.out.println("filterCollection is :" + filterCollection); System.out.println("--------------------------飘逸的分割线--------------------------"); /** OGNL投影集合的语法为:collection.{expression} **/ Object projectionCollection = Ognl.getValue("friends.{name}", context, context.getRoot()); System.out.println("projectionCollection is :" + projectionCollection); } } class Humen { private String name; private String sex; private int age; private List<Humen> friends = new ArrayList<Humen>(); public Humen() { } public Humen(String name, String sex, int age) { this.name = name; this.sex = sex; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public List<Humen> getFriends() { return friends; } public void setFriends(List<Humen> friends) { this.friends = friends; } @Override public String toString() { return "Humen [name=" + name + ", sex=" + sex + ", age=" + age + "]"; } }
本站文章为 宝宝巴士 SD.Team 原创,转载务必在明显处注明:(作者官方网站: 宝宝巴士 )
转载自【宝宝巴士SuperDo团队】原文链接: http://www.cnblogs.com/superdo/p/5080281.html