目录

ognl简述

原文:OGNL表达式语言详解

简介

OGNL(Object-Graph Navigation Language)的全称是对象图导航语言,它是一种功能强大的开源表达式语言,比EL(只能从域或内置对象中)表达式更强大,使用这种表达式语言,可以通过某种表达式语法,OGNL可以存取Java任意对象的任意属性,调用Java对象的方法,同时能够自动实现必要的类型转换。如果把表达式看作是一个带有语义的字符串,那么OGNL无疑成为了这个语义字符串与Java对象之间沟通的桥梁。

Struts2的默认表达式语言就是OGNL

作用

  1. 支持对象方法调用 objName.methodName()

  2. 支持类静态方法调用和值访问 @java.lang.String@format(‘name’,‘mark’)

  3. 支持赋值操作和表达式串联 price=100,calculatePrice()

  4. 支持访问OGNL上下文(OGNL context)和ActionContext

  5. 支持操作集合对象

要素(表达式、根对象、上下文环境)

OGNL的操作实际上就是围绕着OGNL结构的三个要素而进行的,分别是表达式(Expresssion)、根对象(Root Object)、上下文环境(Context)

表达式

表达式是整个OGNL的核心,OGNL会根据表达式去对象中取值。所有OGNL操作都是针对表达式解析后进行的。它表明了此次OGNL操作要"做什么"。表达式就是一个带有语法含义的字符串,这个字符串规定了操作的类型和操作的内容。OGNL支持大量的表达式语法,不仅支持这种"链式"对象访问路径,还支持在表达式中进行简单的计算

根对象(Root)

Root对象可以理解为OGNL的操作对象,表达式规定了"做什么",而Root对象则规定了"对谁操作"。OGNL称为对象图导航语 言,所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象。

Context对象

实际上OGNL的取值还需要一个上下文环境,设置了Root对象,OGNL可以对Root对象进行取值或写值等操作,Root对象所在环境就是OGNL的上下文环境(Context)。上下文环境规定了OGNL的操作"在哪里进行"。上下文环境Context是一个Map类型的对象,在表达式中访问Context中的对象,需要使用"#“号加上对象名称,即”#对象名称"的形式

用法

https://gitee.com/lienhui68/picStore/raw/master/null/20201009165925.png

需要引入jar包为ognl-x.x.x.jar

访问对象的方法

1
2
3
4
5
6
7
8
public void testOGNL(){
    //获得上下文环境Context
    OgnlContext context = new OgnlContext();
    //获得根对象Root
    Object root = context .getRoot();
    //执行表达式
    Object obj = Ognl.getValue("'helloWorld'.length()",context ,root);
}

访问对象的静态方法

1
2
3
4
5
6
7
8
    public void testOGNL(){
        //获得上下文环境Context
        OgnlContext context = new OgnlContext();
        //获得根对象Root
        Object root = context .getRoot();
        //执行表达式 @类名@方法名
        Object obj = Ognl.getValue("@java.lang.Math@random()",context ,root);
    }

获取Root中数据(不需要加#)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public void testOGNL(){
    //获得上下文环境Context
    OgnlContext context = new OgnlContext();
    //向root传入Java对象
    context.setRoot(new User("mark", 15));
    //获得根对象Root
    Object root = context .getRoot();
    //执行表达式 获取对象中属性值
    Object username = Ognl.getValue("username",context ,root);
    Object age = Ognl.getValue("age",context ,root);
}

获取Context中的数据(需要加#)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public void testOGNL(){
    //获得上下文环境Context
    OgnlContext context = new OgnlContext();
    //获得根对象Root
    Object root = context .getRoot();
    //向Context传入值
    context.put("username","mark");
    //执行表达式 获取Context中属性值
    Object username = Ognl.getValue("#username",context ,root);
}