zoukankan      html  css  js  c++  java
  • [JavaWeb基础] 029.OGNL表达式介绍

    1.OGNL概述

    OGNL,全称为Object-Graph Navigation Language,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性,它旨在提供一个更高的更抽象的层次来对Java对象图进行导航。

    OGNL表达式的基本单位是"导航链",一般导航链由如下几个部分组成:

    1. 属性名称(property) 
    2. 方法调用(method invoke) 
    3. 数组元素

    所有的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

  • 相关阅读:
    吴裕雄--天生自然 pythonTensorFlow自然语言处理:Attention模型--测试
    吴裕雄--天生自然 pythonTensorFlow自然语言处理:Attention模型--训练
    吴裕雄--天生自然 pythonTensorFlow自然语言处理:Seq2Seq模型--测试
    吴裕雄--天生自然 pythonTensorFlow自然语言处理:Seq2Seq模型--训练
    吴裕雄--天生自然 pythonTensorFlow自然语言处理:PTB 语言模型
    吴裕雄--天生自然 pythonTensorFlow自然语言处理:文本数据预处理--生成训练文件
    吴裕雄--天生自然 pythonTensorFlow自然语言处理:文本数据预处理--生成词汇表
    吴裕雄--天生自然 pythonTensorFlow自然语言处理:交叉熵损失函数
    HihoCoder 1097 kruscal
    HihoCoder 1097 Prim算法
  • 原文地址:https://www.cnblogs.com/superdo/p/5080281.html
Copyright © 2011-2022 走看看