关于struts2里的ognl与值栈

来源:互联网 发布:马蓉出轨的代价 知乎 编辑:程序博客网 时间:2024/05/16 03:37

struts2里用的并不是原生的ognl,而是把ognl进行了改良。在原生ognl里只能有一个root对象,而到了struts2里能有多个root对象,其实这里我个人感觉实际上还是一个对象,只不过这个对象是个容器,可以封装其它对象,所以看上去好像是可以有多个root对象。注意这个root对象,也就是所谓的容器实际上用的是一个栈的结构,栈顶始终默认存放着一次请求的action对象。而struts2里的ognl上下文是ActionContext。

下面附上原生ongl的一些常用存值取值实例

OgnlContext context = new OgnlContext();
        Person person = new Person();
        person.setName("zhangsan");
        Dog dog = new Dog();
        dog.setName("wangcai");
        person.setDog(dog);
        context.put("person", person);
        context.put("dog", dog);
        context.setRoot(person);

        Object object1 = Ognl.parseExpression("name");//如果不指定对象名 则找的是根元素里的name
        System.out.println(object1);//这里打印的只是对象导航图而已
        Object object2 = Ognl.getValue(object1, context, context.getRoot());
        System.out.println(object2);//这里打印的才是真正获得的属性
        
        Object object3 = Ognl.parseExpression("#person.name");//指定对象名前要加#号
        System.out.println(object3);
        Object object4 = Ognl.getValue(object3, context, context.getRoot());
        System.out.println(object4);

        Object object5 = Ognl.parseExpression("#dog.name");//指定对象名前要加#号
        System.out.println(object5);
        Object object6 = Ognl.getValue(object5, context, context.getRoot());
        System.out.println(object6);

        Object object7 = Ognl.parseExpression("#person.dog.name");//指定对象名前要加#号
        System.out.println(object7);
        Object object8 = Ognl.getValue(object7, context, context.getRoot());
        System.out.println(object8);

        Object object9 = Ognl.parseExpression("new java.util.LinkedList()");//可以 直接 创建对象
        System.out.println(object9);
        Object object10 = Ognl.getValue(object9, context, context.getRoot());
        LinkedList linkedList = (LinkedList)object10;//这里的object10其实就是LinkedList类的对象
        linkedList.add("linkedlist1");
        linkedList.add("linkedlist2");
        System.out.println(object10);
        
        Object object11 = Ognl.getValue("{'aa', 'bb', 'cc'}", context, context.getRoot());
        System.out.println(object11);//可以用上述的方法来 直接 创建集合,且集合和数组的访问方法是一样的、可以用下标来访问
        
        Object object12 = Ognl.getValue("{'aa', 'bb', 'cc'}[1]", context, context.getRoot());
        System.out.println(object12);
        
        Object object13 = Ognl.getValue("#{'key1':'aav', 'key2':'bbv', 'key3':'ccv'}", context, context.getRoot());
        System.out.println(object13);//可以用上述方法来直接创建 映射(map) 注意创建映射必须使用#号,且这里的#和前面说的#号不是一个意思,前面的#代表访问根元素
        
        Object object14 = Ognl.getValue("#{'key1':'aav', 'key2':'bbv', 'key3':'ccv'}['key1']", context, context.getRoot());
        System.out.println(object14);//访问映射中的具体key对应的值
        
        //下面演示OGNL里的过滤功能,主要用在集合里
        List<Person> list = new ArrayList<Person>();
        Person p1 = new Person();
        Person p2 = new Person();
        Person p3 = new Person();
        p1.setName("zhangsan");
        p2.setName("lisi");
        p3.setName("wangwu");
        list.add(p1);
        list.add(p2);
        list.add(p3);
        context.put("list", list);
        //下面是筛选集合里的属性语法,其中 #this 代表的是集合里的每一个对象(相当于遍历集合) 只要那么属性长度大于4的都会被返回(返回的是个新的集合)
        //其中前面的 ?号可以换成 ^ 或者 $ 符号 前者代表返回结果里的第一个元素,后者是代表返回结果里最后一个元素(注意即使返回一个属性也是用集合形式返回的,并不是返回单个属性)
        Object object15 = Ognl.parseExpression("#list.{? #this.name.length() > 4}");
        Object object16 = Ognl.getValue(object15, context, context.getRoot());
        System.out.println(object16);
        
        
        //下面演示的是OGNL里的投影操作
        //其实投影操作就是返回集合里的对象里指定的属性的一个集合,如下的person类 可以只返回name属性的集合 返回后的集合里只包含name属性 不包含age属性
        //    class person
        //    {
        //        String name;
        //        String age;
        //    }
        Object object17 = Ognl.parseExpression("#list.{name}");//这里表示只返回list集合里对象的name属性
        Object object18 = Ognl.getValue(object17, context, context.getRoot());
        System.out.println(object18);
        //下面表示在投影的基础上返回name长度大于5的值,把小于5的值换成helloworld返回
        Object object19 = Ognl.parseExpression("#list.{#this.name.length() < 5 ? 'helloworld' : #this.name}");
        Object object20 = Ognl.getValue(object19, context, context.getRoot());
        System.out.println(object20);

0 0
原创粉丝点击