您的位置:首页 > Web前端 > JavaScript

jsp,velocity,freemark页面引擎的比较

2014-10-28 09:22 183 查看
在java领域,表现层技术主要有三种:jsp、freemarker、velocity。

jsp是大家最熟悉的技术

优点:

1、功能强大,可以写java代码

2、支持jsp标签(jsp tag)

3、支持表达式语言(el)

4、官方标准,用户群广,丰富的第三方jsp标签库

5、性能良好。jsp编译成class文件执行,有很好的性能表现

缺点:

jsp没有明显缺点,非要挑点骨头那就是,由于可以编写java代码,如使用不当容易破坏mvc结构。

velocity是较早出现的用于代替jsp的模板语言

优点:

1、不能编写java代码,可以实现严格的mvc分离

2、性能良好,据说比jsp性能还要好些

3、使用表达式语言,据说jsp的表达式语言就是学velocity的

缺点:

1、不是官方标准

2、用户群体和第三方标签库没有jsp多。

3、对jsp标签支持不够好

freemarker

优点:

1、不能编写java代码,可以实现严格的mvc分离

2、性能非常不错

3、对jsp标签支持良好

4、内置大量常用功能,使用非常方便

5、宏定义(类似jsp标签)非常方便

6、使用表达式语言

缺点:

1、不是官方标准

2、用户群体和第三方标签库没有jsp多

选择freemarker的原因:

1、性能。velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差(虽然只是几毫秒到十几毫秒的差距)。但是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tag和el的jsp好。

2、宏定义比jsp tag方便

3、内置大量常用功能。比如html过滤,日期金额格式化等等,使用非常方便

4、支持jsp标签
5、可以实现严格的mvc分离

下面是一个使用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变量,如果它是一个模板定义

上述两者的结合使用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  freemarker velocity jsp