首页 > 其他分享 >表达式语言引擎:Apache Commons JEXL 2.1 发布

表达式语言引擎:Apache Commons JEXL 2.1 发布

时间:2023-05-24 13:06:37浏览次数:37  
标签:Commons new commons put JEXL org Apache import apache


Commons JEXL 2.1 发布了,该版本和 2.0.1 是二进制兼容的,但源码不兼容,因为新增了两个接口:

org.apache.commons.jexl2.Script
org.apache.commons.jexl2.JexlInfo
JEXL 2.1 改进内容:

A more thorough arithmetic (JexlArithmetic) that allows fine control over decimals (scale and precision), a new syntax for numeric literals (OGNL inspired Big and Huge notations) and a better type handling keeping the most appropriate representation in casual operations.
The introduction of script variables and parameters that reduce context dependencies and methods; this allows to perform checks after script creation (light static checking hints). Plus the ability to call script from scripts.
A sandoxing feature to restrict and rename what JEXL can access from the environment allowing tighter control over security.
Extensions to UnifiedJEXL that allow the creation of templates.
完整记录请看:http://commons.apache.org/jexl/changes-report.html#a2.1

JAVA Expression Language (JEXL) 是一个表达式语言引擎,可以用来在应用或者框架中使用。JEXL 受Velocity 和 JSP 标签库 1.1 (JSTL) 的影响而产生的。需要注意的是, JEXL 并不时 JSTL 中的表达式语言的实现。

下载地址:http://commons.apache.org/jexl/download_jexl.cgi


[color=red][b]java实现字符串转换成可执行代码[/b][/color]
1. [url]http://wiselyman.iteye.com/blog/1677444[/url]
2. [url]http://blog.5ibc.net/p/51238.html[/url]
使用commons的jexl可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能:

import java.util.Map;  

import org.apache.commons.jexl2.Expression;  
import org.apache.commons.jexl2.JexlContext;  
import org.apache.commons.jexl2.JexlEngine;  
import org.apache.commons.jexl2.MapContext;  

/** 
 * 动态加载方法 
 * @author wangyfc 
 * 
 */  
public class DyMethodUtil {  

    public static Object invokeMethod(String jexlExp,Map<String,Object> map){  
        JexlEngine jexl=new JexlEngine();  
        Expression e = jexl.createExpression(jexlExp);  
        JexlContext jc = new MapContext();  
        for(String key:map.keySet()){  
            jc.set(key, map.get(key));  
        }  
        if(null==e.evaluate(jc)){  
            return "";  
        }  
        return e.evaluate(jc);  
    }  

}




调用方式:


Map<String,Object> map=new HashMap<String,Object>();  
map.put("testService",testService);  
map.put("person",person);  
String expression="testService.save(person)";  
DyMethodUtil.invokeMethod(expression,map);




[color=red][b]java 中使用jexl进行表达式判断[/b][/color][url]http://hi.baidu.com/leezuu/item/2c98397843284a3c6e29f653[/url]


使用el在jsp中很方便,那么在java程序中如何实现表达式判断呢,jexl是个不错的选择


package jexl.test;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.jexl2.JexlContext;
import org.apache.commons.jexl2.JexlEngine; 
import org.apache.commons.jexl2.MapContext;
public class Tester {
 /**
  * @param args
  */
 public static void main(String[] args) {
  // 描述一个人,他有两条腿
  Map<String, Object> person=new HashMap<String, Object>();
  person.put("skinColor", "red");  // 皮肤为红色
  person.put("age", 23);   // 年龄23
  person.put("cash", 60.8);      // 身上有60.8元现金

  // 左腿定义
  Map<String, Object> leg1=new HashMap<String, Object>();
  leg1.put("leftOrRight", "left");  // 左腿
  leg1.put("length", 20.3);  // 腿长多少
  leg1.put("hair", 3000);  //有多少腿毛

  // 右腿定义
  Map<String, Object> leg2=new HashMap<String, Object>();
  leg2.put("leftOrRight", "right");  // 右腿
  leg2.put("length", 20.3);  // 腿长多少
  leg2.put("hair", 3050);  //有多少腿毛
  // 给他两条腿
  List<Map<String, Object> > legs=new ArrayList<Map<String, Object> >();
  legs.add(leg1);
  legs.add(leg2);
  person.put("leg",legs);

  // 让这个人变成一个Context,以便Jexl认识他
  JexlContext context = new MapContext(person);

  JexlEngine engine=new JexlEngine(); // 定义引擎, 1.1与2.1的用法不同,1.1使用的是工厂

  // 看看这个人是否年龄在30岁以上,并且身上有超过100元现金
  boolean yes=(Boolean)engine.createExpression( "age>30 && cash>100" ).evaluate(context); 
  System.out.println("年龄在30岁以上,并且身上有超过100元现金?  "+yes);  // 他没有

  // 看看这个人是否左腿上有超过2500根汗毛
  yes=(Boolean)engine.createExpression( "leg[0].hair>2500" ).evaluate(context); 

  System.out.println("左腿上有超过2500根汗毛?  "+yes);   // 是的,他有

 }
}


结果打印如下


年龄在30岁以上,并且身上有超过100元现金? false


左腿上有超过2500根汗毛? true



上面的例子,如果不知道哪条是左腿呢,这样的表达式该如何写? leg[leftOrRight='left'].hair>2500 ?


这个写法不会报错,但结果不正确,不知如何实现,求答复


标签:Commons,new,commons,put,JEXL,org,Apache,import,apache
From: https://blog.51cto.com/u_3871599/6338584

相关文章

  • Apache Hudi 在袋鼠云数据湖平台的设计与实践
    在大数据处理中,实时数据分析是一个重要的需求。随着数据量的不断增长,对于实时分析的挑战也在不断加大,传统的批处理方式已经不能满足实时数据处理的需求,需要一种更加高效的技术来解决这个问题。ApacheHudi(HadoopUpsertsDeletesandIncrementalProcessing)就是这样一种技术,提供......
  • Apache maven 安装与配置 (Mac)
    一、准备文件Maven3.5.4version下载 https://maven.apache.org/download.cgi  二、安装与配置(1)安装将下载好的文件解压到/usr/local目录下,如果找不到/usr/local目录,可以打开苹果访达,按住shift+command+G,则会弹出一个搜索框,在里面输入/usr/local即可出现。也可以使......
  • Apache-maven的安装与配置(IDEA)
    https://mbd.baidu.com/ug_share/mbox/4a83aa9e65/share?product=smartapp&tk=8b0406b2ed7c5e71944c9c31062c5007&share_url=https%3A%2F%2Fyebd1h.smartapps.cn%2Fpages%2Fblog%2Findex%3FblogId%3D122922148%26_swebfr%3D1%26_swebFromHost%3Dbaiduboxapp&domai......
  • org.apache.jasper.JasperException: /pages/role-list.jsp (行.: [145], 列: [8]) 根
    org.apache.jasper.JasperException:/pages/role-list.jsp(行.:[145],列:[8])根据标记文件中的TLD或attribute指令,attribute[items]不接受任何表达式 web.xml中版本号不兼容产生的问题;解决方法:<%@taglibprefix=“c”uri=“http://java.sun.com/jstl/core”%>改为<%@t......
  • 开源之夏 2023|欢迎报名 Apache RocketMQ 社区项目!
    开源之夏是由中科院软件所“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动,旨在鼓励在校学生积极参与开源软件的开发维护,培养和发掘更多优秀的开发者,促进优秀开源软件社区的蓬勃发展,助力开源软件供应链建设。参与学生通过远程线上协作方式,配有资深导师指导,参与到开源......
  • Apache Log4j2远程代码执行漏洞(CVE-2021-44228)修复
    1、演示说明:最近在项目中遇到用户扫描es时发现ApacheLog4j2远程代码执行漏洞(CVE-2021-44228),该漏洞具体原理不再赘述,此处分享解决过程。2、演示环境:(1)系统版本:#cat/etc/redhat-release(2)JDK版本:#java-version(3)es版本:#./elasticsearch-V3、下载命令行扫描工具:下载地址:https://gi......
  • Apache、Tomcat、IIS(PHP、JSP、ASP)共存及安装Tomcat
    1.安装Tomcatapt-getinstalltomcat7apt-getinstalltomcat7-adminapt-getinstalltomcat7-docsapt-getinstalltomcat7-examples 2.开启,中止和重启/etc/init.d/tomcat7start/etc/init.d/tomcat7stop/etc/init.d/tomcat7restart 3.根目录链接cd/var/l......
  • Apache MINA 初
    3。编写一个ApacheMINA时间服务器该程序的功能非常简单,就是当客户端连接到服务器的9123端口后,程序将服务器当前的时间信息以字符串的形式发送给客户端。我们可以用Eclipse来创建编写这个程序。(1)在Eclipse中创建一个Java项目,例如TimeServerProject,然后将mina-core-2.0.0-M1.jar、......
  • apache整合tomcat
    为什么要用apache来整合tomcat呢?首先,是因为apache是静态服务器,tomcat是动态服务器,二者相辅相成,才能完美构建一个web服务器;其次,用apache作为中心服务器器,将请求分发到多个tomcat,解决负载均衡,实现服务器的稳定性。那么,也有人会说,ngnix整合tomcat不就可以了,而且也很流行。我想说,实现......
  • apache shiro - 动态创建filterchaindefinitions
    [url]http://www.360doc.com/content/14/0207/13/834950_350425926.shtml[/url]有时,在某些系统想通过读取数据库来定义org.apache.shiro.spring.web.ShiroFilterFactoryBean的filterChainDefinitions。这样能够通过操作界面或者维护后台来管理系统的链接。......