OGNL表达式语言

2020-08-12  本文已影响0人  93张先生

OGNL 是 Object-Graph Navigation Language 的缩写,从语言角度来说:它是一个功能强大的表达式语言(EL),用来获取和设置 java 对象的属性 , 它旨在提供一个更高抽象度语法来对 java 对象图进行导航。

Jsp 页面中的 jsp 标签就是一种表达语言。

目的

主要是用来解析 Mybatis 中 mapper.xml 文件中的表达式来使用。

语法

比如要获取一个对象的 name 属性,OGNL 表达式就是 name, 要获取一个对象的 headline 属性的 text 属性,OGNL 表达式就是 headline.text 。 OGNL 表达式的基本单位是”导航链”,往往简称为”链”。

#{name}
${name}
name.toCharArray()[0].numericValue.toString()
表达式求值过程

OGNL 表达式

OgnlContext

OgnlContext对象是ognl表达式语言的核心。

OGNL 有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了java.utils.Map 的接口。用来存储表达式对象的值。

举例

/**
 * OgnlContext用法
 * 1.使用Ognl表达式语言取值,如果取非根元素的值,必须用#号
 * 2.使用Ognl表达式语言取值,如果取根元素的值,不用#号
 * 3.Ognl可以调用静态方法
 */
public class OgnlDemo {

    //非根元素
    @Test
    public void testOgnl1() throws OgnlException {
        //创建一个Ognl上下文对象
        OgnlContext context = new OgnlContext();

        /**
         * 1.OgnlContext放入基本变量数据
         */
        //放入数据
        context.put("cn","China");
        //获取数据(map)
        String value = (String)context.get("cn");

        System.out.println(value);

        /**
         * 2.OgnlContext放入对象数据
         */
        //创建对象,设置对象属性
        User user = new User();
        user.setId(100);
        user.setName("Jack");
        //【往非根元素放入数据,取值的时候表达式要用“#”】
        context.put("user",user);
        //获取对象属性
        //使用这种方式也可以获取
        Object s = context.get("user");
        System.out.println(s);


        //使用Ognl表达式来获取
        //举例:例如标签<s:a value="#user.id">取值,实际上就是运行了下面的代码获取的
        //先构建一个Ognl表达式,再解析表达式
        Object ognl = Ognl.parseExpression("#user.id");//构建Ognl表达式
        Object value1 = Ognl.getValue(ognl, context, context.getRoot());//解析表达式
        System.out.println(value1);


        User user1 = new User();
        user1.setId(100);
        user1.setName("Jack");
        context.setRoot(user1);
        Object ognl1 = Ognl.parseExpression("id");//构建Ognl表达式
        Object value2 = Ognl.getValue(ognl1, context, context.getRoot());//解析表达式
        System.out.println(value2);

    }


    //根元素
    @Test
    public void testOgnl2() throws OgnlException {
        OgnlContext context = new OgnlContext();

        User user1 = new User();
        user1.setId(100);
        user1.setName("Jack");
        context.setRoot(user1);
        //根元素直接使用id,不需要加#号
        Object ognl1 = Ognl.parseExpression("id");//构建Ognl表达式
        Object value2 = Ognl.getValue(ognl1, context, context.getRoot());//解析表达式
        System.out.println(value2);
    }

    //ognl对静态方法调用的支持
    @Test
    public void testOgnl3() throws Exception{
        //创建一个Ognl上下文对象
        OgnlContext context = new OgnlContext();

        //Ognl表达式语言,调用类的静态方法
        // Object ognl = Ognl.parseExpression("@Math@floor(10.9)");
        //由于Math类在开发中比较常用,所有也可以这样写
        Object ognl = Ognl.parseExpression("@@floor(10.9)");
        Object value = Ognl.getValue(ognl, context, context.getRoot());
        System.out.println(value);
    }
}

表达式语言
OGNL
使用列子

上一篇 下一篇

猜你喜欢

热点阅读