目录
ognl表达式和值栈
/  

ognl表达式和值栈


OGNL表达式

  • OGNL的全称是对象图导航语言,使用这种表达式语言,可以通过某种表达式语法,存取Java对象任意属性,调用Java对象的方法,同时能够自动实现必要的类型转换。
    • 如果把表达式看作是一个带有语义的字符串,那么OGNL无疑成为这个语义字符串与Java对象之间的沟通的桥梁。
Struts默认的表达式语言就是OGNL,它具有以下特点:
  • 支持对象方法调用。例如: objName.methodName()。

  • 支持类静态方法调用和值访问,表达式的格式为@类全名(包含包路径)@方法名(值名)。例如: @java.lang.String@format('foo %s', 'bar')。

  • 支持赋值操作和表达式关联。例如: price = 100, discount = 0.8, 在方法calculatePrice()中进行乘法计算会返回80。

  • 访问OGNL上下文(ognl Context) 和 ActionContext。

  • 操作集合对象。

  • ognl的操作实际上就是围绕着ognl结构的三个要素而进行的,分别是表达式、根对象、上下文环境, 下面分别讲解这三个要素。

1. 表达式

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


2. 根对象(ROOT)

  • OGNL的getValue()方法中的第二个参数就是Root对象,Root对象可以理解为OGNL的操作对象,表达式规定了 “做什么”, 而Root对象则规定了 “对谁操作”。OGNL称为对象图导航语言,所谓对象图,即以任意一个对象为根,通过OGNL可以访问这个对象关联的其他对象。


3. Context对象

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

例子:

package cn.lacknb.ognl;

import ognl.Ognl;
import ognl.OgnlException;

import java.util.HashMap;
import java.util.Map;

public class TestOgnlContext {

    public static void main(String[] args) throws OgnlException {
        User user = new User();
        Group g = new Group();
        Branch b = new Branch();
        b.setBranchId("test");
        g.setBranch(b);
        user.setGroup(g);
        // 用java来导航访问
        System.out.println("java方式-" + user.getGroup().getBranch().getBranchId());
        // 利用OGNL表达式访问
        System.out.println("OGNL方式-" + Ognl.getValue("group.branch.branchId", user));

        // 设置user对象的username的属性值为itcast
        user.setUsername("itcast");
        // 创建context对象
        Map context = new HashMap();
        // 将user对象放入context对象中
        context.put("u", user);
        // 输出使用OGNL表达式获取context对象中的user对象的username值
        System.out.println("获取context中数据结果为-" + Ognl.getValue("#u.username", context, user));
        System.out.println("获取context中对象结果为-" + Ognl.getValue("#u.group.branch.branchId", context, user));


    }

}

  • 输出结果

java方式-test
OGNL方式-test
获取context中数据结果为-itcast
获取context中对象结果为-test


标题:ognl表达式和值栈
作者:gitsilence
地址:https://blog.lacknb.cn/articles/2019/08/20/1577974156702.html