FTL tags标签(FreeMarker 模板的语言标签):FTL标签和HTML标签有一点相似,但是它们是FreeMarker的指令而且是不会直接输出出来的东西。这些标签的使用一般以符号#开头。
用户自定义的FTL标签使用@符号来代替#
Comments注释:FreeMarker的注释和HTML的注释相似,但是它用<#--和-->来分隔的。任何介于这两个分隔符(包含分隔符本身)之间内容会被FreeMarker忽略,就不会输出出来了。
指令:
if指令
<#if condition>
...
<#elseif condition2>
...
<#elseif condition3>
...
...
<#else>
...
</#if>
<#if animals.python.price == 0>
Pythons are free today!
</#if>
<#if animals.python.price < animals.elephant.price>
Pythons are cheaper than elephants today.
<#else>
Pythons are not cheaper than elephants today.
</#if>
switch,case,default,break指令
<#switch value>
<#case refValue1>
...
<#break>
<#case refValue2>
...
<#break>
...
<#case refValueN>
...
<#break>
<#default>
...
</#switch>
list,break 指令
<#list sequence as item>
...
</#list>
你可以使用list指令来处理模板的一个部分中的一个序列中包含的各个变量。在开始标签和结束标签中的代码将会被处理,首先是第一个子变量,然后是第二个子变量,接着是第三个子变量,等等,直到超过最后一个。对于每个变量,这样的迭代中循环变量将会包含当前的子变量。
在list循环中,有两个特殊的循环变量可用:
item_index:这是一个包含当前项在循环中的步进索引的数值。
item_has_next:来辨别当前项是否是序列的最后一项的布尔值。
<#assign seq = ["winter", "spring", "summer", "autumn"]>
<#list seq as x>
${x_index + 1}. ${x}<#if x_has_next>,</#if>
</#list>
include指令
<#include path>
or
<#include path options>
这里:
path:要包含文件的路径;一个算作是字符串的表达式。(用其他话说,它不用是一个固定的字符串,它也可以是像profile.baseDir + "/menu.ftl"这样的东西。)
1. winter,
2. spring,
3. summer,
4. autumn
<#assign x=3>
<#list 1..x as i>
${i}
</#list>
1
2
3
<#list seq as x>
${x}
<#if x = "spring"><#break></#if>
</#list>
<#compress>
...
</#compress>
options:一个或多个这样的选项:encoding=encoding, parse=parse
encoding:算作是字符串的表达式
parse:算作是布尔值的表达式(为了向下兼容,也接受一部分字符串值)
import 指令
<#import path as hash>
这里:
path:模板的路径。这是一个算作是字符串的表达式。(换句话说,它不是一个固定的字符串,它可以是这样的一些东西,比如,profile.baseDir + "/menu.ftl"。)
hash:哈希表变量的结束名称,你可以由它来访问命名空间。这不是表达式。
<#import "/libs/mylib.ftl" as my>
<@my.copyright date="1999-2002"/>
noparse指令
<#noparse>
...
</#noparse>
FreeMarker不会在这个指令体中间寻找FTL标签,插值和其他特殊的字符序列,除了noparse的结束标记。
compress指令
escape,noescape指令
<#escape identifier as expression>
...
<#noescape>...</#noescape>
...
</#escape>
assign 指令
<#assign name=value>
or
<#assign name1=value1 name2=value2 ... nameN=valueN>
or
<#assign same as above... in namespacehash>
or
<#assign name>
capture this
</#assign>
or
<#assign name in namespacehash>
capture this
</#assign>
使用这个指令你可以创建一个新的变量,或者替换一个已经存在的变量。注意仅仅顶级变量可以被创建/替换
global 指令
<#global name=value>
or
<#global name1=value1 name2=value2 ... nameN=valueN>
or
<#global name>
capture this
</#global>
这个指令和assign相似,但是被创建的变量在所有的命名空间中都可见,但又不会存在于任何一个命名空间之中。精确地说,正如你会创建(或替换)一个数据模型变量。因此,这个变量是全局的。如果在数据模型中,一个相同名称的变量存在的话,它会被使用这个指令创建的变量隐藏。如果在当前的命名空间中,一个相同名称的变量存在的话,那么会隐藏由global指令创建的变量。
local 指令
<#local name=value>
or
<#local name1=value1 name2=value2 ... nameN=valueN>
or
<#local name>
capture this
</#local>
它和assign指令类似,但是它创建或替换局部变量。这仅仅在宏和方法的内部定义才会有作用。
setting 指令
<#setting name=value>
${1.2}
<#setting locale="en_US">
${1.2}
输出
1,2
1.2
用户自定义指令(<@...>)
<@html_escape>
a < b
Romeo & Juliet
</@html_escape>
macro,nested,return 指令
<#macro name param1 param2 ... paramN>
...
<#nested loopvar1, loopvar2, ..., loopvarN>
...
<#return>
...
</#macro>
<#macro test>
Test text
<#return>
Will not be printed.
</#macro>
function,return 指令
<#function name param1 param2 ... paramN>
...
<#return returnValue>
</#function>
这里:
<#function avg x y>
<#return (x + y) / 2>
</#function>
${avg(10, 20)}
flush 指令