OGNL

package ognl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;



public class OgnlTest {
	public static void main(String[] args) throws Exception {
		Employee ee = new Employee ();
		ee.setName("employee");
		Manager mm = new Manager ();
		mm.setName("manager");
		OgnlContext context = new OgnlContext();
		context.setRoot(ee);
		context.put("mm", mm);
		String employeeName = (String)Ognl.getValue("name", context,context.getRoot());
		System.out.println(employeeName);//employee
		String managerName = (String)Ognl.getValue("#mm.name", context,context.getRoot());
		System.out.println(managerName);//manager
		literal();
		System.out.println("----------------------------------------");
		accessJavaBean();
		System.out.println("----------------------------------------");
		test();
		System.out.println("------------------------------------------");
		test2();
		System.out.println("-------------------------------------------");
		test3();
		System.out.println("-------------------------------------------");
		test4();
		System.out.println("-------------------------------------------");
		test5();
	}
	public static void literal () throws OgnlException {
		Employee ee = new Employee ();
		ee.setName("employee");
		Manager mm = new Manager ();
		mm.setName("manager");
		OgnlContext context = new OgnlContext();
		context.setRoot(ee);
		context.put("mm", mm);
		String iteral = (String) Ognl.getValue("'name'", context,context.getRoot());
		System.out.println(iteral);//name
		String iteral2 = (String)Ognl.getValue("'say \"hello world\"'", context,context.getRoot());
		System.out.println(iteral2);//say "hello world"
		String operation1 = (String)Ognl.getValue("name,#mm.name", context,context.getRoot());
		System.out.println(operation1);//manager
		ArrayList list1 = (ArrayList)Ognl.getValue("{\"zhagnlei\",false}", context,context.getRoot());
		boolean bool = (Boolean)list1.get(1);
		System.out.println(bool);//false
		boolean result1 = (Boolean)Ognl.getValue("name in{'employee',34}", context,context.getRoot());
		System.out.println(result1);//true
		
	}
	
	public static void accessJavaBean () throws OgnlException {
		Address address = new Address ();
		address.setCountry("china");
		address.setCity("beijing");
		address.setStreet("shangdi");
		Employee ee = new Employee ();
		ee.setName("zhangsan");
		ee.setAddress(address);
		OgnlContext context = new OgnlContext ();
		context.setRoot(ee);
		String username = (String)Ognl.getValue("name", context, context.getRoot());//对应的java代码ee.getName();
		System.out.println(username);//zhangsan
		String street = (String)Ognl.getValue("address.street", context,context.getRoot());//对应的java代码ee.getAddress().getStreet();
		System.out.println(street);//shangdi
		//调用方法:
		String upperCase = (String)Ognl.getValue("name.toUpperCase()", context,context.getRoot());
		System.out.println(upperCase);//ZHANGSAN
		Ognl.getValue("invoke('zhangleiya')", ee);
		//静态方法和静态变量
		int min = (Integer)Ognl.getValue("@@max(4,5)",null);
		System.out.println(min);//5
		
		double pi = (Double)Ognl.getValue("@@PI",null);
		System.out.println(pi);//3.141592653589793
		//创建对象
		ArrayList list = (ArrayList)Ognl.getValue("new java.util.ArrayList()", null);
		list.add("zhanglei");
		list.add(3);
		System.out.println(list);//[zhanglei, 3]
	}
	
	public static void test () throws Exception {
		Employee ee = new Employee ();
		Ognl.setValue("name", ee, "zhanglei");
		System.out.println(ee.getName());
	}
	
	public static void test2 ()throws Exception {
		System.out.println("test2");
		Employee ee = new Employee ();
		ee.setName("lisi");
		String []interests = new String[]{"Game","coding","read","make money"};
		ee.setInterests(interests);
		//按索引访问
		String interest = (String) Ognl.getValue("interests[0]", ee);
		System.out.println(interest);//Game
		//按索引设值
		Ognl.setValue("interests[0]",ee,"baother");
		System.out.println(Ognl.getValue("interests[0]", ee));
		int size = (Integer)Ognl.getValue("interests.length", ee);
		System.out.println(size);
	}
	
	public static void test3 () throws Exception {
		Message message = new Message ();
		message.setMessage("no1", "lisi");
		//有setMessage方法和getMessage方法
		Ognl.setValue("message['no1']", message, "zhangsan");
		System.out.println(Ognl.getValue("message['no1']", message));
		//没有setMessage方法和getMessage方法
		Message2 message2 = new Message2();
		Ognl.setValue("message.first", message2, "helloworld");
		String result = (String)Ognl.getValue("message.first", message2);
		System.out.println(result);
		//效果是一样的
	}
	public static void test4 () throws Exception{
		//创建列表
		List<Object> lists = (List<Object>) Ognl.getValue("{'zhangsan','lisi',new java.util.Date()}",null);
		System.out.println(lists.get(2));//Thu May 02 14:29:31 CST 2013
		//可以通过索引访问
		System.out.println(Ognl.getValue("{1,2,3,4}[2]", null));
		//创建map
		HashMap<String,Object> map = (HashMap<String,Object>)Ognl.getValue("#{'first':'zhangsan','second':'lisi'}", null);
		System.out.println(map);
		int size = (Integer)Ognl.getValue("#{'first':'zhangsan','second':'lisi'}.size", null);
		System.out.println(size);
		String name = (String)Ognl.getValue("#{'first':'zhangsan','second':'lisi'}.first", null);
		System.out.println(name);
		String name2 = (String)Ognl.getValue("#{'first':'zhangsan','second':'lisi'}['first']", null);
		System.out.println(name2);
	}
	
	public static void test5 () throws OgnlException {
		List<Employee> employees = new ArrayList<Employee>();
		Employee ee1 = new Employee ();
		ee1.setName("zhangsan");
		Employee ee2 = new Employee ();
		ee2.setName("hello");
		employees.add(ee1);
		employees.add(ee2);
		A a = new A ();
		a.setEmployees(employees);
		System.out.println(Ognl.getValue("employees.{name}", a));
		
	}
}

/**
 * Ognl表达式的计算机都是围绕OGNL上下文来进行的,ognl上下文实际上就是一个Map对象,
 * 由ognl.OgnlContext类(实现了java.util.Map接口)来表示。ognl上下文可以包含一个或多个JavaBean
 * 对象,在这些对象中有一个特殊的,这个对象就是上下文的根对象。如果在写表达式的时候,没有指定
 * 使用上下文中的哪一个对象,那么根对象将被假定为表达式所依据的对象。
 */


/****
 * 
 * OGNL表达式的基础单元就是导航链(navigation chain),通常称为"链(chain)"。
 * 最简单的链有下列3部分组成:
 * 属性名:name
 * 
 * 方法调用:manager.hashcode(),
 * 
 * 数组索引:emails[0]
 * 
 * 
 */
/***
 * 
 * 常量:
 * ->字符常量,数值常量,布尔常量,null常量
 * 操作符:
 * ->逗号(,):类似于c语言中的逗号表达方式
 * ->{}:用于创建列表。
 * ->in和not in:判断一个值是否在集合中
 * 
 */
/***
 * 访问JavaBean的属性
 * 最常用的表达式就是范围javaBean的属性
 */
/***
 * 调用方法
 * 访问JavaBean的属性就是进行方法调用(调用属性的getter方法),
 * 不过,并不是所有的方法都符合getXxx()和setXxx()形式,OGNL提供了调用任何方法的能力。
 * 如果你要employee对象的name属性的值转化成大写形式,可以使用表达式:name.toUpperCase()。
 */

/***
 * 
 * 调用静态方法和静态字段
 * @class@method(args)//调用静态方法
 * @class@field//访问静态字段
 * 注意:class必须给出完整的类名.
 */

/***
 * 
 * 调用构造函数
 * OGNL支持对构造函数的调用,从而创建一个新的对象。你可以现在java中一样使用new 操作符来创建一个对象,不同的是
 * ,你必须使用完整的限定类名(带包名的类).eg:new java.util.ArrayList(),而不是new ArrayList().
 * 
 */

/***
 *索引访问
 *数组和列表索引:
 *在ognl中,数组和列表可以大致看成是一致的。用数据索引访问方式也使用与访问列表中的元素
 *array[0],list[0]。表达式:{'zhangsan','wangwu','lisi'}[1]访问列表中的第二个元素即:wangwu,
 *对应的java代码为list.get(1),如果索引超过范围,抛出IndexOutOfBoundsException
 *
 *JavaBean的索引属性
 *JavaBean支持索引属性的概念,索引属性就是获取和设置数组时使用的属性。要使用索引属性,需要提供二对getter/setter
 *方法,一对用于数组,一对用于数据中的元素。语法如下:
 *public PropertyType[] getPropertyName()
 *public void setPropertyName (PropertyType[]values)
 *public PropertyType getPropertyName (int index);
 *public void setPropertyName (int index,PropertyType value)
 *
 *OGNL对象索引属性
 *JavaBean的索引只能使用整型作为索引,Ognl扩展了索引的概念。可以使用任意对象来作为索引。
 *可以使用任意对象来作为索引。
 *当发现一个可能的对象索引是,OGNL按照下列的方式签名参照方法样式:
 *public PropertyType getPropertyName (IndexType index)
 *public void setPropertyName(IndexType index,PropertyType value)
 *Servlet API中的session
 *public Object getAttribute(String name)
 *public void setAttribute (String name,Object value)
 *下面的OGNL表达式可以在session中获得或者设置foo属性(attribute)
 *session.attribute["foo"]
 *
 */

/**
 * 对集合的操作
 * 因为数组和列表的操作方式比较相似,所以通常也把数组归纳为集合。
 * 创建列表:
 * {'zhanglei','lisi',new Date()}
 * 创建数组:
 * 表达式:new int[]{1,2,3};Ognl中创建数组和Java语言中创建数组是类似的。可以使用索引来访问.数组的属性可以直接访问array.length
 * 创建map
 * Map使用特殊的语法来实现
 * #{'key1':'value1','key2','value2'}
 * eg:#{'first','zhangsan','second','lisi','third','wangwu'}
 * 相当于:Map map = new HashMap ();
 * 				map.put ("first","zhangsan");
 * 			return map;
 * 如果想要创建指定的map类型:使用#@java.util.LinkedMap@{'first','zhangsan','second','lisi','third','wangwu'}
 * 可以通过key访问:map['first'], #{'first':'zhangsan','second':'lisi'}["first"]
 * 集合的伪元素

 * Java集合api中很多常用的方法,如:size(),isEmpty()等。这些方法不符合JavaBean对于属性property访问器方法的
 * 命名要求getxxx setxxxx.所以不能像访问javaBean一样来访问这些方法。
 * eg:list.size
 * 投影(projection)
 * OGNL提供了简单的方式在一个集合中对每一个元素调用相同的方法,或者抽取相同的属性,请将结果保存在一个新的集合中。
 * 这个称之为投影,以数据库术语来说就是一张表中选择的子集。
 * #employees.{name}
 * 将返回所有顾客的名字的列表
 * 在投影期间,使用#this变量来引用迭代中的当前元素
 * objects:{#this instanceof String ? #this:#this.toString()}
 *选择:
 *OGNL 提供了一个简单的方式来使用表达式从集合中选择元素,并将结果保存到新的集合中。成为选择。类比:数据库的select name from employee where id < 34;
 *返回雇员薪水大于3000的所有的列表
 *#employee.{?#this.salary > 3000}
 *?选取匹配选择逻辑的所有的元素
 *^选取匹配选择逻辑的第一个元素
 *$选取匹配选择逻辑的最后一个元素
 */

/***
 * 
 * 
 * OGNL 的类型转换:可以将一个对象转换转换成不同的类型。
 * 在表达式计算过程中,ognl可以根据需要自动对某个对象进行类型转换。
 * eg:要将对象转换成Boolean类型,如果对象时Number,非0为true,其他为false。
 * Character '0'->false other->true
 * null->false other->true
 */

/**
 * struts2:
 * 值栈(ValueStack)
 * struts2将OGNL上下文设置为Struts2中的ActionContext(内部仍然使用的是OgnlContext),
 * 并将值栈作为OGNL的根对象。可以在值栈中放值,删除值,查询值。
 * 
 * 

 */
class Employee {
	private String name;
	private Address address;
	private String interests[];
	
	public String[] getInterests() {
		return interests;
	}
	public void setInterests(String[] interests) {
		this.interests = interests;
	}
	//可以不提供
	public void setInterests (int i,String interest) {
		System.out.println("exe");
		this.interests[i] = interest;
	}
	//可以不提供,因为数组可以直接的按索引访问
	public String getInterests (int i) {
		return this.interests[i];
	}
	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 void invoke (String name) {
		System.out.println(name+"invoke!");
	}
}

class Message {
	public Map<String,Object> message = new HashMap<String,Object> ();
	public void setMessage (String key,String value) {
		message.put(key, value);
	}
	public Object getMessage (String key) {
		return message.get(key);
	}
}

class Message2 {
	public Map<String,Object> message = new HashMap<String,Object> ();
}
class Manager {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}
class Address {
	private String country;
	private String city;
	private String street;
	public String getCountry() {
		return country;
	}
	public void setCountry(String country) {
		this.country = country;
	}
	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;
	}
	
}
//只为演示
class A {
	private List<Employee> employees;

	public List<Employee> getEmployees() {
		return employees;
	}

	public void setEmployees(List<Employee> employees) {
		this.employees = employees;
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值