Velocity和FreeMarker模版技术

来源:互联网 发布:贵阳 云计算 编辑:程序博客网 时间:2024/05/21 19:32

             模板技术在现代的软件开发中有着重要的地位,而目前最流行的两种模板技术恐怕要算freemarker和velocity了,webwork2.2对两者都有不错的支持,也就是说在webwork2中你可以随意选择使用freemarker或velocity作为view,模板技术作为view的好处是很多,尤其和jsp比较起来优点更大,众所周知jsp需要在第一次被执行的时候编译成servlet,那么这个过程是很慢的,当然很多应用服务器都提供预编译的功能,但是在开发的时候仍然给我们程序员带来了很多痛苦,每次修改都要多几秒钟,那在一天的开发中就有很多时间浪费在jsp的编译上了。用webwork in action的作者的话来说:“每次修改之后重新运行都要等等几秒是令人失望的,而频繁地修改jsp更是会令你的失望情绪变本加厉“。我们把模板技术引入到view中去可以带来更好的开发效率,而且模板的速度要比jsp快(虽然编译过后的jsp在速度上已经满足我的需求了,呵呵)。 当然模板技术可以用在很多领域,可不只在view那里。我们可以通过模板技术来生成xml,生成jsp,生成java文件等等,说到这里,大家通常会使用模板技术用在公司的框架里,这样就可以很快速的生成添删改查的代码,需要的只是模板,其他比如还有邮件模板等等。 

以上是模板的作用,当然模板还有其他领域的应用,希望能和大家多讨论,提高我们的生产效率。 

那么现在开源的模板技术有好几种,多了之后就有一个选择的问题了,如何选择一个满足自己需要的模板的呢,我大概了看了一下两种模板技术,写了一个例子,我使用了几种设计模式来完成了这个例子,这个例子中,我同时使用了freemarker和velocity,这样同学们可以通过代码很直观的比较两种模板技术,通过这个例子,我认识到freemarker在功能上要比velocity强大 
1在view层的时候,它提供了format日期和数字的功能,我想大家都有在页面上format日期或数字的经验,用jsp的同学可能对jstl的fmt标签很有感情,使用了freemarker之后也可以使用freemarker提供的功能来formmat日期和数据,这个功能我想是很贴心的 

2通过我的使用我发现freemaker的eclipseplugin要比velocity的eclipseplugin好,如果你是用idea那很遗憾,我没有找到类似的插件。好在很多地方呢,我看到的是freemarker的插件除了支持freemarker语法也支持html语句,而velocity的插件貌似只支持velocity的语法,html就只是用普通的文本来显示了,在这一点上freemarker占上风了(不要和我说高手都是用windows记事本之类的话,这本来就违背了模板技术的初衷) 

3freemarker对jsptag的支持很好,算了,不到迫不得已还是不要这样做吧。 

还有就是两者的语法格式,这一点上不同的人有不同倾向

由于网易博客没用代码插入功能,所以例子就不转载了,需要的朋友去原文http://mamacmm.javaeye.com/blog/485332看吧,有下载

 

二,抄录于http://southking.javaeye.com/blog/235920

Velocity和FreeMarker优缺点


Velocity优点: 
采用简单而强大的模板语言VTL来渲染页面,能保证在Dreamwaver之类的可视化编辑器中正常显示。 
模板可以是任意扩展名,采用.html也可以,这样就能直接在浏览器中看到效果。 
渲染速度快。 
Velocity缺点: 
不是JavaEE标准,文档较少。 
VTL语法需要一定上的学习时间,尽管相对较容易。 


FreeMarker优点: 
Struts2默认采用(是否溶合起来比Velocity更容易?) 
具有一些编程能力,虽然有限,只能提供一些数据格式的轮换功能。 
与WEB容器无关,除了HTML,也可以生成各种文本,如XML、RTF、Java源代码等。 
FreeMarker缺点: 
freemarker的map限定key必须是string,不支持其他数据类型。 
freemarker的变量必须有值,没有被赋值的变量就会抛出异常。程序里面几乎所有可能出现空值的变量统统需要加上${xxx?if_exists},有些循环条件还需要写if判断。 
不能在群集上面发布应用。freemarker支持在页面里面直接操作Session,request等,例如${Session[...]},但不能对其序列化。

 

 

三,转载于http://www.zzbaike.com/wiki/Velocity%E4%B8%8EFreeMarker

Velocity与FreeMarker

相比较FreeMarker而言,Velocity更加简单、轻量级,但它的功能却没有FreeMarker那么强大。依据评测的结论, freemarker 稍快一些。差别在毫秒级别,对用户而言可以忽略不计,若超大流量,考虑负载时,较倾向后者。

velocity 出现得较早些,也有更多的受众,因此在考虑到人员配给上,略占优势。但是模板技术上手都很快的,所以无所谓。

对于大部分的应用来说,使用 FreeMarker 比 Velocity 更简单,因为 Velocity 还必须编写一些自定义的toolbox类以及一遍遍重复的编写一些比较通用的模版代码,因此也就丧失了刚开始开发时更多的宝贵时间。另外使用工具类和变通的方法在模版引擎中似乎不是一个非常有效的做法。同时,Velocity 的做法使得在Velocity的模版中大量的跟 Java 对象进行交互,这违反了简单的原则,尽管你也可以将代码转入控制器中实现。当然,如果你像使用 Velocity 一样来使用 FreeMarker ,那么 FreeMarker 也可以跟 Velocity 一样简单。

Velocity 一个优于FreeMarker的地方在于它有很广泛的第三方支持以及一个非常庞大的用户社区,你可以通过这个社区获得到很多的帮助,相反的FreeMarker在这方面要差很多。当然,也有越来越多的第三方软件开始在支持 FreeMarker 。

下面是一些 FreeMarker 能做到的,而 Velocity 做不到的功能列表(且看着):

  • 日期和数字的支持

您可以执行运算和比较,对任意数量的类型,包括任意精度类型,而不仅仅是整数。您可以比较和显示(格式化)日期/时间值。

  • 国际化

您可以格式数字区域,各种各样的内置和自定义数字格式模式。您可以格式日期地区和时区,各种各样的内置和定制的日期格式模式。标识符(变量名)可以包含非英语字母一样重音字母,阿拉伯字母,汉字等

  • 循环处理

您可以退出循环您可以访问控制变量外循环机构的内部循环您可以得知当前是否到了循环的结束位置

  • 模版级别的数组处理

您可以使用[i]的语法来访问数组元素,包括原始的和非原始的指数可以获取到数组的长度

  • 宏定义

宏调用可以通过位置或名称进行参数传递宏的参数可以设定默认值,在调用宏时如果没有指定该参数,则使用默认值代替通过 <@myMacro>body</@myMacro> 可以支持宏的嵌套可以通过文本表达的“宏的名称”来直接调用某个宏宏允许先使用再定义宏可以定义局部变量(新版本的Velocity也通过#local指令来实现该功能,尽管官方的文档还没有进行介绍)

  • 命名空间

您可以使用多个名称空间的变数。当您建立“宏库”时是非常有用的 ,因为可以防止名称冲突与申请特定变量或与其他宏变量的库。

  • 内置与 Java 语言无关的字符串、列表、Map 的操作方法
  • 能提示模版中的拼写错误以及其他错误

当访问一个不存在的变量时,FreeMarker 在执行该模版时会报错,通过配置,你可以指定 FreeMarker 在碰到此类错误时是停止执行,还是忽略该错误,同时 FreeMarker 会在日志中记录此问题;如果您输入错误指令的名称,FreeMarker将抛出一个异常。

  • 更高级的文本输出工具


  • 文本处理

支持Java的特殊字符处理,例如\b, \t, \n, \f, \r, \", \', \\,以及UNICODE的\xXXXX 除了通常的字符串,数字,和布尔常量您可以定义列表和地图文字以及内部模板

  • 高级的空格清除

FreeMarker 将删除一些多余的空格、跳格、换行等字符,从而消除一些令人厌烦的明显多余的空格 FreeMarker 也提供指令来删除多于的空格

  • 与其他技术的集成

提供JSP 标签库以便在 JSP 中嵌入 FreeMarker 模版可以直接跟 Python 对象一起工作

  • 更强大的XML转换功能
  • 先进的模板元程序

您可以捕捉到输出的任意部分范本背景变量您可以任意解释的范围变量,就好像它是一个模板定义