OGNL学习(一)Ognl和OgnlContext

来源:互联网 发布:淘宝嘉年华在哪里 编辑:程序博客网 时间:2024/05/22 00:48

各种表达式如下:(导入相关jar包,OGNL.jar 和javassist.jar)

package com.ognl;import java.util.ArrayList;import java.util.List;import ognl.Ognl;import ognl.OgnlContext;public class OgnlTest {public static void main(String[] args) throws Exception  {Person person = new Person();person.setName("zhangsan");Dog dog = new Dog();dog.setName("wangcai");Dog dog2 = new Dog();dog2.setName("maomao");person.setDog(dog2);OgnlContext context = new OgnlContext();//实现了map接口context.put("person", person);context.put("dog", dog);context.setRoot(person);Object object = Ognl.parseExpression("name");System.out.println(object);//name/* * Ognl.getValue(object,context,context.getRoot()) * 它会到指定的上下文context中去寻找object,默认是到根元素中寻找 * 在OGNL中,如果表达式没有使用#号,那么OGNL会从根对象中寻找该属性对应的get() * 方法,如果寻找的不是根对象的中的属性,那么需要以#开头,告诉OGNL,去寻找指定对象中的属性 */Object object2 = Ognl.getValue(object, context,context.getRoot());System.out.println(object2);//zhangsanObject o = Ognl.getValue("name", context,context.getRoot());System.out.println(o);//zhangsanObject object3 = Ognl.getValue("#dog.name",context,context.getRoot());System.out.println(object3);//wangcaiObject object4 = Ognl.getValue("#person.dog.name", context,context.getRoot());System.out.println(object4);//maomao/* * 调用属性所用的方法 */System.out.println("-------------------------------");//Object obj = Ognl.getValue("getName().toUpperCase()", context,context.getRoot());//效果同下Object object5 = Ognl.getValue("name.toUpperCase()", context,context.getRoot());System.out.println(object5);//ZHANGSANSystem.out.println("--------------------------------");/* * 当使用OGNL调用静态方法的时候,需要按照如下的语法编写表达式 * @package.classname@method(parameters) * 较特殊的类:对OGNL来说,java.lang.Math是其默认的类,即调用java.lang.Math的静态方法时, * 无需指定类的名称 */Object object6 = Ognl.getValue("@java.lang.Integer@toBinaryString(10)",context,context.getRoot());System.out.println(object6);//1010Object object7 = Ognl.getValue("@@min(7,10)", context,context.getRoot());System.out.println(object7);//7System.out.println("----------------------------");/* * 数组和集合 * 都是通过下标索引访问 */Object object8 = Ognl.getValue("{'aa','bb','cc'}[2]", context,context.getRoot());System.out.println(object8);//ccSystem.out.println("-------------------------");/* * 映射Map * 语法格式如下: * #{'key1':'value1','key2':'value2'} */Object object9 = Ognl.getValue("#{'key1':'value1','key2':'value2'}['key2']", context,context.getValues());System.out.println(object9);//value2System.out.println("--------------------------");/* * 过滤 * 格式: * collection.{? expression} * 返回的是集合 * #this表示遍历时每个对象(联想增强for循环) */List<Person> list = new ArrayList<Person>();Person p1 = new Person();Person p2 = new Person();Person p3 = new Person();p1.setName("hehe");p2.setName("xixi3");p3.setName("haha333");list.add(p1);list.add(p2);list.add(p3);context.put("list",list);System.out.println(Ognl.getValue("#list.{? #this.name.length() > 4}.size()", context,context.getRoot()));//2/* * 过滤获取集合中的第一个元素 * 表达式: * collection.{^ expression} * 返回值为集合 */System.out.println(Ognl.getValue("#list.{^ #this.name.length() > 4}.get(0).getName()", context,context.getRoot()));//xixi3/* * 过滤器取得集合中最后一个元素 * 表达式: * collection.{$ expression} */System.out.println(Ognl.getValue("#list.{$ #this}[0].name", context,context.getRoot()));//haha333/* * 投影 * 表达式: * collection.{expression} * 返回集合,返回集合长度和原来集合的长度相等 * 返回的集合中的对象是原来对象的子集 *  * 过滤与投影的区别: * 类比于数据库中的表,过滤是取行,而投影是取列的操作 */System.out.println(Ognl.getValue("#list.{name}", context,context.getValues()));//[hehe, xixi3, haha333]System.out.println(Ognl.getValue("#list.{#this.name.length()>4?'Hello world':#this.name}", context,context.getRoot()));//[hehe, Hello world, Hello world]}}


 在Struts2中,根对象就是ValueStack(一个堆栈),在Struts2的任何流程中,ValueStack中的最顶层对象一定是Action对象。

以下几个对象,叫做“命名对象” ,不在ValueStack中:

 

类名访问方式parameters(客户端传向服务器端的参数)#parameters.uernmerequest#request.usernameapplication

#application.username

访问 静态方法或静态成员变量的改进@vs@method(其中vs表示ValueStack)

原创粉丝点击