• Struts中整合的强大Ognl学习(一)


    测试使用了一个JavaBean的User,User中的Address单独封装再形成了一个JavaBean;

    为了测试静态方法和静态变量调用,写了一个Util方法;

    因为测试Ognl功能过多所以直接使用的Junit进行测试!

    其中只用使用四个struts中的包,创建一个普通的java项目来测试!

    User.java

    package mzy.entity;
    
    public class User {
    	private String name;
    	private int age;
    	private String password;
    	private Address address;
    	
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	public Address getAddress() {
    		return address;
    	}
    	public void setAddress(Address address) {
    		this.address = address;
    	}
    	public String getName() {
    		return name; 
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getPassword() {
    		return password;
    	}
    	public void setPassword(String password) {
    		this.password = password;
    	}
    	
    	
    	@Override
    	public String toString() {
    		return "User [name=" + name + ", password=" + password + ", address=" + address + "]";
    	}
    	
    }
    

    Address.java

    package mzy.entity;
    
    public class Address {
    	private String city;
    	private String street;
    	
    	public String getCity() {
    		return city;
    	}
    	public void setCity(String city) {
    		this.city = city;
    	}
    	public String getStreet() {
    		return street;
    	}
    	public void setStreet(String street) {
    		this.street = street;
    	}
    }
    

    DateUtils.java

    package mzy.entity;
    package mzy.utils;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class DateUtils {
    	public static double PI = 3.1425926;
    	
    	/**
    	 * 返回当前时间方法! 
    	 */
    	public static String getTime() {
    		return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
    	}
    	
    	/**
    	 * 回音方法! 经常用于测试
    	 */
    	public static String echo(String str) {
    		return str;
    	}
    	
    }

    下面是测试,emmm,很长很长!!!偷笑

    package mzy.demo;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.junit.Test;
    
    import mzy.entity.Address;
    import mzy.entity.User;
    import ognl.Ognl;
    
    public class Demo {
    	/*
    	 * 演示ognl的基本使用!
    	 */
    	
    	// ----------------演示从根中取值----------------
    	@Test
    	public void fun1 () throws Exception {
    		User u = new User();
    		u.setName("Tom");
    		/*
    		 * 参数一:填写ognl表达式
    		 * 参数二:Map -> context上下文
    		 * 参数三:javaBean/List/Map ... Root 根
    		 */
    		// 根是javaBean
    		String name = (String) Ognl.getValue("name", new HashMap(), u);
    		System.out.println(name);
    	}
    	@Test
    	public void fun2 () throws Exception {
    		List<User> list = new ArrayList<User>();
    		User u1 = new User();
    		u1.setName("Tom");
    		User u2 = new User();
    		u2.setName("Jerry");
    		list.add(u1);
    		list.add(u2);
    		
    		/*
    		 * 参数一:填写ognl表达式
    		 * 参数二:Map -> context上下文
    		 * 参数三:javaBean/List/Map ... Root 根
    		 */
    		// 根是List:Ognl默认从根下去取值!
    		String name01 = (String) Ognl.getValue("[0].name", new HashMap(), list);
    		String name02 = (String) Ognl.getValue("[1].name", new HashMap(), list);
    		System.out.println(name01);
    		System.out.println(name02);
    	}
    	@Test
    	public void fun3 () throws Exception {
    		Map<String, Object> map = new HashMap<String, Object>();
    		map.put("name", "Tom");
    		
    		/*
    		 * 参数一:填写ognl表达式
    		 * 参数二:Map -> context上下文
    		 * 参数三:javaBean/List/Map ... Root 根
    		 */
    		// 根是List:Ognl默认从根下去取值!
    		
    		String name = (String) Ognl.getValue("name", new HashMap(), map);
    		System.out.println(name);
    	}
    	
    	// ----------------演示从上下文取值----------------
    	@Test
    	public void fun4 () throws Exception {
    		Map<String, Object> map01 = new HashMap<String, Object>();
    		map01.put("name", "Tom");
    		Map<String, Object> map02 = new HashMap<String, Object>();
    		map02.put("name", "Jerry");
    		/*
    		 * 参数一:填写ognl表达式
    		 * 参数二:Map -> context上下文
    		 * 参数三:javaBean/List/Map ... Root 根
    		 */
    		// 根是List:Ognl默认从根下去取值! name
    		// 要从上下文去取的话,用#name!
    		
    		// String name = (String) Ognl.getValue("name", map02, map01); // Tom
    		String name = (String) Ognl.getValue("#name", map02, map01); // Jerry
    		System.out.println(name);
    	}
    	// ----------------演示从对象中取对象的值:层级可以无限----------------
    	@Test
    	public void fun5 () throws Exception {
    		User u = new User();
    		u.setName("Tom");
    		
    		Address a = new Address();
    		a.setCity("ChengDu");
    		
    		u.setAddress(a);
    		/*
    		 * 参数一:填写ognl表达式
    		 * 参数二:Map -> context上下文
    		 * 参数三:javaBean/List/Map ... Root 根
    		 */
    		
    		// 使用Ognl取出User中Address中的city的值
    		String city = (String) Ognl.getValue("address.city", new HashMap(), u);
    		System.out.println(city);
    	}
    	
    	// ----------------演示赋值----------------
    	@Test
    	public void fun6() throws Exception {
    		// 演示赋值
    		User u = new User();
    		// 方式一:getValue中expression位置写name=xxx
    		Ognl.getValue("name='Tom'", new HashMap(), u);
    		System.out.println(u.getName());
    		// 方式二:setValue中最后一个位置写value
    		Ognl.setValue("name", new HashMap(), u, "Jerry");
    		System.out.println(u.getName());
    		Map map = new HashMap();
    		// 赋值必须在根中! 上下文不能赋值!!!
    		Ognl.setValue("#name", map, u, "Jerry");
    		System.out.println(map.get("name"));
    	}
    	
    	// ----------------演示Ognl调用方法----------------
    	
    	@Test // 调用根中的方法!
    	public void fun7() throws Exception {
    		 // 调用方法:但是该方法必须存在于根中!
    		User u = new User();
    		Ognl.getValue("setName('Jack')", new HashMap(), u);
    		System.out.println(u.getName());
    	}
    	
    	@Test // 访问静态方法和静态变量
    	public void fun8() throws Exception {
    		// 演示静态方法访问:不受在根中的限制了!可以不在根中(肯定更不是上下文,只是指外部)
    		/*
    		 * Ognl中规定,所有静态的方法和变量都用@符号表示;
    		 * 如果在根中的话,直接写方法名之类的就好了;
    		 * 但是如果不在根中的话,就要写完整类名,并加我们要访问的方法或者变量(中间还要使用一次@符号)
    		 */
    		User u = new User();
    		// 演示静态无参方法调用
    		String time = (String) Ognl.getValue("@mzy.utils.DateUtils@getTime()", new HashMap(), u);
    		System.out.println(time);
    		
    		// 演示静态有参方法调用
    		String echo = (String) Ognl.getValue("@mzy.utils.DateUtils@echo('hiahia~~')", new HashMap(), u);
    		// Ognl.setValue(expression, root, value); // 同前面的一类的set方法
    		System.out.println(echo);
    		/*
    		 * 上面的context位置的参数因为用不到,所以可以选择两个 参数的getValue方法
    		 */
    		// 演示静态变量的访问
    		double Pi = (double) Ognl.getValue("@mzy.utils.DateUtils@PI", u);
    		System.out.println(Pi);
    	}
    	
    	// ----------------演示Ognl进行数学差运算----------------
    	@Test // 进行数学运算
    	public void fun9() throws Exception {
    		int result = (int) Ognl.getValue("1+1", new User()); // 根必须要有,但是取值不一定从根中取,所以我们的根就可以随便new一个javaBean对象
    		System.out.println(result);
    	}
    	
    	// ----------------演示Ognl多个表达式的时候使用, 分隔----------------
    	@Test // 多个Ognl表达式的时候,连接符的使用
    	public void fun10() throws Exception {
    		User u = new User();
    		u.setName("Tom");
    		
    		Object result = Ognl.getValue("name='Tom', name='Jerry'", u); // 根必须要有,但是取值不一定从根中取,所以我们的根就可以随便new一个javaBean对象
    		// 测试:这样写的话只返回最后一个表达式的结果,并不能返回所有的结果
    		System.out.println(result);
    	}
    	
    	// ----------------演示Ognl创建对象(List、Map ... )----------------
    	@Test
    	public void fun11() throws Exception {
    		// 演示创建List
    		List list = (List) Ognl.getValue("{'Tom', 'Jerry', 'Jack', 'Rose'}", new User());
    		
    		System.out.println(list);
    		
    		// 演示创建Map
    		Map map = (Map)Ognl.getValue("#{'name':'Tom', 'age':'18', 'sex':'男'}", new User());
    		
    		System.out.println(map);
    		
    		// 创建javaBean:很鸡肋,略
    	}
    	
    	// ----------------演示in和not in----------------
    	@Test
    	public void fun12() throws Exception {
    		// 注意内部的单引号!!!我之前忘了!!!
    		// true
    		Object a =  Ognl.getValue("'Tom' in {'Tom', 'Jerry', 'Jack', 'Rose'}", new User());
    		// false
    		boolean b = (boolean)Ognl.getValue("'tom' in {'Tom', 'Jerry', 'Jack', 'Rose'}", new User());
    		// false
    		boolean c = (boolean)Ognl.getValue("'Tom' not in {'Tom', 'Jerry', 'Jack', 'Rose'}", new User());
    		// true 自动做了去空格的trim操作!
    		boolean d = (boolean)Ognl.getValue("' Tom ' not in {'Tom', 'Jerry', 'Jack', 'Rose'}", new User());
    		
    		System.out.println(a+", "+b+", "+c+", "+d);
    		
    	}
    	
    	// ----------------演示映射----------------
    	@Test
    	public void fun13() throws Exception {
    		/*
    		 * 需求:
    		 * 		得到所有User的name属性的集合
    		 */
    		List<User> list = new ArrayList<User>();
    		
    		User u1 = new User();
    		User u2 = new User();
    		User u3 = new User();
    		u1.setName("Tom");
    		u2.setName("Jerry");
    		u3.setName("Rose");
    		list.add(u1);
    		list.add(u2);
    		
    		list.add(u3);
    		// 默认没有#号的时候为从根中取,只要是不能从根中取到的,和不能从根中直接取到的都要加#
    		
    		// 把list设置为根:expr中的this表示根
    		Object value = Ognl.getValue("#this.{name}", list);
    		System.out.println(value);
    	}
    	
    	// ----------------集合的选择,过滤----------------
    	@Test
    	public void fun14() throws Exception {
    		/*
    		 * 需求:
    		 * 		过滤掉List中所有年龄大于18的user
    		 */
    		List<User> list = new ArrayList<User>();
    		
    		User u1 = new User();
    		User u2 = new User();
    		User u3 = new User();
    		u1.setName("Tom");
    		u1.setAge(17);
    		u2.setName("Jerry");
    		u1.setAge(18);
    		u3.setName("Rose");
    		u1.setAge(19);
    		list.add(u1);
    		list.add(u2);
    		
    		list.add(u3);
    		// 默认没有#号的时候为从根中取,只要是不能从根中取到的,和不能从根中直接取到的都要加#
    		
    		// 把list设置为根:expr中的this表示根:注意这里是过滤!!age > 18
    		Object value = Ognl.getValue("#this.{?age>18}", list);
    		System.out.println(value);
    	}
    }
    


  • 相关阅读:
    centos7 安装jmeter5.1
    centos7 安装jdk1.8
    es6学习笔记(一)环境搭建
    Django-filter报错:__init__() got an unexpected keyword argument 'name'
    django fields lookup methods(lookup类型)
    django笔记-model
    Git-简单使用
    jenkins-master-slave节点配置总结
    Git-简单使用
    MySQL explain详解
  • 原文地址:https://www.cnblogs.com/mzywucai/p/11053400.html
Copyright © 2020-2023  润新知