在java领域,表现层技术主要有三种:jsp、freemarker、velocity。html
jsp是你们最熟悉的技术
优势:
一、功能强大,能够写java代码
二、支持jsp标签(jsp tag)
三、支持表达式语言(el)
四、官方标准,用户群广,丰富的第三方jsp标签库
五、性能良好。jsp编译成class文件执行,有很好的性能表现
缺点:
jsp没有明显缺点,非要挑点骨头那就是,因为能够编写java代码,如使用不当容易破坏mvc结构。
velocity是较早出现的用于代替jsp的模板语言
优势:
一、不能编写java代码,能够实现严格的mvc分离
二、性能良好,听说比jsp性能还要好些
三、使用表达式语言,听说jsp的表达式语言就是学velocity的
缺点:
一、不是官方标准
二、用户群体和第三方标签库没有jsp多。
三、对jsp标签支持不够好
freemarker
优势:
一、不能编写java代码,能够实现严格的mvc分离
二、性能很是不错
三、对jsp标签支持良好
四、内置大量经常使用功能,使用很是方便
五、宏定义(相似jsp标签)很是方便
六、使用表达式语言
缺点:
一、不是官方标准java
二、用户群体和第三方标签库没有jsp多express
选择freemarker的缘由:
一、性能。velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差(虽然只是几毫秒到十几毫秒的差距)。可是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tag和el的jsp好。
二、宏定义比jsp tag方便
三、内置大量经常使用功能。好比html过滤,日期金额格式化等等,使用很是方便
四、支持jsp标签
五、能够实现严格的mvc分离api
#####################################################################数组
相比较 FreeMarker 而言,Velocity 更加简单、轻量级,但它的功能却没有 FreeMarker 那么强大。mvc
对于大部分的应用来讲,使用 FreeMarker 比 Velocity 更简单,由于 Velocity 还必须编写一些自定义的toolbox类以及一遍遍重复的编写一些比较通用的模版代码,所以也就丧失了刚开始开发时更多的宝贵时间。另外使用工具类和变通的方法在模版引擎中彷佛不是一个很是有效的作法。同时,Velocity 的作法使得在Velocity的模版中大量的跟 Java 对象进行交互,这违反了简单的原则,尽管你也能够将代码转入控制器中实现。固然,若是你像使用 Velocity 同样来使用 FreeMarker ,那么 FreeMarker 也能够跟 Velocity 同样简单。app
Velocity 一个优于 FreeMarker 的地方在于它有很普遍的第三方支持以及一个很是庞大的用户社区,你能够经过这个社区得到到不少的帮助,相反的 FreeMarker 在这方面要差不少。固然,也有愈来愈多的第三方软件开始在支持 FreeMarker 。jsp
下面是一些 FreeMarker 能作到的,而 Velocity 作不到的功能列表(且看着):工具
1. 日期和数字的支持
您能够执行运算和比较,对任意数量的类型,包括任意精度类型,而不只仅是整数。
您能够比较和显示(格式化)日期/时间值。性能
2. 国际化
您能够格式数字区域,各类各样的内置和自定义数字格式模式。
您能够格式日期地区和时区,各类各样的内置和定制的日期格式模式。
标识符(变量名)能够包含非英语字母同样重音字母,阿拉伯字母,汉字等
3. 循环处理
您能够退出循环
您能够访问控制变量外循环机构的内部循环
您能够得知当前是否到了循环的结束位置
4. 模版级别的数组处理
您可使用[i]的语法来访问数组元素,包括原始的和非原始的指数
能够获取到数组的长度
5. 宏定义
宏调用能够经过位置或名称进行参数传递
宏的参数能够设定默认值,在调用宏时若是没有指定该参数,则使用默认值代替
经过 <@myMacro>body</@myMacro> 能够支持宏的嵌套
能够经过文本表达的“宏的名称”来直接调用某个宏
宏容许先使用再定义
宏能够定义局部变量(新版本的Velocity也经过#local指令来实现该功能,尽管官方的文档尚未进行介绍)
6. 命名空间
您可使用多个名称空间的变数。当您创建“宏库”时是很是有用的 ,由于能够防止名称冲突与申请特定变量或与其余宏变量的库。
7. 内置与 Java 语言无关的字符串、列表、Map 的操做方法
8. 能提示模版中的拼写错误以及其余错误
当访问一个不存在的变量时,FreeMarker 在执行该模版时会报错,经过配置,你能够指定 FreeMarker 在碰到此类错误时是中止执行,仍是忽略该错误,同时 FreeMarker 会在日志中记录此问题;
若是您输入错误指令的名称,FreeMarker将抛出一个异常。
9. 更高级的文本输出工具
You can enclose a block of template in a set of tags that will cause it to apply HTML escaping or XML escaping (or any other transformation you can express as a FreeMarker expression for that matter) on all interpolations (${foo}
) in the block.
FreeMarker has transforms, which are blocks of template that when rendered, go through a transforming filter. Built-in transforms include whitespace compressor, HTML and XML escaper. Best of all, you can implement your own transformers as well (i.e. if you generate Java source code, you can write a Java code pretty-printer transform and insert it into the template). Naturally, transforms can be nested.
You can explicitly flush the output writer with a built-in flush-directive.
You can stop the rendering with a built-in stop-directive.
10. 文本处理
支持Java的特殊字符处理,例如\b, \t, \n, \f, \r, \", \', \\,以及UNICODE的\xXXXX
除了一般的字符串,数字,和布尔常量您能够定义列表和地图文字以及内部模板
11. 高级的空格清除
FreeMarker 将删除一些多余的空格、跳格、换行等字符,从而消除一些使人厌烦的明显多余的空格
FreeMarker 也提供指令来删除多于的空格
12. 与其余技术的集成
提供 JSP 标签库以便在 JSP 中嵌入 FreeMarker 模版
能够直接跟 Python 对象一块儿工做
13. 更强大的XML转换功能
14. 先进的模板元程序 您能够捕捉到输出的任意部分范本背景变量 您能够任意解释的范围变量,就好像它是一个模板定义