FreeMarker模板文件的组成及基本语法详解(一)

FreeMarker模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由以下4个部分组成:html

1. 文本:直接输出的部分
2. 注释:<#-- ... -->格式部分,不会输出
3. 插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出
4. FTL指令:FreeMarker指定,和HTML标记相似,名字前加#予以区分,不会输出
函数

下面是一个FreeMarker模板的例子,包含了以上所说的4个部分
<html><br>
<head><br>
<title>Welcome!</title><br>
</head><br>
<body><br>
<#-- 注释部分 --><br>
<#-- 下面使用插值 -->
<h1>Welcome ${user} !</h1><br>
<p>We have these animals:<br>
<u1><br>
<#-- 使用FTL指令 -->
<#list animals as being><br>
   <li>${being.name} for ${being.price} Euros<br>
<#list><br>
<u1><br>
</body><br>
</html>spa

1. FTL指令规则code

FreeMarker中,使用FTL标签来使用指令,FreeMarker有3种FTL标签,这和HTML标签是彻底相似的.
1,开始标签:<#directivename parameter>
2,结束标签:</#directivename>
3,空标签:<#directivename parameter/>orm

实际上,使用标签时前面的符号#也可能变成@,若是该指令是一个用户指令而不是系统内建指令时,应将#符号改为@符号.
使用FTL标签时,应该有正确的嵌套,而不是交叉使用,这和XML标签的用法彻底同样.若是全用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息.FreeMarker会忽略FTL标签中的空白字符.值得注意的是< , /> 和指令之间不容许有空白字符.htm

2.插值规则对象

FreeMarker的插值有以下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format}blog

2.1 通用插值ci

对于通用插值,又能够分为如下4种状况:
1,插值结果为字符串值:直接输出表达式结果
2,插值结果为数字值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可使用内建的字符串函数格式化单个插值,以下面的例子:
<#settion number_format="currency"/>
<#assign answer=42/>
${answer}
${answer?string} <#-- the same as ${answer} -->
${answer?string.number}
${answer?string.currency}
${answer?string.percent}
${answer}
输出结果是:
$42.00
$42.00
42
$42.00
4,200%
3,插值结果为日期值:根据默认格式(由#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')'")}
输出结果是:
2008-04-08 08:08:08 Pacific Daylight Time
Tue, Apr 8, '03
Tuesday, April 08, 2003, 08:08:08 PM (PDT)
4,插值结果为布尔值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可使用内建的字符串函数格式化单个插值,以下面的例子:
<#assign foo=true/>
${foo?string("yes", "no")}
输出结果是:
yesunicode

2.2 数字格式化插值

数字格式化插值可采用#{expr;format}形式来格式化数字,其中format能够是:
mX:小数部分最小X位
MX:小数部分最大X位
以下面的例子:
<#assign x=2.582/>
<#assign y=4/>
#{x; M2} <#-- 输出2.58 -->
#{y; M2} <#-- 输出4 -->
#{x; m2} <#-- 输出2.6 -->
#{y; m2} <#-- 输出4.0 -->
#{x; m1M2} <#-- 输出2.58 -->
#{x; m1M2} <#-- 输出4.0 -->

3, 表达式

表达式是FreeMarker模板的核心功能,表达式放置在插值语法${}之中时,代表须要输出表达式的值;表达式语法也可与FreeMarker标签结合,用于控制输出.实际上FreeMarker的表达式功能很是强大,它不只支持直接指定值,输出变量值,也支持字符串格式化输出和集合访问等功能.

3.1 直接指定值

使用直接指定值语法让FreeMarker直接输出插值中的值,而不是输出变量值.直接指定值能够是字符串,数值,布尔值,集合和MAP对象.

1,字符串
直接指定字符串值使用单引号或双引号限定,若是字符串值中包含特殊字符须要转义,看下面的例子:
${"个人文件保存在C:\\盘"}
${'我名字是\"annlee\"'}
输出结果是:
个人文件保存在C:\盘
我名字是"annlee"

FreeMarker支持以下转义字符:
\";双引号(u0022)
\';单引号(u0027)
\\;反斜杠(u005C)
\n;换行(u000A)
\r;回车(u000D)
\t;Tab(u0009)
\b;退格键(u0008)
\f;Form feed(u000C)
\l;<
\g;>
\a;&
\{;{
\xCode;直接经过4位的16进制数来指定Unicode码,输出该unicode码对应的字符.

若是某段文本中包含大量的特殊符号,FreeMarker提供了另外一种特殊格式:能够在指定字符串内容的引号前增长r标记,在r标记后的文件将会直接输出.看以下代码:
${r"${foo}"}
${r"C:\foo\bar"}
输出结果是:
${foo}
C:\foo\bar

2,数值
表达式中的数值直接输出,不须要引号.小数点使用"."分隔,不能使用分组","符号.FreeMarker目前还不支持科学计数法,因此"1E3"是错误的.在FreeMarker表达式中使用数值须要注意如下几点:
1,数值不能省略小数点前面的0,因此".5"是错误的写法
2,数值8 , +8 , 8.00都是相同的

3,布尔值
直接使用true和false,不使用引号.

4,集合
集合以方括号包括,各集合元素之间以英文逗号","分隔,看以下的例子:
<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x>
${x}
</#list>
输出结果是:
星期一
星期二
星期三
星期四
星期五
星期六
星期天

除此以外,集合元素也能够是表达式,例子以下:
[2 + 2, [1, 2, 3, 4], "whatnot"]

还可使用数字范围定义数字集合,如2..5等同于[2, 3, 4, 5],可是更有效率.注意,使用数字范围来定义集合时无需使用方括号,数字范围也支持反递增的数字范围,如5..2

5,Map对象
Map对象使用花括号包括,Map中的key-value对之间以英文冒号":"分隔,多组key-value对之间以英文逗号","分隔.下面是一个例子:
{"语文":78, "数学":80}
Map对象的key和value都是表达式,可是key必须是字符串

 

 

本文转载自OECP社区http://www.oecp.cn/hi/hailang/blog/385

相关文章
相关标签/搜索