OGNL

来源:互联网 发布:淘宝云客服工资 编辑:程序博客网 时间:2024/05/17 00:45
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);//employeeString managerName = (String)Ognl.getValue("#mm.name", context,context.getRoot());System.out.println(managerName);//managerliteral();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);//nameString 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);//managerArrayList list1 = (ArrayList)Ognl.getValue("{\"zhagnlei\",false}", context,context.getRoot());boolean bool = (Boolean)list1.get(1);System.out.println(bool);//falseboolean 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);//zhangsanString 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);//ZHANGSANOgnl.getValue("invoke('zhangleiya')", ee);//静态方法和静态变量int min = (Integer)Ognl.getValue("@@max(4,5)",null);System.out.println(min);//5double 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));//创建mapHashMap<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;}}