Struts2学习笔记(十四):OGNL 表达式

package com.struts.ognl;

import ognl.Ognl;
import ognl.OgnlContext;
import org.junit.Test;

/**
 * OGNL 表达式:
 *  OGNL 是 Object Graphic Navigation Language(对象图导航语言)的缩写,他是一个开源项目;
 *
 * ognl 优势:
 *  1、支持对象方法调用,如果 request.request_data;
 *  2、支持类的静态方法调用和值访问,表达式的格式:
 *      @[类全名(包括包)]@[方法名|值名],例如:
 *      @java.lang.String@Format("foo %s", "bar");
 *      或:@tutorial.MyConstant@APP_NAME;
 *  3、支持赋值操作和表达式串联,如 price=100,discount=0.8;
 *      calculatePrice() 这个表达式会返回 80;
 *  4、访问 ognl 上下文(OgnlContext),和 ActionContext;
 *  5、操作集合对象;
 *
 * ognl 表达式用于页面中取值,是 struts 默认支持的表达式语言;必须引用相应的 ognl jar 包;
 *  ognl 表达式必须配置 struts 标签用,不能离开 struts 标签直接用;
 * EL 表达式也用于页面取值,是 jsp 页面取值的标准;默认可以直接使用,应用范围更广。
 *
 * ognl 有一个上下文的概念,其本质是一个 Map 对象,实现了 java.utils.Map 接口;叫做 OgnlContext;
 * OgnlContext 是 ognl 表达式的核心,ognl 表达式取值就是通过 OgnlContext 对象实现的;
 */
public class OgnlContextDemo {
    /**
     * 从非根元素取值的 ognl 表达式必须要用 "#"
     */
    @Test
    public void test1() throws Exception{
        // 创建一个 OgnlContext 对象
        OgnlContext ognlContext = new OgnlContext();

        // 创建对象
        User user = new User();
        user.setId(22);
        user.setName("Jack");

        // 放入数据:此处是往非根元素放入数据,取值的时候表达式要用 "#"
        ognlContext.put("userKey", user);

        // 获取数据
        // 先构建一个 ognl 表达式:从非根元素取值,表达式要用 "#"
        String ognlExpression = "#userKey.id";
        // 再解析表达式
        Object ognl = Ognl.parseExpression(ognlExpression);
        // 最后获取表达式的值
        Object value = Ognl.getValue(ognl, ognlContext, ognlContext.getRoot());
        System.out.println(value);
    }

    /**
     * 从根元素取值的 ognl 表达式不用带 "#"
     */
    @Test
    public void test3() throws Exception{
        // 创建一个 OgnlContext 对象
        OgnlContext ognlContext = new OgnlContext();

        // 创建对象
        User user = new User();
        user.setId(22);
        user.setName("Jack");

        // 放入数据:往根元素放入数据
        ognlContext.setRoot(user);

        // 获取数据
        // 先构建一个 ognl 表达式,在解析表达式
        Object ognl = Ognl.parseExpression("id"); // 从根元素取数据,不用带 "#"
        // 获取 ognl 表达式的值
        Object value = Ognl.getValue(ognl, ognlContext, ognlContext.getRoot());
        System.out.println(value);
    }

    /**
     * ognl 表达式调用 静态方法
     */
    @Test
    public void test4() throws Exception {
        // 创建一个 OgnlContext 对象
        OgnlContext ognlContext = new OgnlContext();

        // 构建 ognl 表达式,调用类的静态方法
//        String ognlExpression = "@Math@floor(8.8)";
        String ognlExpression = "@@floor(8.8)"; // 由于 Math 类比较常用,所以也可以省略
        // 解析 ognl 表达式
        Object ognl = Ognl.parseExpression(ognlExpression);
        // 获取表达式的值
        Object value = Ognl.getValue(ognl, ognlContext, ognlContext.getRoot());
        System.out.println(value);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值