- 浏览: 7252911 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
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一起来使用做一些各自擅长的工作。
发表评论
-
【转】Django resources
2014-01-23 14:35 10716Django resources This page li ... -
使用国内镜像源来加速python pypi包的安装
2014-01-16 11:16 197565pipy国内镜像目前有: http://pypi.d ... -
[转 ]vagrant使用简介
2014-01-10 13:53 256141> 简介: vagrant提供了易于配置,重复性 ... -
[转]在Java中调用Python
2014-01-07 13:08 9141在执行之前都需要把jython对应的包加载进去,这个是必须的 ... -
[转]Eclipse配置PyDev插件
2014-01-02 14:25 2779安装python解释器 安装PyDev: 首 ... -
RestFuse的研究(五) Http请求的封装
2014-06-14 15:50 3516在RestFuse中封装了Http请 ... -
RestFuse的研究(四) Junit的Statement的分析
2013-12-06 11:46 1604在RestFuse提供了多种单 ... -
RestFuse的研究(三) Junit的Rule的使用和分析
2013-12-06 11:01 2191在junit中定义一些可以公用的规则(R ... -
RestFuse的研究(二) Junit的Runner的分类和模式
2013-12-06 10:40 1554在Junit4中的调用JunitCore可以采 ... -
RestFuse的研究(一) HttpJunitRunner的实现
2013-12-06 10:11 1693在RestFuse是一种针对Rest We ... -
[转]An open-source JUnit extension to test HTTP/REST APIs
2013-12-06 09:57 1054http://developer.eclipsesource ... -
TestNG简单的学习(十三)TestNG中Junit的实现
2013-12-04 09:00 3287TestNG和junit的整合 ... -
TestNG简单的学习(十二)TestNG运行
2013-12-03 09:08 51450文档来自官方地址: ... -
TestNG简单的学习(十一)TestNG学习总结
2013-12-03 09:08 13995最近一直在学习关于TestNG方面的知识,根 ... -
TestNG简单的学习(十)TestNG @Listeners 的使用
2013-12-03 09:07 8626TestNG官方网站: http://testng.or ... -
TestNG简单的学习(九)TestNG Method Interceptors 的使用
2013-12-03 09:07 2655TestNG官方网站: http://testng ... -
TestNG简单的学习(八)TestNG Annotation Transformers 的使用
2013-12-03 09:07 2760TestNG官方网站: http://testng.or ... -
TestNG简单的学习(七)TestNG编程方式运行
2013-12-02 09:22 2397TestNG官方网站: http://testng.or ... -
TestNG简单的学习(六)测试工厂注释的使用
2013-12-02 09:22 2715TestNG官方网站: http://testng.or ... -
TestNG简单的学习(五)参数化测试数据的定制
2013-12-02 09:22 2642TestNG官方网站: http://testng.or ...
相关推荐
Velocity 和 FreeMarker区别 对于大部分的应用来说,使用 FreeMarker 比 Velocity 更简单,因为 Velocity 还必须编写一些自定义的
模板:velocity和freemarker的比较模板:velocity和freemarker的比较
赠送jar包:freemarker-2.3.31.jar; 赠送原API文档:freemarker-2.3.31-javadoc.jar; 赠送源代码:freemarker-2.3.31-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
赠送jar包:freemarker-2.3.30.jar; 赠送原API文档:freemarker-2.3.30-javadoc.jar; 赠送源代码:freemarker-2.3.30-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
安装freemarker插件(freemarker的eclipse插件) a) 首先下载 freemarker-ide-0.9.14.zip(在这里不用下载了,附件中已经有了) b) 解压后:把hudson.freemarker_ide_0.9.14这个文件放到:eclipse\plugins下面 c) 发现...
网上找不到springboot框架集成freemarker过程中再集成shiro框架,所以写了一个,供大家使用。
FreeMarker,FreeMarker
freemarker\Freemarker教程_中文版
NULL 博文链接:https://zhenghuazhi.iteye.com/blog/1923544
对于大部分PDF场景都还是非常方便简单的,可以模板可以让前端先使用**HTML**制作,调整好格式和样式后,再改名为ftl后缀。 3. freemarker(FreemarkerUtils) 对于没有使用宏、函数等word、excel,需要按模板动态生成...
freemarker freemarker freemarker freemarker freemarker freemarker freemarker freemarker
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-...
一篇freemarker很不错的文章 reeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:格式部分,不会输出 3,插值:即${...}或#{...}格式的部分,将使用...
freemarker替换变量实例
Struts2 和freemarker实例 简单STRUTS2的使用,和freeMarker的使用
FreeMarker中文文档.pdf FreeMarker入门必修
freemarker html生成pdf 通过freemarker 和html模板生成对应的pdf或者图片 参考使用,欢迎下载
Freemarker 实例,Freemarker 实例Freemarker 实例,Freemarker 实例
FreeMarker
用来压缩空白空间和空白的行 escape, noescape 语法 Freemarker代码 <#escape identifier as expression> ... <#noescape>...</#noescape> ... </#escape> ... <#noescape>... ... 用例 ...