zoukankan      html  css  js  c++  java
  • 表达式语言引擎:Apache Commons JEXL 2.1 发布

    http://www.linuxde.net/2011/12/4348.html 
    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 


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

    Java代码  收藏代码
    1. import java.util.Map;    
    2.     
    3. import org.apache.commons.jexl2.Expression;    
    4. import org.apache.commons.jexl2.JexlContext;    
    5. import org.apache.commons.jexl2.JexlEngine;    
    6. import org.apache.commons.jexl2.MapContext;    
    7.     
    8. /**  
    9.  * 动态加载方法  
    10.  * @author wangyfc  
    11.  *  
    12.  */    
    13. public class DyMethodUtil {    
    14.         
    15.     public static Object invokeMethod(String jexlExp,Map<String,Object> map){    
    16.         JexlEngine jexl=new JexlEngine();    
    17.         Expression e = jexl.createExpression(jexlExp);    
    18.         JexlContext jc = new MapContext();    
    19.         for(String key:map.keySet()){    
    20.             jc.set(key, map.get(key));    
    21.         }    
    22.         if(null==e.evaluate(jc)){    
    23.             return "";    
    24.         }    
    25.         return e.evaluate(jc);    
    26.     }    
    27.     
    28. }  

      
      
    调用方式: 

    Java代码  收藏代码
    1. Map<String,Object> map=new HashMap<String,Object>();    
    2. map.put("testService",testService);    
    3. map.put("person",person);    
    4. String expression="testService.save(person)";    
    5. DyMethodUtil.invokeMethod(expression,map);   




    java 中使用jexl进行表达式判断http://hi.baidu.com/leezuu/item/2c98397843284a3c6e29f653 
    使用el在jsp中很方便,那么在java程序中如何实现表达式判断呢,jexl是个不错的选择 

    Java代码  收藏代码
    1. package jexl.test;  
    2. import java.util.List;  
    3. import java.util.ArrayList;  
    4. import java.util.HashMap;  
    5. import java.util.Map;  
    6. import org.apache.commons.jexl2.JexlContext;  
    7. import org.apache.commons.jexl2.JexlEngine;   
    8. import org.apache.commons.jexl2.MapContext;  
    9. public class Tester {  
    10.  /** 
    11.   * @param args 
    12.   */  
    13.  public static void main(String[] args) {  
    14.   // 描述一个人,他有两条腿  
    15.   Map<String, Object> person=new HashMap<String, Object>();  
    16.   person.put("skinColor", "red");  // 皮肤为红色  
    17.   person.put("age", 23);   // 年龄23  
    18.   person.put("cash", 60.8);      // 身上有60.8元现金  
    19.   
    20.   // 左腿定义  
    21.   Map<String, Object> leg1=new HashMap<String, Object>();  
    22.   leg1.put("leftOrRight", "left");  // 左腿  
    23.   leg1.put("length", 20.3);  // 腿长多少  
    24.   leg1.put("hair", 3000);  //有多少腿毛  
    25.     
    26.   // 右腿定义  
    27.   Map<String, Object> leg2=new HashMap<String, Object>();  
    28.   leg2.put("leftOrRight", "right");  // 右腿  
    29.   leg2.put("length", 20.3);  // 腿长多少  
    30.   leg2.put("hair", 3050);  //有多少腿毛  
    31.   // 给他两条腿  
    32.   List<Map<String, Object> > legs=new ArrayList<Map<String, Object> >();  
    33.   legs.add(leg1);  
    34.   legs.add(leg2);  
    35.   person.put("leg",legs);  
    36.     
    37.   // 让这个人变成一个Context,以便Jexl认识他  
    38.   JexlContext context = new MapContext(person);  
    39.     
    40.   JexlEngine engine=new JexlEngine(); // 定义引擎, 1.1与2.1的用法不同,1.1使用的是工厂  
    41.     
    42.   // 看看这个人是否年龄在30岁以上,并且身上有超过100元现金  
    43.   boolean yes=(Boolean)engine.createExpression( "age>30 && cash>100" ).evaluate(context);   
    44.   System.out.println("年龄在30岁以上,并且身上有超过100元现金?  "+yes);  // 他没有  
    45.     
    46.   // 看看这个人是否左腿上有超过2500根汗毛  
    47.   yes=(Boolean)engine.createExpression( "leg[0].hair>2500" ).evaluate(context);   
    48.     
    49.   System.out.println("左腿上有超过2500根汗毛?  "+yes);   // 是的,他有  
    50.     
    51.  }  
    52. }  


    结果打印如下 
    年龄在30岁以上,并且身上有超过100元现金?  false 
    左腿上有超过2500根汗毛?  true 

  • 相关阅读:
    Delphi公用函数单元
    Delphi XE5 for Android (十一)
    Delphi XE5 for Android (十)
    Delphi XE5 for Android (九)
    Delphi XE5 for Android (八)
    Delphi XE5 for Android (七)
    Delphi XE5 for Android (五)
    Delphi XE5 for Android (四)
    Delphi XE5 for Android (三)
    Delphi XE5 for Android (二)
  • 原文地址:https://www.cnblogs.com/kakaisgood/p/10382352.html
Copyright © 2011-2022 走看看