My studying notes for Java,Ruby,Ajax and other any interesting things.

星期三, 五月 21, 2008

Freemarker的模板文件内容

FreeMarker模版文件主要由如下几个部分组成: 
1.文本:直接输出的部分。 
2.注释:即<#-- ... -->格式部分,不会输出。 
3.插值(Interpolation:即${...},或#{...}格式的部分,将使用数据模型中的部分替代输出。 
4.FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出。 

一. 模版结构 
上面四个部分,文本部分和注释部分都比较简单,此处不再赘述,这里主要介绍插值(Interpolation)和FTL指令。 
下面就是FreeMarker模版的例子: 
<html><br> 
<head><br> 
<title>Welcome!</title><br> 
</head><br> 
<body><br> 
<#-- 注释部分 --><br> 
<#-- 下面使用插值 --> 
<h1>Welcome ${user}!</h1><br> 
<p>We have these animals:<br> 
<ul><br> 
<#-- 使用FTL指令 --> 
<#list animals as being><br> 
<li>${being.name} for ${being.price} Euros<br> 
</#list><br> 
</ul><br> 
</body><br> 
</html> 
上面的FTL模版是一个典型的HTML模版,该模版中包含了注释、FTL指令、插值和基本文本四个组成部分。 

二. FTL指令规则 
在FreeMarker中,使用FTL标签来使用指令,FreeMarker有三种FTL标记,这和HTML标签是完全类似的: 
1.开始标签:<#directivename parameters> 
2.结束标签:</#directivename> 
3.空标签:<#directivename parameters/> 
实际上,使用标签时前面的#符号也可能变成@,如果该指令是一个用户指令而不是系统内建指令时,应将#符号改为@符号。 
使用FTL标签时,应该有正确的嵌套,而不是交叉使用,这与XML标签的用法完全一样。因此,下面的代码是错误: 
<ul> 
<#list animals as being> 
<li>${being.name} for ${being.price} Euros 
<#if use = "Big Joe"> 
(except for you) 
</#list> 
</#if> 
<#-- 上面的list指令和if指令没有形成正确嵌套 --> 
</ul> 
如果使用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息。 
FreeMarker会忽略FTL标记中的空白字符,如下面的例子: 
<#list[BR] 
animals as[BR] 
being[BR] 
>[BR] 
${being.name} for ${being.price} Euros[BR] 
</#list > 
值得注意的是:<、</和指令之间不允许有空白字符。 

三. 插值规则 
FreeMarker的插值有如下两种类型: 
1.通用插值:${expr} 
2.数字格式化插值:#{expr}或#{expr; format} 
通用插值 
对用通用插值,又可分为如下三种情况: 
1.插值结果为字符串值:直接输出表达式结果 
2.插值结果为数字值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建的字符串函数格式化单个插值,看下面的模版页面。 
<#setting number_format="currency"/> 
<#assign answer=42/> 
${answer} 
${answer?string} <#-- the same as ${answer} --> 
${answer?string.number} 
${answer?string.currency} 
${answer?string.percent} 
输出结果是: 
$42.00 
$42.00 
42 
$42.00 
4,200% 
q 插值结果为日期值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建的字符串函数格式化单个插值,下面是一个使用格式模式的例子: 
${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")} 
${lastUpdated?string("EEE, MMM d, ''yy")} 
${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")} 
输出的结果如下: 
2003-04-08 21:24:44 Pacific Daylight Time 
Tue, Apr 8, '03 
Tuesday, April 08, 2003, 09:24:44 PM (PDT) 
插值结果为布尔值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建的字符串函数格式化单个插值,下面是一个例子: 
<#assign foo=true/> 
${foo?string("yes", "no")} 
输出结果是: 
yes 
数字格式化插值 
数字格式化插值可采用如下#{expr; format}形式可以用来格式化数字,其中format可以是: 
mX:小数部分最小X位 
MX:小数部分最大X位 
看下面的FreeMarker模版: 
<#assign x=2.582/> 
<#assign y=4/> 
#{x; M2} <#-- 输出2.58 --> 
#{y; M2} <#--输出4 --> 
#{x; m1} <#-- 输出2.6 --> 
#{y; m1} <#-- 输出4.0 --> 
#{x; m1M2} <#-- 输出2.58 --> 
#{y; m1M2} <#-- 输出4.0 -->


--
----------------------------------

   你的支持 我的坚持
  Lead to The IT Future

----------------------------------

没有评论: