The average of 6 and 10 and 20 is: ${avg(6, 10, 20)}
The average of the price of python and elephant is: ${avg(animals.python.price, animals.elephant.price)}
(5)宏和变换器
? 宏和变换器变量是用户自定义指令(自定义FTL标记),会在后面讲述这
些高级特性 (6)节点
? 节点变量表示为树型结构中的一个节点,通常在XML处理中使用,会在后
面的专门章节中讲述
3、模板
(1)整体结构
? 模板使用FTL(FreeMarker模板语言)编写,是下面各部分的一个组合:
? 文本:直接输出
? Interpolation:由${和},或#{和}来限定,计算值替代输出
? FTL标记:FreeMarker指令,和HTML标记类似,名字前加#予以区分,
不会输出
? 注释:由<#--和-->限定,不会输出 ? 下面是以一个具体模板例子:
[BR]
[BR]
<#-- Greet the user with his/her name -->[BR]
Welcome ${user}!
[BR]We have these animals:[BR] [BR]
<#list animals as being>[BR]
${being.name} for ${being.price} Euros[BR] #list>[BR] [BR] [BR]
? [BR]是用于换行的特殊字符序列 ? 注意事项:
? FTL区分大小写,所以list是正确的FTL指令,而List不是;${name}
和${NAME}是不同的
? Interpolation只能在文本中使用
? FTL标记不能位于另一个FTL标记内部,例如:
<#if <#include 'foo'>='bar'>...
? 注释可以位于FTL标记和Interpolation内部,如下面的例子:
Welcome ${user <#-- The name of user -->}!
[BR]We have these animals:[BR] [BR]
<#list <#-- some comment... --> animals as <#-- again... --> being>[BR] ...
? 多余的空白字符会在模板输出时移除 (2)指令
? 在FreeMarker中,使用FTL标记引用指令 ? 有三种FTL标记,这和HTML标记是类似的:
? 开始标记:<#directivename parameters> ? 结束标记:#directivename>
? 空内容指令标记:<#directivename parameters/> ? 有两种类型的指令:预定义指令和用户定义指令
? 用户定义指令要使用@替换#,如<@mydirective>...@mydirective>(会
在后面讲述)
? FTL标记不能够交叉,而应该正确的嵌套,如下面的代码是错误的:
<#list animals as being>
${being.name} for ${being.price} Euros <#if use = \ (except for you) #list>
#if> <#-- WRONG! -->
? 如果使用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错
误消息
? FreeMarker会忽略FTL标记中的空白字符,如下面的例子:
<#list[BR]
animals as[BR] being[BR]
>[BR]
${being.name} for ${being.price} Euros[BR] #list >
? 但是,<、和指令之间不允许有空白字符 (3)表达式 ? 直接指定值
? 字符串
? 使用单引号或双引号限定
? 如果包含特殊字符需要转义,如下面的例子:
${\\\\quoted\\\ and this is a backslash: \\\\\
${'It\\'s \ this is a backslash: \\\\'}
输出结果是:
It's \quoted\ and this is a backslash: \\
It's \ this is a backslash: \\
? 下面是支持的转义序列: 转义序列 含义 \\\ \\' \\\\ \\n \\r \\t \\b \\f \\l \\g \\a 双引号(u0022) 单引号(u0027) 反斜杠(u005C) 换行(u000A) Return (u000D) Tab (u0009) Backspace (u0008) Form feed (u000C) < > & 转义序列 含义 \\{ \\xCode { 4位16进制Unicode代码 ? 有一类特殊的字符串称为raw字符串,被认为是纯文本,其中的\\
和{等不具有特殊含义,该类字符串在引号前面加r,下面是一个例子:
${r\ ${r\
输出的结果是:
${foo} C:\\foo\\bar
? 数字
? 直接输入,不需要引号
? 精度数字使用“.”分隔,不能使用分组符号
? 目前版本不支持科学计数法,所以“1E3”是错误的 ? 不能省略小数点前面的0,所以“.5”是错误的 ? 数字8、+8、08和8.00都是相同的 ? 布尔值
? true和false,不使用引号 ? 序列
? 由逗号分隔的子变量列表,由方括号限定,下面是一个例子:
<#list [\ as x> ${x} #list>
输出的结果是:
winter spring summer autumn
? 列表的项目是表达式,所以可以有下面的例子:
[2 + 2, [1, 2, 3, 4], \
? 可以使用数字范围定义数字序列,例如2..5等同于[2, 3, 4, 5],
但是更有效率,注意数字范围没有方括号 ? 可以定义反递增的数字范围,如5..2 ? 散列(hash)
? 由逗号分隔的键/值列表,由大括号限定,键和值之间用冒号分隔,
下面是一个例子:
{\
? 键和值都是表达式,但是键必须是字符串
? 获取变量
? 顶层变量: ${variable},变量名只能是字母、数字、下划线、$、@
和#的组合,且不能以数字开头 ? 从散列中获取数据
? 可以使用点语法或方括号语法,假设有下面的数据模型:
(root) | +- book | |
| +- title = \ | | | +- author | |
| +- name = \ | |
| +- info = \ |
+- test = \
下面都是等价的:
book.author.name book[\ book.author.[\ book[\
? 使用点语法,变量名字有顶层变量一样的限制,但方括号语法没有
该限制,因为名字是任意表达式的结果
? 从序列获得数据:和散列的方括号语法语法一样,只是方括号中的表达
式值必须是数字;注意:第一个项目的索引是0 ? 序列片断:使用[startIndex..endIndex]语法,从序列中获得序列片断
(也是序列);startIndex和endIndex是结果为数字的表达式 ? 特殊变量:FreeMarker内定义变量,使用.variablename语法访问 ? 字符串操作
? Interpolation(或连接操作)
? 可以使用${..}(或#{..})在文本部分插入表达式的值,例如:
${\