美文网首页
OGNL表达式语言

OGNL表达式语言

作者: 93张先生 | 来源:发表于2020-08-12 22:35 被阅读0次

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

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

目的

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

语法

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

  • 取 java 对象的 name 属性
#{name}
${name}
name.toCharArray()[0].numericValue.toString()
表达式求值过程
  • 提取根 (root) 对象的 name 属性。
  • 调用上一步返回的结果字符串的 toCharArray() 方法。
  • 提取返回的结果数组的第一个字符。
  • 获取字符的 numericValue 属性,该字符是一个 Character 对象,
  • Character 类有一个 getNumericValue() 方法。
  • 调用结果 Integer 对象的 toString() 方法。

OGNL 表达式

  • 常量: 字符串:” ello” 字符:’h’ 数字:除了像 java 的内置类型 int,long,float 和 double,Ognl 还有如例:10.01B,相当于 java.math.BigDecimal,使用 ‘b’ 或者 ‘B’ 后缀。 100000H,相当于 java.math.BigInteger,使用 ‘h’ 或 ‘H’ 后缀。
  • 属性的引用 例如:user.name
  • 变量的引用 例如:#name
  • 静态变量的访问 使用 @class@field
  • 静态方法的调用 使用 @class@method(args), 如果没有指定 class 那么默认就使用 java.lang.Math.
  • 构造函数的调用 例如:new java.util.ArrayList();

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
使用列子

相关文章

网友评论

      本文标题:OGNL表达式语言

      本文链接:https://www.haomeiwen.com/subject/ircvdktx.html