初探OGNL表达式

2023-05-16

简介

对象导航图语言(Object Graph Navigation Language),简称OGNL,是应用于Java中的一个开源的表达式语言(Expression Language),它被集成在Struts2等框架中,作用是对数据进行访问,它拥有类型转换、访问对象方法、操作集合对象等功能。

项目支持

  • WebWork
  • Struts2
  • Tapestry (4.0或之前)
  • Spring Web Flow
  • Apache Click
  • MyBatis - SQL映射框架
  • Thymeleaf - 一个Java XML / XHTML / HTML5 模板引擎
  • FreeMarker - 一个Java模板引擎

初体验

可以通过由字符串组成的表达式来访问对象方法,操作集合。非常强大,可以用来解析一些动态的脚本,功能非常的强大。带来无限的创造边。

代码

Maven依赖

<dependency>
   <groupId>ognl</groupId>
   <artifactId>ognl</artifactId>
   <version>2.7.3</version>
</dependency>

Java源代码

package cn.ycmit.sqltranslate.util;

import ognl.Ognl;
import ognl.OgnlException;

import java.lang.reflect.Array;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class OgnlUtil {
	/**
	 * 根据表达式获取参数中的值
	 *
	 * @param expression
	 * @param keyValue       参数的键值对
	 * @return
	 * @throws
	 */
	public static Object getValue(String expression, Map<String, Object> keyValue) {
		try {
			Map context = Ognl.createDefaultContext(keyValue);
			Object value = Ognl.getValue(Ognl.parseExpression(expression), context, keyValue);
			return value;
		} catch (OgnlException e) {
			throw new RuntimeException(e.getMessage());
		}
	}

	/**
	 * 根据表达式获取参数中的值
	 * 并且结果为Boolean
	 *
	 * @param expression 表达式
	 * @param keyValue       参数的键值对
	 * @throws
	 */
	public static Boolean getBooleanValue(String expression, Map<String, Object> keyValue) {
		Object value = getValue(expression, keyValue);
		if (value instanceof Boolean) {
			return (Boolean) value;
		} else if (value instanceof Number) {
			return !new BigDecimal(String.valueOf(value)).equals(BigDecimal.ZERO);

		} else {
			throw new RuntimeException("expression value is not boolean or number type:" + expression);

		}
	}
	/**
	 * 根据表达式获取参数中的值
	 * 并且结果为迭代器对象
	 *
	 * @param expression 表达式
	 * @param keyValue       参数的键值对
	 * @throws
	 */
	public static Iterable<?> getIterable(String expression, Map<String, Object> keyValue) {
		Object value = getValue(expression, keyValue);
		if (value == null) {
			throw new RuntimeException("The expression '" + expression + "' evaluated to a null value.");

		}
		if (value instanceof Iterable) {
			return (Iterable<?>) value;
		}

		if (value.getClass().isArray()) {
			int size = Array.getLength(value);

			List<Object> answer = new ArrayList<Object>();
			for (int i = 0; i < size; i++) {
				Object o = Array.get(value, i);
				answer.add(o);
			}
			return answer;
		}
		if (value instanceof Map) {
			return ((Map) value).entrySet();
		}

		throw new RuntimeException(
				"Error evaluating expression '" + expression + "'.Return value (" + value + ") was not iterable.");
	}

	public static void main(String[] args) {
		Map<String, Object> keyValues = new HashMap<>();
		List<Integer> list = new ArrayList<>();
		list.add(12);
		list.add(22);
		list.add(32);
		list.add(42);
		keyValues.put("ids", list);
		keyValues.put("isBoy", true);

		System.out.println("ids[1]:" + getValue("ids[1]", keyValues));
		System.out.println("ids[2]:" + getValue("ids[2]", keyValues));
		System.out.println("ids[3]:" + getValue("ids[3]", keyValues));
		System.out.println("ids.size():" + getValue("ids.size()", keyValues));
		System.out.println("--------getBooleanValue--------");
		System.out.println("isBoy:" + getBooleanValue("isBoy", keyValues));

		System.out.println("--------getIterable--------");
		Iterable testIterable = getIterable("ids",keyValues);
		for (Object obj :
				testIterable) {
			System.out.println(obj);
		}
	}
}

参考

https://zh.wikipedia.org/wiki/%E5%AF%B9%E8%B1%A1%E5%AF%BC%E8%88%AA%E5%9B%BE%E8%AF%AD%E8%A8%80

https://github.com/freakchick/orange

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

初探OGNL表达式 的相关文章

随机推荐

  • alpine linux中安装docker

    简介 Small Simple Secure Alpine Linux is a security oriented lightweight Linux distribution based on musl libc and busybox
  • 命令行mysql 中文乱码解决

    现象 在IDEA中查询 xff0c 中文显示正常 IDEA中的jdbc连接字符串是 xff1a jdbc mysql 172 16 184 13 3306 ry vue useUnicode span class token operato
  • alpine linux中docker mysql踩坑记录

    写在前头 xff0c 本文只是记录这个坑 xff0c 目前没有找到解决办法 研究了一天了 xff0c 也没有解决 环境 我使用vmware安装了alpine linux 安装过程见 xff1a vmware安装alpine linux ht
  • [精简]RuoYi开发实战-搭建开发环境

    文章目录 简介说明RuoYi环境准备JDK安装dockermysql安装redis 6 2安装 下载源码数据库初始化Redis配置数据源配置Logback报错解决测试后端是否启动成功前端运行 简介 RuoYi 使用若依快速构建web应用程序
  • CentOS Stream8 与CentOS7有什么区别?

    工作中一直在用CentOS7和CentOS6 本来想抽空尝试一下CentOS8玩一玩 结果CentOS8已经走完了生命周期 一直好奇Centos Linux 和 CentOS Stream有什么区别 xff0c 今天就来安装一下 CentO
  • RuoYi若依实战-代码生成

    代码生成 使用admin登录管理后台 xff0c 菜单路径如下 xff1a 首页 系统工具 代码生成 建表 span class token comment auto generated definition span span class
  • CentOS stream 8同步时间

    虚拟机中的CentOS stream8挂起以后 xff0c 重新打开系统时间依然是之前的时间 会导致一些操作无效了 CentOS7中可以使用ntpdate同步时间 xff0c 在CentOS stream 8中发现已经无法成功安装此软件了
  • RuoYi开发实战- PostMan请求接口

    最近在学习若依这个开源项目 xff0c 在调试接口时遇到一个小坎 默认的情况下接口是无法直接请求的 xff0c 请求会报以下的错误 xff1a span class token punctuation span span class tok
  • RuoYi若依代码生成+一键部署

    若依代码生成器很强大的 xff0c 可以让我们写增删改查的效率大增 但是我在用的过程中总感觉还不够爽快 我想根据自己的想法改造一下 若依代码生成的基本操作如下 xff1a https www bilibili com video BV1ba
  • 若依yml配置文件读取方法学习

    SpringBoot的yml配置用了好多年了 xff0c 若依的方式让我眼前一亮 这些做确实挺好用的 generator yml RuoYi Vue ruoyi generator src main resources generator
  • Netty核心源码分析(四)心跳检测源码分析

    文章目录 系列文章目录一 心跳检测案例二 源码分析1 Netty心跳的三个Handler2 IdleStateHandler源码 xff08 1 xff09 四个关键属性 xff08 2 xff09 handlerAdded方法 xff08
  • mybatis执行sql脚本

    最近在学习若依这个开源项目 xff1a https gitee com y project RuoYi Vue 默认的代码生成模块用起来总感觉别扭 xff0c 比如说 xff0c 每次生成的代码还要单独的手动执行一下SQL语句 我就在想能不
  • 解决@Autowired IDEA编译Could not autowire. No beans of ‘xxxx‘ type found.

    现象 最近在学习若依开发框架 xff0c 发现若依的一些代码在IDEA中有报错显示 xff0c 但是实际上是可以正常编译的 虽然不影响实际开发 xff0c 对于强迫证程序员来说看到这两个erro真的难受 原因分析 IDEA 可以理解 Spr
  • 若依框架登录去除验证码

    若依框架自带的登录功能还是挺好用的 但是在开发过程中经过因在编写代码或者编写设计文档登录会话到期重新登录 重新登录就会出现验证码 xff0c 一天如果要输入10次验证码也会浪费不少时间 验证码这个功能在生产环境非常有必要 xff0c 但是在
  • IDEA若依框架新建模块

    创建新的module 项目上鼠标右键 选择Maven项目 Parent选ruoyi 点击Finish 编辑RuoYi Vue Wisdom ruoyi wisdom pom xml 在 lt artifactId gt ruoyi wisd
  • SpringBoot拦截指定路径统一处理

    最近在做一个有趣的项目 xff0c 做一个API生成小工具 可以对简单的API路径进行配置SQL自动生成API 简单来讲 xff1a URI对应sql api userselect from user api user addresssel
  • vim代码注释生成插件neogen

    更好的注释生成器 支持多种语言和注释约定 项目地址 xff1a https github com danymat neogen 注意事项 nvim版本以大于等于NVIM v0 6 1不然会有报错 插件安装 插件的运行需要依赖nvim tre
  • SpringBoot中封装jdbc工具类

    背景 现在的数据层的开发 xff0c 大多会使用如MyBatis或JPA之类的开发工具 这些开发工具给我们的开发过程中带来了极大的便利 但是在一些极端的场景下往往原生的jdbc方式操作数据库更灵活 xff0c 性能更高 由于部分场景下MyB
  • 若依设置匿名访问路径

    背景 在实际开发的过程中 xff0c 会有一些开放的API是可以游客访问的 xff0c 无需登录的 那么在若依这套框架中如何设置呢 xff1f 配置 文件路径如下 xff1a span class token class name RuoY
  • 初探OGNL表达式

    简介 对象导航图语言 xff08 Object Graph Navigation Language xff09 xff0c 简称OGNL xff0c 是应用于Java中的一个开源的表达式语言 xff08 Expression Languag