• OGNL表达式入门


    package com.scorpion.ognl;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import ognl.Ognl;
    import ognl.OgnlContext;
    import ognl.OgnlException;
    
    public class OgnlTest
    {
    
        /**
         * 
         * Ognl实现了map接口
         * 
         * @param args
         * @throws OgnlException
         */
        public static void main(String[] args) throws OgnlException
        {
            Person person = new Person();
            person.setUsername("yujun");
    
            Dog dog = new Dog();
            dog.setUsername("laifu");
            /**
             * 生成ognl上下文对象
             */
            OgnlContext context = new OgnlContext();
    
            /**
             * put方法是将对象放置到上下文,以便ognl进行读取解析
             * 
             */
            context.put("person", person);
    
            context.put("dog", dog);
            /**
             * 设置根元素对象,假如直接读取属性,那么将从根元素寻找此属性值,比如person对象的username属性,
             * 当我们将person设置为根元素后,那么parseExpression方法将从person里面寻找username
             */
            context.setRoot(person);
    
            Object obj1 = Ognl.parseExpression("username");
    
            System.out.println(obj1);
    
            Object obj2 = Ognl.getValue(obj1, context, context.getRoot());
    
            System.out.println(obj2);
    
            Object obj3 = Ognl.parseExpression("#person.username");
    
            System.out.println(obj3);
    
            Object obj4 = Ognl.getValue(obj3, context, context.getRoot());
    
            System.out.println(obj4);
    
            Object obj5 = Ognl.parseExpression("#dog.username");
    
            System.out.println(obj5);
    
            Object obj6 = Ognl.getValue(obj5, context, context.getRoot());
    
            System.out.println(obj6);
    
            /**
             * 获取username属性值的时候,相当于是隐式调用了对应的getUsername()方法
             * 可以再去调用这个获得的字符串的相应的方法,比如说toUpperCase,还可以再调用length
             * 
             */
            Object obj7 = Ognl.parseExpression("username.toUpperCase().length()");
    
            System.out.println(obj7);
    
            Object obj8 = Ognl.getValue(obj7, context, context.getRoot());
    
            System.out.println(obj8);
    
            /**
             * 调用静态方法不需要生成对象,格式为@package.className@methodName(parameters)
             * 当调用的类是java
             * .lang.Math时,可以省略package.className,形式为@@methodName(parameter)
             */
            Object obj9 = Ognl
                    .parseExpression("@java.lang.Integer@toBinaryString(10)");
    
            System.out.println(obj9);
    
            Object obj10 = Ognl.getValue(obj9, context, context.getRoot());
    
            System.out.println(obj10);
    
            /**
             * 生成一个集合对象的使用方法,用花括号,里面用逗号,要访问某个值,只需要用下标访问即可 对于Ognl来说,集合与数组是一样的
             * 
             */
            Object obj11 = Ognl.getValue("{'aa','ab','ac'}[2]", context,
                    context.getRoot());
    
            System.out.println(obj11);
    
            dog.setFriends(new String[]
            { "aa", "bb", "cc" });
    
            Object obj12 = Ognl.getValue("#dog.friends[1]", context,
                    context.getRoot());
    
            System.out.println(obj12);
    
            List<String> list = new ArrayList<String>();
    
            list.add("aaaaa");
            list.add("bbb");
            list.add("ccc");
    
            context.put("list", list);
    
            Object obj13 = Ognl.getValue("#list[1]", context, context.getRoot());
    
            System.out.println(obj13);
    
            /**
             * Ognl处理映射(map)的语法格式 #{'key1':'value1','key2':'value2'};
             * 
             * 如果要获得某个value,传递对应的key即可
             */
    
            Object obj14 = Ognl.getValue("#{'key1':'value1','key2':'value2'}['key2']", context,
                    context.getRoot());
    
            System.out.println(obj14);
    
            /**
             * 过滤(filter)的表达式
             * 
             * collection.{? expression}
             * 
             */
            List<Person> persons = new ArrayList<Person>();
            Person p1 = new Person();
            Person p2 = new Person();
            Person p3 = new Person();
            p1.setUsername("zhangsikkkk");
            p2.setUsername("liwu");
            p3.setUsername("zhaoliu");
    
            persons.add(p1);
            persons.add(p2);
            persons.add(p3);
            context.put("persons", persons);
            /**
             * 过滤操作,返回name值大于4的 #this代表persons对象,操作结果返回的是一个集合collection
             * "#persons.{? #this.username.length() > 4}.isEmpty()"
             * 返回的集合就可以调用集合的方法了,比如size(),比如isEmpty()
             * 
             * 获取集合中的第一个元素 #persons.{? #this.username.length() >
             * 4}[0].username,可以返回第一个元素的username属性 获取集合中的第一个元素(返回的是一个集合) #persons.{^
             * #this.username.length() > 4},此表达式返回[perosn@hashcode]
             * 
             * 返回符合条件的最后一个元素(返回的是一个元素) #persons.{$ #this.username.length() >
             * 4},此表达式返回perosn@hashcode
             * 
             * 
             */
            Object obj15 = Ognl.getValue("#persons.{? #this.username.length() > 4}.size()", context,
                    context.getRoot());
    
            System.out.println(obj15);
    
            /**
             * 投影(projection)表达式 collection.{expression} 过滤是取行,投影是取列
             * #persons.{username} 返回三个名字的集合
             * 下面这个表达式将名字长度小于5的替换成hello world
             * #persons.{#this.username.length() <= 5 ? 'hello world' : #this.name}
             */
            Object obj16 = Ognl.getValue("#persons.{username}.size()", context,
                    context.getRoot());
    
            System.out.println(obj16);
    
            Object obj17 = Ognl.getValue("#persons.{#this.username.length() <= 5 ? 'hello world' : #this.username}",
                            context, context.getRoot());
    
            System.out.println(obj17);
    
        }
    
    }
  • 相关阅读:
    启动hbase时出现HMaster Aborted错误
    kylin的安装与配置
    【转】HBase原理和设计
    ts项目报错:Import sources within a group must be alphabetized
    TypeScript 之 tsconfig.json
    TypeScript 之 声明文件的结构
    TypeScript 之 声明文件的使用
    TypeScript 之 声明文件的发布
    TypeScript 之 NPM包的类型
    create-react-app-typescript 知识点
  • 原文地址:https://www.cnblogs.com/withscorpion/p/5608585.html
Copyright © 2020-2023  润新知