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)

1.表达式

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

2.根对象

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

3.上下文环境

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

四、用法

1.访问对象的方法

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

2.访问对象的静态方法

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

​

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

    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);
    }

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

    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);
    }

 

你可能感兴趣的:(OGNL)