语法
<#if condition>
...
<#elseif condition2>
...
<#elseif condition3>
...
<#else>
...
#if>
elseif和else是可选的
<#if condition>
#if>
语法
<#switch value>
<#case refValue1>
...
<#break>
<#case refValue2>
...
<#break>
<#case refValuen>
...
<#break>
<#default>
...
#switch>
形式1:
<#list sequence as item>
Part repeated for each item
<#else>
Part executed when there are 0 items
#list>
形式2
<#list sequence>
Part executed once if we have more than 0 items
<#items as item>
Part repeated for each item
#items>
Part executed once if we have more than 0 items
<#else>
Part executed when there are 0 items
#list>
注意:在 list 中的 else 仅从 FreeMarker 2.3.23 版本开始支持。
当没有迭代项时(即 users 为空列表),才使用 else 指令, 可以输出一些特殊的内容而不只是空在那里
注意:<#items> 从 FreeMarker 2.3.23 版本开始存在
如果不得不在第一列表项之前或在最后一个列表项之后打印一些东西, 那么就要使用 items 指令,但至少要有一项。
注意:sep 从 FreeMarker 2.3.23 版本开始存在。
当不得不显示介于每个迭代项 (但不能在第一项之前或最后一项之后) 之间的一些内容时,可以使用 sep。
eg:
<#list users as user>${user}<#sep>, #list>
输出:
Joe, Kate, Fred
可以使用 break 指令在迭代的任意点退出。
您可以使用 include 指令在你的模板中插入另外一个 FreeMarker 模板文件,将在 include 指令出现的位置插入的被包含模版的内容。
<#include path>
<#include path options>
FreeMaker 的 include 指令 path 属性可以使用 ,星号()被解释为 “当前目录或其他任意它的父目录”
<#import> 指令用来引入一个库。它将根据指定的 hash 创建一个新的空命名空间, 然后在那个命名空间中执行给定 path 参数中的模板,path 指定模板的变量 、宏、函数等放入指定的命名空间。 然后就可以使用“新命名空间.属性”的方式访问导入模版中的变量。
<#import path as hash>
使用 <#assign> 指令你可以创建一个新的变量,或者替换一个已经存在的变量。
注意:仅仅顶级变量可以被创建/替换,也就是说你不能创建/替换 user.name,但是可以整体替换 user。
<#assign name1=value1 name2=value2 ... nameN=valueN>
<#assign same as above... in namespacehash>
<#assign name>
capture this
#assign>
<#assign name in namespacehash>
capture this
#assign>
macro 指令来自定义指令
在 macro 指令中,宏名称的后面位置是用来定义参数的
<#macro greet>
Hello Joe!
#macro>
macro 指令自身不输出任何内容,它只是用来创建宏变量,所以就会有一个名为 greet 的宏变量。在 <#macro greet> 和 #macro> 之间的内容 (称为宏定义体) 将会在使用该宏变量作为指令时执行。可以在 FTL 标记中通过 <@宏变量名>@宏变量名> 的方式来使用自定义指令。因此,就可以这样来使用 greet 宏变量:
<@greet>@greet>
在 macro 指令中,宏名称的后面位置是用来定义参数的。
<#macro greet person>
Hello ${person}!
#macro>
<@greet person="Fred"/>
<@greet person="Batman"/>
自定义指令可以嵌套内容(使用 <#nested> 指令引用宏指令开始和结束标签中间的内容),和预定义指令相似:<#if …>nested content#if>。
<#macro border>
<#nested>
#macro>
<@border>The bordered text@border>
像 list 这样的预定义指令可以使用循环变量,而对于预定义指令 (如list),当调用指令时,循环变量的 name 是给定的,比如 <#list foos as foo>…#list> 中的 foo,变量 value 的设置是由指令本身完成的。
<#macro repeat count>
<#list 1..count as x>
<#nested x, x/2, x==count>
#list>
#macro>
<@repeat count=4 ; c, halfc, last>
${c}. ${halfc}<#if last> Last!#if>
@repeat>
<#if "piceous"?contains("ice")>It contains "ice"#if>
<#if "ahead"?ends_with("head")>
字符串以head结尾
<#else>
不是以head结尾
#if>
<#if "head"?ends_with("head")>
字符串以head结尾
<#else>
不是以head结尾
#if>
${"foo"?ensure_ends_with("/")}
${"foo/"?ensure_ends_with("/")}
${"abcabc"?index_of("bc")}
[${""?left_pad(5)}]
[${"a"?left_pad(5)}]
[${"ab"?left_pad(5)}]
[${"abc"?left_pad(5)}]
[${"abcd"?left_pad(5)}]
[${"abcde"?left_pad(5)}]
[${"abcdef"?left_pad(5)}]
[${"abcdefg"?left_pad(5)}]
[${"abcdefgh"?left_pad(5)}]
<#if "fxo"?matches("f.?o")>Matches.<#else>Does not match.#if>
<#assign res = "foo bar fyo"?matches("f.?o")>
<#if res>Matches.<#else>Does not match.#if>
Matching sub-strings:
<#list res as m>
- ${m}
#list>
${"this is a car acarus"?replace("car", "bulldozer")}
${"abcdef"?remove_beginning("abc")}
${"foobar"?remove_beginning("abc")}
<#list "someMOOtestMOOtext"?split("MOO") as x>
- ${x}
#list>
<#assign x=42>
${x}
${x?string} <#-- the same as ${x} -->
${x?string.number}
${x?string.currency}
${x?string.percent}
${x?string.computer}
<#assign x = 1.234>
${x?string["0"]}
${x?string["0.#"]}
${x?string["0.##"]}
${x?string["0.###"]}
${x?string["0.####"]}
${1?string["000.00"]}
${12.1?string["000.00"]}
${123.456?string["000.00"]}
${1.2?string["0"]}
${1.8?string["0"]}
${1.5?string["0"]} <-- 1.5, rounded towards even neighbor
${2.5?string["0"]} <-- 2.5, rounded towards even neighbor
${12345?string["0.##E0"]}
<#assign seq = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']>
<#list seq?chunk(4) as row>
<#list row as cell>${cell} #list>
#list>
<#list seq?chunk(4,"-") as row>
<#list row as cell>${cell} #list>
#list>
<#assign colors = ["red", "green", "blue"]>
${colors?join(", ")}
<#assign x = ["red", 16, "blue", "cyan"]>
"blue": ${x?seq_contains("blue")?string("yes", "no")}
"yellow": ${x?seq_contains("yellow")?string("yes", "no")}
16: ${x?seq_contains(16)?string("yes", "no")}
"16": ${x?seq_contains("16")?string("yes", "no")}
<#assign colors = ["red", "green", "blue"]>
${colors?seq_index_of("blue")}
${colors?seq_index_of("red")}
${colors?seq_index_of("purple")}
<#assign names = ["Joe", "Fred", "Joe", "Susan"]>
No 2nd param: ${names?seq_last_index_of("Joe")}
-2: ${names?seq_last_index_of("Joe", -2)}
-1: ${names?seq_last_index_of("Joe", -1)}
0: ${names?seq_last_index_of("Joe", 0)}
1: ${names?seq_last_index_of("Joe", 1)}
2: ${names?seq_last_index_of("Joe", 2)}
3: ${names?seq_last_index_of("Joe", 3)}
4: ${names?seq_last_index_of("Joe", 4)}
<#assign ls = ["whale", "Barbara", "zeppelin", "aardvark", "beetroot"]?sort>
<#list ls as i>${i} #list>
<#assign ls = [
{"name":"whale", "weight":2000},
{"name":"Barbara", "weight":53},
{"name":"zeppelin", "weight":-200},
{"name":"aardvark", "weight":30},
{"name":"beetroot", "weight":0.3}
]>
Order by name:
<#list ls?sort_by("name") as i>
- ${i.name}: ${i.weight}
#list>
Order by weight:
<#list ls?sort_by("weight") as i>
- ${i.name}: ${i.weight}
#list>
<#list ['a', 'b', 'c'] as i>
${i?has_next?c}
#list>
<#list ['a', 'b', 'c', 'd'] as i>
${i?is_even_item?c}
#list>
<#list ['a', 'b', 'c'] as i>
${i?is_first?c}
#list>
<#list ['a', 'b', 'c'] as i>
${i?is_last?c}
#list>
<#list ['a', 'b', 'c', 'd'] as i>
${i?is_odd_item?c}
#list>
<#list ['a', 'b', 'c', 'd', 'e', 'f', 'g'] as i>
${i}
#list>
freemarker study
${"C:\\demo\\red\\index.html"}
${r"C:\demo\red\index.html"}
<#-- <#list lists as item>${item}#list> 遍历列表 -->
<#-- 生成 0 到 9 的数字序列 -->
<#list 0..9 as item>${item}<#sep>,#list>
<#-- 生成 0 到小于 10 的数字序列 -->
<#list 0..<10 as item>${item}<#sep>,#list>
<#list 0..!10 as item>${item}<#sep>,#list>
<#-- 生成 0 到无穷大的数字序列 -->
<#list 0.. as item>${item}<#sep>,#list>
<#-- 字符串切割 -->
<#assign host="https://www.hxstrive.com">
${host[0..6]}
${host[0..<6]}
${host[0..*100]}
${host[7..]}
freemarker study
常用内建函数示例:
<#assign htmlCode="hello world"/>
<#assign user="administrator" />
<#-- 输出html代码-->
html=${htmlCode?html}
<#-- 转大写-->
upper_case=${user?upper_case}
<#-- 首字母大写-->
cap_first=${user?cap_first}
<#-- 长度-->
length=${user?length}
list 标签中内置函数示例
<#assign books=["Java","C#","C++"] />
<#-- 个数-->
size=${books?size}
<#list books>
<#items as book>
<#-- 下标-->
index=${book?index}
<#-- 第几个-->
counter=${book?counter}
<#-- 奇偶性-->
item_parity=${book?item_parity}
#items>
#list>
一些内建函数需要参数来指定行为
<#assign colors=["red","blue","green"] />
<#assign flag=false />
<#-- 字符判断-->
string=${flag?string("Y","N")}
<#list books>
<#items as book>
<#-- 遍历-->
item_parity=${book?item_cycle("lightRow","darkRow")}
#items>
#list>
<#-- 列表拼接字符-->
join=${colors?join(",")}
<#-- 判断开始字母-->
<#if user?starts_with("a")>
starts_with=${user} 以a开头
<#else>
starts_with=${user} 不以a开头
#if>
freemarker 自定义指令
<#--macro 声明宏指令 greet为宏变量 引用时使用@greet person为传入的变量-->
<#macro greet person>
Hello ${person}
#macro>
<@greet person="Fred">@greet>
<@greet person="Batman">@greet>
<#--嵌套内容-->
<#macro border>
<#-- nested接收传入的数据-->
<#nested>
#macro>
<@border>The bordered text@border>
<#macro do_thrice>
<#nested>
<#nested>
<#nested>
#macro>
<@do_thrice>
Anything.
@do_thrice>
<@border>
<@do_thrice>
- <@greet person="Joe">@greet>
@do_thrice>
@border>
<#-- 一个宏可以使用多个循环变量-->
<#macro repeat count>
<#list 1..count as x>
<#nested x, x/2,x==count>
#list>
#macro>
<@repeat count=4 ; c,halfc,last>
${c}. ${halfc}<#if last> Last!#if>
@repeat>