jsp、freemarker、velocity对比
在java领域。表现层技术主要有三种:jsp、freemarker、velocity。
jsp是大家最熟悉的技术
长处:
1、功能强大,能够写java代码
2、支持jsp标签(jsp tag)
3、支持表达式语言(el)
4、官方标准。用户群广。丰富的第三方jsp标签库
5、性能良好。jsp编译成class文件运行。有非常好的性能表现
缺点:
jsp没有明显缺点,非要挑点骨头那就是。因为能够编写java代码,如使用不当easy破坏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标记库
能够直接在Pythonproject中使用
(13)强大的XML转换能力
在2.3版本号中,FreeMarker具有强大的新XML转换能力,使得替代XSLT成为可能
Velocity在这方面是无法真正竞争的。除非改进核心引擎。如支持宏库映射到名字空间,宏中支持局部变量
(14)高级模板元程序
能够捕获输出的不论什么部分到context变量中
能够解释不论什么context变量。假设它是一个模板定义
上述两者的结合使用
转载 http://www.cnblogs.com/yxysuanfa/p/7126381.html
jsp、freemarker、velocity对比的更多相关文章
- JSP FreeMarker Velocity 原理
JSP原理 JSP的运行原理:JSP 本质上是一个Servlet. 每个JSP 页面在第一次被访问时,JSP引擎将它翻译成一个Servlet 程序,然后再把这个 Servlet 源程序编译成Servl ...
- SpringMvc多视图配置(jsp、velocity、freemarker) velocity在springmvc.xml配置VelocityViewResolver,VelocityConfigurer,FreeMarkerConfigurer,FreeMarkerViewResolver
?xml version="1.0"encoding="UTF-8"?> <beans xmlns="http://www.springf ...
- Velocity与Jsp、Freemarker的对比
在java领域,表现层技术主要有三种:jsp.freemarker.velocity.jsp是大家最熟悉的技术 优点: 1.功能强大,可以写java代码 2.支持jsp标签(jsp tag) 3.支持 ...
- SpringMvc多视图配置(jsp、velocity、freemarker) 在src目录views.properties配置
#welcome为modelAndView.setViewName(" welcome " ) ; 中的welcome .(class)固定写法 welcome.(class)=o ...
- [Spring MVC] - JSP + Freemarker视图解释器整合
Spring MVC中如果只使用JSP做视图,可以使用下面这段即可解决: <!-- 视图解释类 --> <bean class="org.springframework.w ...
- [Spring MVC] - JSP + Freemarker视图解释器整合(转)
Spring MVC中如果只使用JSP做视图,可以使用下面这段即可解决: <!-- 视图解释类 --> <bean class="org.springframework.w ...
- Freemarker教程1(基本使用)
简介 FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是 ...
- SSH框架详解
1.什么是ssh? SSH对应 struts spring hibernate struts 采用MVC模式,主要是作用于用户交互 spring 采用IOC和AOP~作用比较抽象,是用于项目的松耦合 ...
- Struts2知多少(2) Struts2 是什么
Struts2是流行和成熟的基于MVC设计模式的Web应用程序框架. Struts2不只是Struts1下一个版本,它是一个完全重写的Struts架构. WebWork框架开始以Struts框架为基础 ...
随机推荐
- tree 命令使用技巧
一.简介 tree命令可以以目录树的形式显示指定(默认显示这个文件系统)目录的所有文件夹和文件 二.使用 显示一个目录 $ tree folder Tips:如果文件夹有中文,则会显示一串转移字符,使 ...
- 封装常用的selenium方法
package com.yk.userlive.base; import java.net.MalformedURLException;import java.net.URL;import java. ...
- lstrcpyn
看代码时遇到的一些不会用的函数,记录下来. 1. lstrcpyn LPTSTR lstrcpyn( __out LPTSTR lpString1, __in LPCTSTR lpString2, _ ...
- OpenCV 常用汇总
cv::Rect矩形类用法 typedef struct CvRect { int x; /* 方形的左上角的x-坐标 */ int y; /* 方形的左上角的y-坐标*/ int width; /* ...
- Java中匿名内部类
匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 实例1:不使用匿名内部类来实现抽象 ...
- iOS-layoutSubvies和drawRect何时调用
- Faster R-CNN利用新的网络结构来训练
前言 最近利用Faster R-CNN训练数据,使用ZF模型,效果无法有效提高.就想尝试对ZF的网络结构进行改造,记录下具体操作. 一.更改网络,训练初始化模型 这里为了方便,我们假设更换的网络名为L ...
- Android实例-多窗口的切换
Android实例-多窗口的切换 1.图片一是程序运行后的界面. 2.图片二是点击"非模态显示"的界面. 3.图片三是点击"模诚显示"的界面(提示平台不支持). ...
- 《从零开始学Swift》学习笔记(Day 59)——代码排版
原创文章,欢迎转载.转载请注明:关东升的博客 代码排版包括: 空行.空格.断行和缩进等内容.代码排版内容比较多工作量很多,但是非常重要. 空行 空行将逻辑相关的代码段分隔开,以提高可读性.下列情况应该 ...
- * 和 ?在 shell 命令行中与在正则表达式中的区别
Linux 正则表达式 你有没有想过,在 shell 命令行中的 *,?和正则表达式中的*,?是否一样? 自打好多年前接触 DOS,就知道了* 和?这两个通配符(Wildcard),象 dir *.* ...