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 

  • 相关阅读:
    IntelliJ IDEA 中自定义模板代码的缩写
    小猪评《101次求婚》——屌丝是否能够逆袭女神
    C#委托的理解
    ASP.NET MVC权限验证
    ASP.NET MVC 中表单的Encode及Decode
    JQuery方式验证表单和AJAX提交
    C# LIST 的各种加减
    小猪决定做一件尝试
    ASP.NET 将excel导入 sql server
    从客户端XXX中检测到有潜在危险的 Request.Form值——终极解决方案
  • 原文地址:https://www.cnblogs.com/kakaisgood/p/10382352.html
Copyright © 2011-2022 走看看