We have these animals:[BR] [BR] <#list <#-- some comment... --> animals as <#-- again... --> being>[BR] ... ? 多余的空白字符会在模板输出时移除 (2)指令
? 在FreeMarker中,使用FTL标记引用指令 ? 有三种FTL标记,这和HTML标记是类似的:
? 开始标记:<#directivename parameters>
? 结束标记:#directivename>
? 空内容指令标记:<#directivename parameters/> ? 有两种类型的指令:
? FTL标记不能够交叉,而应该正确的嵌套,如下面的代码是错误的:预定义指令
和用户定义指令 ? 用户定义指令要使用@替换#,如<@mydirective>...@mydirective>(会在后面
讲述)
<#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 \\{ \\xCode
双引号(u0022) 单引号(u0027) 反斜杠(u005C) 换行(u000A) Return (u000D) Tab (u0009) Backspace (u0008) Form feed (u000C) < > & {
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(或连接操作)
? 可以使用${..}(或#{..})在文本部分插入表达式的值,例如:
${\${\? 可以使用+操作符获得同样的结果 ${\${user + user + user + user} ? ${..}只能用于文本部分,下面的代码是错误的:
<#if ${isBig}>Wow!#if> <#if \应该写成:
<#if isBig>Wow!#if> ? 子串
? 例子(假设user的值为“Big Joe”):
${user[0]}${user[4]} ${user[1..4]} 结果是(注意第一个字符的索引是0):
BJ ig J ? 序列操作
? 连接操作:和字符串一样,使用+,下面是一个例子:
<#list [\- ${user} #list> 输出结果是:
- Joe - Fred - Julia - Kate ? 散列操作 ? 连接操作:和字符串一样,使用+,如果具有相同的key,右边的值替代左边的值,例如:
<#assign ages = {\, \\, \- Joe is ${ages.Joe} - Fred is ${ages.Fred} - Julia is ${ages.Julia} 输出结果是:
- Joe is 30 - Fred is 25 - Julia is 18 ? 算术运算