FreeMarker:
模板使用的所有数据被包装成data-model数据模型
模板+数据模型=输出
仅存储单值的变量称为scalar标量。${var}
hash哈希表
sequence序列:按顺序存储子序列。可以使用数字索引访问子变量
标量类型:字符串,数字,日期/时间,布尔值
${...} interpolations插值
<#></#> FTL tag标签
<#-- --> 注释Comments
directives指令:就是所指的FTL标签
------------------------------------------------------
directives指令
if指令:
<#if condition> ... </#if> 数字不可放在引号中
<#if condition> ... <#elseif condition> ... <#else> </#if>
关系运算符:== != < >....
list指令:
<#list sequence as loopVariable>repeatThis</#list>
<#list animals as being>
<tr><td>${being.name}<td>${being.price} Euros
</#list>
注意:sequence不需要用${}包含
include指令:
在当前的模板中插入其他文件的内容
<#include "/copyright_footer.html">
注意:include指令不是以/>结束的。
null变量处理
FreeMarker不能引用不存在的变量
2种处理方式:
1. ${var!default}:若var不存在或为null则显示default的值
2. <#if user??> ${user} </#if> ??询问FreeMarker变量是否存在,与if合并,如果不存在则忽略if内容
注意:a.b.c!0:只有在a.b存在c不存在的情况下才显示0,如果a或b不存在则报错使用(a.b.c)!0 .
??同上
------------------------------------------------------
支持的类型有:
标量:
字符串
数字
布尔值
日期
容器:
哈希表
序列
集
子程序:
方法和函数
用户自定义指令
其它/很少使用:
节点
------------------------------------------------------------------------
快速浏览(备忘单)
这里是给已经了解 FreeMarker 的人或有经验的程序员的一个提醒:
直接指定值
字符串: "Foo" 或者 'Foo' 或者 "It's \"quoted\"" 或者
r"C:\raw\string"
数字:123.45
布尔值:true, false
序列:["foo", "bar", 123.45], 1..100
哈希表:{"name":"green mouse", "price":150}
检索变量
顶层变量:user
从哈希表中检索数据:user.name, user[“name”]
从序列中检索:products[5]
特殊变量:.main
字符串操作
插值(或连接):"Hello ${user}!"(或"Free" + "Marker")
获取一个字符:name[0]
序列操作
连接:users + ["guest"]
序列切分:products[10..19] 或 products[5..]
哈希表操作
连接:passwords + {"joe":"secret42"}
算数运算: (x * 1.5 + 10) / 2 - y % 100
比较 运算 : x == y, x != y, x < y, x > y, x >= y, x <= y,
x < y, 等等
逻辑操作:!registered && (firstVisit || fromEurope)
内建函数:name?upper_case
方法调用:repeat("What", 3)
处理不存在的值
默认值:name!"unknown" 或者(user.name)!"unknown" 或者
name! 或者 (user.name)!
检测不存在的值:name?? 或者(user.name)??
注意:
3/2 = 1.5 不是1
FTL 是区分大小写的。list 是指令的名称而 List 就不是,类似地${name}和
${Name}或者${NAME}它们也是不同的。
去除“\”的影响:r"C:\raw\string"
2..5 和[2, 3, 4, 5]是相同的:<#list 2..5 as x>${x} </#list>
哈希表:检索的名字就必须是字符串类
---------------------------------------------------------------------
字符串,序列,哈希表都支持连接操作
${"Hello ${user}!"} == ${"Hello " + user + "!"}
<#list users + admins as person>
<#assign ages = {"Joe":23, "Fred":25} + {"Joe":30, "Julia":18}>
序列切分
使用 [firstindex..lastindex] 可 以 获 取 序 列 中的一部分 ,这里的
firstindex 和 lastindex 表达式的结果是数字。 如果seq 存储序列"a", "b", "c",
"d", "e", "f",那么表达式 seq[1..4]将会是含有"b", "c", "d", "e"的序列(索
引为 1 的项是"b",索引为 4 的项是"e")。
lastindex 可以被省略,那么这样将会读取到序列的末尾。如果 seq 存储序列"a",
"b", "c", "d", "e", "f",那么 seq[3..]将是含有"d", "e", "f"的序列。
注意:
比较时:使用>=和>的时候有一点小问题,将表达式放到括号内:<#if (x > y)>
可以使用 lt 代替<,lte代替<=, gt 代替>, gte 代替>=
-------------------------------------------------------------------------
内建函数
内建函数以?形式提供变量的不同形式
字符串使用的内建函数:
html: 字符串中所有的特殊 HTML 字符都需要用实体引用来代替(比如<代
替<) 。
cap_first:字符串的第一个字母变为大写形式
lower_case:字符串的小写形式
upper_case:字符串的大写形式
trim:去掉字符串首尾的空格
序列使用的内建函数:
size:序列中元素的个数
数字使用的内建函数:
int:数字的整数部分(比如-1.9?int 就是-1)
${test?upper_case?html} :内嵌函数双重使用
---------------------------------------------------------------------
宏命令
定义
<#macro greet person>
<font size="+2">Hello ${person} !</font>
</#macro>
使用
<@greet person="Fred"/> and <@greet person="Batman"/>
输出
<font size="+2">Hello Fred!</font>
and <font size="+2">Hello Batman!</font>
嵌套内容
定义
<#macro border>
<table border=4 cellspacing=0 cellpadding=4><tr><td>
<#nested>
</td></tr></table>
</#macro>
使用
<@border>The bordered text</@border>
输出
<table border=4 cellspacing=0 cellpadding=4><tr><td>
The bordered text
</td></tr></table>
循环变量
<#macro do_thrice>
<#nested 1>
<#nested 2>
<#nested 3>
</#macro>
使用
<@do_thrice ; x> <#-- 用户自定义指令 使用";"代替"as" -->
${x} Anything.
</@do_thrice>
输出
1 Anything
2 Anything
3 Anything
---------------------------------------------------------------------
在模板中可以定义三种类型的变量:
简单变量:
它能从模板中的任何位置来访问,或者从使用 include 指令引入的模板访问。
可以使用 assign 或 macro 指令来创建或替换这些变量。
局部变量:
它们只能被设置在宏定义体内,而且只在宏内可见。一个局部变量的生存周期
只是宏的调用过程。可以使用 local 指令在宏定义体内创建或替换局部变量。
循环变量:
循环变量是由指令(如 list)自动创建的,而且它们只在指令的开始和结束标
记内有效。宏的参数是局部变量而不是循环变量
注意:
局部变量会隐藏(不是覆盖)同名的简单变量。
循环变量会隐藏(不是覆盖)同名的局部变量和简单变量
命名空间
<#import "/lib/my_test.ftl" as my >
<#-- 被称为"my"的哈希表就会是那个" 大门" -->
<@my.copyright date="1999-2002"/>
${my.mail}
<#function avg x y>
<#return (x + y) / 2>
</#function>
${avg(10, 20)}