velocity & freemarker

时间:2021-12-17 04:49:13
一、Velocity
Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅使用简单的模板语言(template language)来引用由java代码定义的对象。
当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提供了便利,同时也为我们在JSP和PHP之外又提供了一种可选的方案。

1. 变量定义

#set($name =“velocity”)

等号后面的字符串 Velocity 引擎将重新解析,例如出现以$开始的字符串时,将做变量的替换。

#set($hello =“hello $name”)

上面的这个等式将会给$hello 赋值为“hello velocity”

 ${name} ,也可以写成:$name。提倡用前面的写法。应该使用规范的格式书写 : Jack is a ${vice}maniac
2. 循环
#foreach($element in $list)
This is $element
$velocityCount
#end

Velocity 引擎会将 list 中的值循环赋给 element 变量,同时会创建一个$velocityCount 的变量作为计数,从 1 开始,每次循环都会加 1.

#foreach ( $key in $list.keySet())
Key: $key -> Value: $list.get($key) <br>
#end

提示:velocity中大小写敏感。

3. 判断
#if(condition)
...
#elseif(condition)

#else

#end
4.注释
单行注释:## This is a single line comment.
多行注释:#*
5.Velocity 也具有逻辑AND, OR 和 NOT 操作符。
#if($foo && $bar)
#end

6.转义字符'\' 使用:如果reference被定义,两个’\’意味着输出一个’\’,如果未被定义,刚按原样输出。

7.Velocity内置了一些对象,在vm模版里可以直接调用,列举如下:$request、$response、$session
二、Freemarker
FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。
 <html>
<head>
<title>freemarker测试</title>
</head>
<body>
<h1>${message},${name}</h1>
</body>
</html>
FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 
1,文本:直接输出的部分 
2,注释:<#-- ... -->格式部分,不会输出 
3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出 
4,FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出 
下面是一个FreeMarker模板的例子,包含了以上所说的4个部分
<html>
<head>
<title>Welcome!</title>
</head>
<body>
<#-- 注释部分 -->
<#-- 下面使用插值 -->
<h1>Welcome ${user} !</h1>
<p>We have these animals:
<u1>
<#-- 使用FTL指令 -->
<#list animals as being>
<li>${being.name} for ${being.price} Euros<
<#list>
<u1>
</body>
</html>

1. FTL指令规则 
在FreeMarker中,使用FTL标签来使用指令,FreeMarker有3种FTL标签,这和HTML标签是完全类似的. 
1,开始标签:<#directivename parameter> 
2,结束标签:</#directivename> 

3,空标签:<#directivename parameter/> 
<#assign age=>
<#if (age>60)>老年人
<#elseif (age>)>中年人
<#elseif (age>)>青年人
<#else> 少年人
</#if>

输出结果是:青年人

缺点:
1、freemarker的变量必须有值,没有被赋值的变量就会抛出异常,那个黄黄的freemarker出错页面,真是让人看了太难过了。
2、freemarker的map限定key必须是string,其他数据类型竟然无法操作
3、freemarker为了编程方便把不可序列化的东西往session里面放!