zoukankan      html  css  js  c++  java
  • JEXL实现模板引擎的功能

    JEXL是一个表达式语言的解析引擎,用来解析表达式,被用来做一个条件判断,数据有效性校验,工作流等场合,一个示例如下:

     

    Java代码  收藏代码
    1. private static HashMap<String, Object> contextMap = new HashMap<String, Object>();  
    2.   
    3.     @Before  
    4.     public void init() {  
    5.         contextMap.put("str", "字符串");  
    6.         contextMap.put("index", 12);  
    7.         contextMap.put("map", new HashMap<String, Object>() {  
    8.             {  
    9.                 this.put("key1", "value1");  
    10.             }  
    11.         });  
    12.     }  

     

    首先有一些基础数据:通过这些基础数据计算一些表达式的示例如下:

    Java代码  收藏代码
    1. @Test  
    2.     public void testJexl() throws Exception {  
    3.   
    4.         String[] expressions = new String[] { "12+3", "str", "index",  
    5.                 "index+5", "map.key1" };  
    6.         JexlContext jexlContext = JexlHelper.createContext();  
    7.         jexlContext.setVars(contextMap);  
    8.         for (String expression : expressions) {  
    9.             Expression expr = ExpressionFactory.createExpression(expression);  
    10.             Object obj = expr.evaluate(jexlContext);  
    11.             System.out.println(expression + "  =>  " + obj);  
    12.         }  
    13.     }  

     

    该程序的运行结果为:

    Java代码  收藏代码
    1. 12+3  =>  15  
    2. str  =>  字符串  
    3. index  =>  12  
    4. index+5  =>  17  
    5. map.key1  =>  value1  

     

        但是在一些稍微复杂的场合,除了表达式本身,还有一些其他的数据,或者无法区分一个字符串是否为表达式的情况,比如制作的数据导出模板,有一些单元格是需 要通过表达式取值的,而另外一些单元格就是纯粹的文本,这就没有直接通过表达式引擎对这些格子计算值了,在这样的场景下,其实是应该应用freemarker之类的模板引擎来计算格子的值的,但是由于会用到一些复杂的运算,如三元表达式等,freemarker显得有点不能胜任,所以还是考虑用jexl实现模板引擎的功能,仍然以上面的基础数据为例,期望以下的表达式输出结果:

     

    Txt代码  收藏代码
    1. 1+2=${1+2}  =>  1+2=3  
    2. str is ${str}  =>  str is 字符串  
    3. index is ${index}  =>  index is 12  
    4. index+5 is ${index+5}  =>  index+5 is 17  
    5. map.key1 is ${map.key1}  =>  map.key1 is value1  
    6. inner expression ${index+${index+${index}} + ${index}}  =>  inner expression 48  

     

        即,通过解析字符串中是否包含EL表达式${},如果包含就调用JEXL引擎去解析该表达式,从而实现一个利用JEXL解析的模板引擎,从期望的结果可以看出,该模板引擎支持简单的表达式解析和嵌套表达式解析功能。

      

  • 相关阅读:
    HTML5 新标签
    lAMBDA表达式剖析
    whitespace 属性设置如何处理元素内的空白。
    "~/" asp.net 表示路径的方法
    ASP.NET Session详解
    关于CSS Selector的优先级
    关于汉字转拼音
    ChildActionOnly + ActionName的用法
    html中的caption是什么用
    window.location.href location.href parent.location.href
  • 原文地址:https://www.cnblogs.com/maple42/p/3951516.html
Copyright © 2011-2022 走看看