表達式語言引擎: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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM