OGNL表达式入门

摘要:
人);Objectobj1=Ognl。parseExpression(“用户名”);Objectobj3=Ognl.parseExpression(“#person.username”);也可以调用length**/Objectobj7=Ognl。parseExpression(“username.toUpperCase().length()”);
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);

    }

}

免责声明:文章转载自《OGNL表达式入门》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jmeter3.0+ant1.10+jenkins实现接口自动化并发送邮件Windows自带SSH.exe登录SSHD下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

复制一个datatable的指定行到另外一个datatable dodo

DataTable dt = oldDataTable;DataTable result = dt.Clone();//复制表的结构            resultTable.Rows.Add(dt.Rows[index].ItemArray);//ItemArray ----通过一个数组来获取或设置此行的所有值 //新建表   DataTable ...

Linux系统定时任务启动

 分类: linux,shell,python cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务: /sbin/service crond start //启动服务 /sbin/service crond stop //关闭服务 /sbin...

instanceof 和 isInstance 强转 类型 class [MD]

博文地址 我的GitHub 我的博客 我的微信 我的邮箱 baiqiantao baiqiantao bqt20094 baiqiantao@sina.com 目录 目录 目录 简介 测试 继承关系 测试案例 基本测试 测试多态 测试null 测试数组 测试集合 测试基本类型 打印结果 简介 区别: instance...

jdk线程的简单使用

一、线程的实现方式方式一:继承Thread类一个类只要继承了Thread类,并重写run()方法,则就可以实现多线程的操作。 public class ThreadDemo01 { public static void main(String[] args) { Thread1 thread1 = new Thread1("thr...

Crontab定时任务配置

前言 crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用crontab,那么任务就是常驻程序,这对你的程序要求比较高,一个要求你的程序是24X7小时不宕机,一个是要求你的调度程序比较可靠,实际工作中,90%的程序都没有必要花这么多时间和精力去解决上面的两个问题的,只需要...

学习.Net的经典网站(转)

还不错推荐给大家原文——名称:快速入门地址:http://chs.gotdotnet.com/quickstart/描述:本站点是微软.NET技术的快速入门网站,我们不必再安装.NET Framework中的快速入门示例程序,直接在网上查看此示例即看。****************************************************名...