`
longgangbai
  • 浏览: 7339897 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

freemarker 和veclocity的区别

阅读更多

1、概述
Velocity是一个简单而且更加轻量级的工具,但是它没有达到FreeMarker能够做的许多任务,而且它的模板语言不是很强大
我们认为对于大多数应用程序,FreeMarker比Velocity工作更简单,因为:
Ø使用Velocity,你需要寻找特定工具或各种工作环境来一次次的解决典型的模板创作任务,结果会浪费更多时间
Ø工作环境经常意味着在Velocity模板中直接使用Java对象的方法,这违反了简单、无编程HTML设计的观念
Ø或者将表示任务移到控制器代码中,这违反了MVC模式
使用FreeMarker,可以以out-of-the-box(如何翻译确切?)的方式实现Velocity所能做的

2、特性比较清单
下面是一个使用FreeMarker能够实现,而Velocity不能实现的不太全面的特性清单:
(1)数字和日期支持
可以对任何数字类型进行算术运算和比较,包括精度类型
可以比较和显示(格式化)日期/时间值
(2)国际化
根据各种内建和定制的数字格式,格式化本地敏感的数字
根据各种内建和定制的日期格式,格式化本地敏感和时区敏感的日期
标识(变量名)可以包含非英语字符,如重音字符、阿拉伯字符、中文字符等
(3)循环处理
可以跳出循环
可以在循环外访问循环体内的控制变量
可以测试是否达到最后一次循环
(4)模板级别的数组处理
可以使用类似[i]语法的索引方式访问数组元素
可以查询数组长度
(5)宏
宏可以有局部变量
可以递归调用宏,同样可以在模板的后面定义要调用的宏
调用宏时,可以按位置或名字的方式传递参数
宏参数可以有缺省值,使得在调用时忽略参数也有效
调用的宏可以有嵌套的体内容(<@myMacro>body</@myMacro>),能够在宏被调用时进行处理
宏是纯变量的,可以基于表达式来执行宏,或者作为参数传递给另一个宏
(6)命名空间
可以对变量使用多命名空间,这对创建宏库很重要,因为这可以避免应用程序中指定的变量和宏库中变量的名字冲突
(7)使用内建的函数/操作符维护Java无关的string、list和map
可以将字符串转换成大/小写、首字符大/小写,对HTML、XML或RTF进行转义处理,substring、split、查询字符串长度、find/replace子串等等
通过索引访问list元素,获得子list,合并list,查询list长度,对list排序
通过key变量访问map元素,检查map是否为空,获得key或值的list
(8)揭示模板中的错误
当访问一个未定义的变量,FreeMarker不会沉默;你可以配置FreeMarker来停止render模板显示错误信息,或者跳过错误部分;无论哪种,FreeMarker会记录问题(日志)
在写错指令名时,FreeMarker会抛出异常
(9)高级render控制
可以使用一组标记来封装模板的一块区域,以便在块区中所有要修改的地方应用HTML或XML转义(或其它使用FreeMarker表达式表示的转换)
FreeMarker有转换器,它们是模板的一块区域,在render时,通过转换过滤;内建的转换器包括空白字符压缩、HTML和XML转义;你可以实现自己的转换器;当然转换器可以嵌套
可以使用flush指令显式的flush输出
可以使用stop指令停止render
(10)文字
除了通常的字符串、数字和布尔值文字,也可以在模板中定义list和map文字
支持所有的Java转义文字:\b、\t、\n、\f、\r、\”、\’、\\,也支持\xXXXX使用UNICODE指定字符
(11)高级空白字符移除
FreeMarker坚持移除各行只包含不输出FreeMarker标记的空白字符
对于明显要整修掉不需要的空白字符的指令来说,空白字符是个大问题
(12)集成其它技术
可以在模板中使用JSP标记库
可以直接在Python工程中使用
(13)强大的XML转换能力
在2.3版本中,FreeMarker具有强大的新XML转换能力,使得替代XSLT成为可能
Velocity在这方面是无法真正竞争的,除非改进核心引擎,如支持宏库映射到名字空间,宏中支持局部变量
(14)高级模板元程序
可以捕获输出的任何部分到context变量中
可以解释任何context变量,如果它是一个模板定义

补充下:如果处理我的bt需求(我要获取模板中所有定义的变量),velocity提供一个比较便利的方法,而freemarker就只能通过蹩脚的方法来获取啦。

下边是我们获取velocity中那些我们定义的要替换标签的方法示例:

view plaincopy to clipboardprint?
import org.apache.velocity.Template;  
    import org.apache.velocity.VelocityContext;  
    import org.apache.velocity.app.Velocity;  
    import org.apache.velocity.exception.ParseErrorException;  
    import org.apache.velocity.exception.ResourceNotFoundException;  
    import org.apache.velocity.runtime.parser.Token;  
    import org.apache.velocity.runtime.parser.node.ASTprocess;  
    /** 
     * <pre> 
     * 从给定的template file中得到我们自定义标记的名字 
     * 用tag_prefix区分,[我们自定义的标记]和[其他变量] 
     * </pre> 
     *  
     * @param file 
     *            模板文件(相对于初始化设定的模板目录的路径) 
     * @param tag_prefix 
     *            自定义标签的前缀 
     * @return 
     * @throws ResourceNotFoundException 
     * @throws ParseErrorException 
     * @throws Exception 
     */ 
    public static String[] getTagNames(String file, String tag_prefix)  
            throws ResourceNotFoundException, ParseErrorException, Exception {  
        Template tmpl = getTemplate(file);  
        ASTprocess ast = (ASTprocess) tmpl.getData();  
        //  
        List<String> tagNames = new ArrayList<String>();  
        for (Token t = ast.getFirstToken(); t != null;) {  
            if (t.image.startsWith("$")) {  
                String tagName = t.image.substring(1);  
                if (tagName.startsWith(tag_prefix)  
                        && !tagNames.contains(tagName)) {  
                    tagNames.add(tagName);  
                }  
            }  
            if (t.next != null) {  
                if (t.equals(ast.getLastToken())) {  
                    break;  
                }  
            }  
            t = t.next;  
        }  
        String[] result = tagNames.toArray(new String[] {});  
        return result;  
    } 
import org.apache.velocity.Template;
 import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.Velocity;
 import org.apache.velocity.exception.ParseErrorException;
 import org.apache.velocity.exception.ResourceNotFoundException;
 import org.apache.velocity.runtime.parser.Token;
 import org.apache.velocity.runtime.parser.node.ASTprocess;
 /**
  * <pre>
  * 从给定的template file中得到我们自定义标记的名字
  * 用tag_prefix区分,[我们自定义的标记]和[其他变量]
  * </pre>
  *
  * @param file
  *            模板文件(相对于初始化设定的模板目录的路径)
  * @param tag_prefix
  *            自定义标签的前缀
  * @return
  * @throws ResourceNotFoundException
  * @throws ParseErrorException
  * @throws Exception
  */
 public static String[] getTagNames(String file, String tag_prefix)
   throws ResourceNotFoundException, ParseErrorException, Exception {
  Template tmpl = getTemplate(file);
  ASTprocess ast = (ASTprocess) tmpl.getData();
  //
  List<String> tagNames = new ArrayList<String>();
  for (Token t = ast.getFirstToken(); t != null;) {
   if (t.image.startsWith("$")) {
    String tagName = t.image.substring(1);
    if (tagName.startsWith(tag_prefix)
      && !tagNames.contains(tagName)) {
     tagNames.add(tagName);
    }
   }
   if (t.next != null) {
    if (t.equals(ast.getLastToken())) {
     break;
    }
   }
   t = t.next;
  }
  String[] result = tagNames.toArray(new String[] {});
  return result;
 }

由此可见,有些时候我们可以将velocity和freemarker一起来使用做一些各自擅长的工作。

 

分享到:
评论

相关推荐

    Velocity 和 FreeMarker区别

    ### Velocity与FreeMarker的区别 在IT领域特别是Java开发中,模板引擎是不可或缺的一部分,它们用于将数据模型转换为HTML、PDF、Word文档等格式。在众多模板引擎中,Velocity和FreeMarker是两种非常受欢迎的选择。...

    模板:velocity和freemarker的比较

    Velocity和Freemarker模板技术比较 模板技术在现代软件开发中扮演着重要角色,而在目前最流行的两种模板技术中, Velocity 和 Freemarker 独占鳌头。在 WebWork2 中,我们可以随意选择使用 Freemarker 或 Velocity ...

    velocity和freemarker的比较

    标题“velocity和freemarker的比较”涉及到的是两个在Java Web开发中常用的模板引擎——Velocity和FreeMarker。它们都是用于将静态模板与动态数据结合,生成HTML或其他类型的文本输出,常用于MVC(模型-视图-控制器...

    springboot集成freemarker和shiro框架

    而FreeMarker和Shiro则分别是常用的模板引擎和安全框架,它们能帮助我们构建出功能强大且安全的Web应用。本文将详细讲解如何在SpringBoot项目中整合这两者。 **一、FreeMarker简介** FreeMarker是一个基于模板的...

    freemarker 自定义freeMarker标签

    FreeMarker使用${...}表达式来插入变量,#{...}用于输出注释,以及、等控制结构进行条件判断和循环。然而,这些默认标签可能无法满足所有复杂的场景,因此自定义标签就显得尤为必要。 自定义FreeMarker标签通常涉及...

    jsp、freemarker、velocity简介和对比

    ### jsp、freemarker、velocity简介和对比 在Java Web开发领域,模板引擎是连接后端业务逻辑与前端展示层的重要桥梁。本文将重点介绍三种常用的Java Web模板引擎:JSP(Java Server Pages)、Freemarker以及...

    FreeMarker2.3.23官方中文文档

    2.3.23是FreeMarker的一个稳定版本,这个版本的官方中文文档提供了全面的指导和说明,帮助开发者更好地理解和使用这个模板语言。 在FreeMarker的核心概念中,它是一个基于数据驱动的模板语言。这意味着,开发者不...

    freemarker-2.3.23jar

    总的来说,`freemarker-2.3.23.jar`作为Freemarker的一个版本,是Java Web开发中的重要工具,它提供了灵活、高效的模板引擎,帮助开发者将数据和视图分离,降低了前端与后端的耦合度,提高了代码的可维护性和可扩展...

    freemarker-2.3.28.jar

    Freemarker是一个强大的模板引擎,主要用于生成动态HTML、XML或其他文本格式的文件,广泛...在"freemarker2.3.28"这个压缩包中,可能包含了Freemarker的完整源代码、文档、示例和其他相关资源,便于深入理解和自定义。

    freemarker Demo 适用于freemarker初学

    这个"freemarker Demo"是一个适合初学者的示例项目,旨在帮助新接触Freemarker的开发者快速理解和上手。 1. **Freemarker简介** Freemarker是一个基于模板的开源模板语言,它与Java代码分离,使得开发者可以专注于...

    freemarker各种版本的jar包

    以下是对给定的Freemarker不同版本jar包的详细说明: 1. **Freemarker 2.3.19**: - 这个版本可能包含了一些基本的功能,如模板语言的语法,变量、表达式和控制结构。 - 它可能已经支持了数据模型绑定,允许...

    freemarker-ide插件

    在Eclipse这样的集成开发环境中,这款插件能够显著提升开发人员编写和调试`.ftl`(FreeMarker Template Language)文件的效率。 首先,让我们了解一下Freemarker模板语言。Freemarker是一个基于Java的模板引擎,常...

    freemarker-2.3.31-API文档-中文版.zip

    赠送jar包:freemarker-2.3.31.jar; 赠送原API文档:freemarker-2.3.31-javadoc.jar; 赠送源代码:freemarker-2.3.31-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    freemarker-2.3.30-API文档-中文版.zip

    赠送jar包:freemarker-2.3.30.jar; 赠送原API文档:freemarker-2.3.30-javadoc.jar; 赠送源代码:freemarker-2.3.30-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    安装freemarker插件(freemarker的eclipse插件)

    安装freemarker插件(freemarker的eclipse插件) a) 首先下载 freemarker-ide-0.9.14.zip(在这里不用下载了,附件中已经有了) b) 解压后:把hudson.freemarker_ide_0.9.14这个文件放到:eclipse\plugins下面 c) 发现...

    FreeMarker手册-Freemarker 2.3.18

    FreeMarker 2.3.18是该引擎的一个版本,它提供了一系列的更新和改进,以提高性能和易用性。 1. **模板语言基础** FreeMarker的模板语言是一种声明式的编程方式,它允许开发者通过简单的标记语法来控制输出。这些...

    freemarker.jar用于jdk1.8下使用

    1. **模板语法**:Freemarker的模板语言是弱类型的,使用${}和#[[]]来表示变量和表达式。例如,`${user.name}`会输出用户对象的name属性。`#[[if user.isAdmin]]`则用于条件判断,如果user对象的isAdmin属性为真,则...

    Freemarker导出 word 和 pdf 工具类

    本篇文章将详细解析如何使用Freemarker来导出Word和PDF文档,并探讨相关工具类的设计与实现。 1. Freemarker基础 Freemarker是一个基于模板的语言,它与编程语言结合,用于生成动态内容。它的主要优势在于将业务...

    freemarker.jar

    camel-freemarker-1.6.4.jar, camel-freemarker-2.8.1.jar, com.springsource.freemarker-2.3.15.jar, com.springsource.freemarker-sources-2.3.15.jar, freemarker-1.4.1.jar, freemarker-2-3-18.jar, freemarker-...

    导出Word:POI or Freemarker

    本文将详细介绍两种使用Java技术导出Word文档的方法:Apache POI库和Freemarker模板引擎。 首先,Apache POI是Apache软件基金会的一个开源项目,主要为Microsoft Office格式提供读写功能,包括Word(.doc/.docx)、...

Global site tag (gtag.js) - Google Analytics