1、if,else, elseif
语法:
<#ifcondition>
...
<#elseifcondition2>
...
<#elseifcondition3>
...
...
<#else>
...
</#if>
备注:condition、condition2···必须为boolean 类型,<#elseif··>、<#else>可有0或多个。
实例:
<#if x == 1>
x is 1
<#elseifx == 2>
x is 2
<#elseifx == 3>
x is 3
<#elseifx > 4>
x is 4
<#else>
x is not 1 nor2 nor 3 nor 4
</#if>
备注:< 或 > 号 必须转义,否则出错。。转义请参考其他文档。
2、switch,case, default, break
语法
<#switchvalue>
<#case refValue1>
...
<#break>
<#case refValue2>
...
<#break>
...
<#case refValueN>
...
<#break>
<#default>
...
</#switch>
备注:该指令官方不推荐使用了,可以用if, else, elseif 指令代替。
3、list,break
语法
<#listsequence as item>
...
</#list>
备注: sequence 为一个sequence 或者 collection 类型。item 为 循环的变量。该指令中包含有两个特殊的循环变量,
item_index:该值为当前循环的值。 item_has_next:该值为一个boolean类型,表明该循环是否含有下一个(是否为循环到了最后一个)
实例:
<#assignseq = ["winter", "spring", "summer","autumn"]>
<#list seq as x>
${x_index + 1}. ${x}<#ifx_has_next>,</#if>
</#list>
输出:
1. winter,
2. spring,
3. summer,
4. autumn
实例:
<#assign x=3>
<#list 1..x as i>
${i}
</#list>
备注:当x 为一个数值序列时,可以使用该list 列出两个数值之间的值。(适合于表格的序号填写)
实例:
<#list seq as x>
${x}
<#if x = "spring"><#break></#if>
</#list>
备注:可以用<#if···><#break> 来终止该循环。
4、include
语法
<#include path>
或者
<#include path options>
备注:
path: 为包含一个文件的路径或者是一个输出为String 类型的表达式。
options: 一个或多个的参数: encoding=encoding, parse=parse
encoding: 包含文件解析的编码,如GBK、utf-8等
parse: 为一个boolean 类型值,true为用ftl解析,false为当作text文件解析(also accepts a few string values for backward compatibility)
实例:
/common/copyright.ftl内容:
Copyright2001-2002 ${me}<br>
Allrights reserved.
主体内容:
<#assignme = "Juila Smith">
<h1>Sometest</h1>
<p>Yeah.
<hr>
<#include"/common/copyright.ftl">
输出
<h1>Sometest</h1>
<p>Yeah.
<hr>
Copyright 2001-2002 JuilaSmith
All rights reserved.
备注:path 可以包含*任意取值,例如:*/copyright.ftl、commons/*/copyright.ftl等,*表示任意路径下的。
该指令具有国际化,如<#include "footer.ftl">, 这个指令的搜索文件的顺序为footer_en_US.ftl,footer_en.ftl,footer.ftl(本地为英国)。
5、import
语法:
<#import path as hash>
备注:
path:模板的路径名.
hash: 在该文件中使用该模板指令的名称。
实例:
<#import"/libs/mylib.ftl" as my>
文件中的使用:
<@my.copyrightdate="1999-2002"/>
6、noparse
语法:
<#noparse>
...
</#noparse>
备注:该指令包含的文件将不被解析成ftl,而是直接输出。
实例:
Example:
--------
<#noparse>
<#list animals as being>
<tr><td>${being.name}<td>${being.price}Euros
</#list>
</#noparse>
输出:
Example:
--------
<#list animals as being>
<tr><td>${being.name}<td>${being.price} Euros
</#list>
7、compress
语法:
<#compress>
...
</#compress>
备注:该指令将会把数据模型中的空格或者html格式去掉。
实例:
<#assign x = " moo \n\n ">
(<#compress>
1 2 3 4 5
${moo}
test only
I said, test only
</#compress>)
输出:
(1 23 4 5
moo
testonly
Isaid, test only)
8、escape,noescape
语法:
<#escape identifier asexpression>
...
<#noescape>...</#noescape>
...
</#escape>
备注:该指令对${```}该指令进行了格式化的输出。
备注:
<#escapex as x?html>
Customer Name: ${customerName}
Items to ship:
<#escape x as itemCodeToNameMap[x]>
${itemCode1}
${itemCode2}
${itemCode3}
${itemCode4}
</#escape>
</#escape>
相当于:
CustomerName: ${customerName?html}
Items to ship:
${itemCodeToNameMap[itemCode1]?html}
${itemCodeToNameMap[itemCode2]?html}
${itemCodeToNameMap[itemCode3]?html}
${itemCodeToNameMap[itemCode4]?html}
9、assign
语法:
<#assignname=value>
or
<#assignname1=value1 name2=value2 ... nameN=valueN>
or
<#assignsame as above... in namespacehash>
or
<#assign name>
capture this
</#assign>
or
<#assign name innamespacehash>
capture this
</#assign>
备注:该指令可以创建或者替换变量为页面使用,该变量为最高的层才能被创建或替换,如foo,当foo.bar时将不能被创建或者替换。
name:变量的名称。value:变量的值。namespacehash:import指令中的引用名。
实例:
<#assignseasons = ["winter", "spring", "summer","autumn"]>
<#assign
seasons = ["winter","spring", "summer", "autumn"]
test = test + 1
>
实例:
<#import"/mylib.ftl" as my>
<#assignbgColor="red" in my>
实例:
<#macromyMacro>foo</#macro>
<#assign x>
<#list 1..3 as n>
${n} <@myMacro />
</#list>
</#assign>
Number of words:${x?word_list?size}
${x}
输出:
Number of words: 6
1 foo
2 foo
3 foo
10、global
语法:
<#global name=value>
or
<#global name1=value1name2=value2 ... nameN=valueN>
or
<#global name>
capture this
</#global>
备注:该指令相似于assign 指令,只是该指令创建的变量可以被所有命名空间使用。
实例:
<#globalx = 1>
<#assignx = 2>
${x}
${.global.x}
</#assign>
输出:
2
1
备注:如果在当前命名空间中,有同名的变量存在,则global 变量将没隐藏,如需访问则:${.global.x}
11、local
语法:
<#localname=value>
or
<#localname1=value1 name2=value2 ... nameN=valueN>
or
<#localname>
capture this
</#local>
备注:该指令类似 assign 指令,但它创建或者替换了本例变量,它只能在macro定义或者function定义中有效。
12、setting
语法:
<#setting name=value>
备注:该指令的设置将影响到该指令设置的地方以下的内容有效。
它提供的设值有:
local:该值为本地的语言,将影响数值、时间等的格式。取值例如:en, en_US,en_US_MAC
number_format:用于将数值转换成String,当没有明确的格式被指定时。
boolean_format:用于将boolean转换成String
date_format,time_format,datetime_format:用于将时间转换成String
time_zone:用于设置时区,如"GMT", "GMT+2", "GMT-1:30", "CET","PST", "America/Los_Angeles"
url_escaping_charset:
classic_compatible:
实例:
${1.2}
<#settinglocale="en_US">
${1.2}
输出:
1,2
1.2
13、User-defineddirective (<@...>)
语法:
<@user_def_dir_expparam1=val1 param2=val2 ... paramN=valN/>
(Note the XML-style / beforethe >)
or if you need loop variables
<@user_def_dir_expparam1=val1 param2=val2 ... paramN=valN ; lv1, lv2, ..., lvN/>
Or the same as the above twobut with end-tag
<@user_def_dir_exp ...>
...
</@user_def_dir_exp>
or
<@user_def_dir_exp ...>
...
</@>
Or all above but withpositional parameter passing
<@ val1, val2, ...,valN/>
...etc.
备注:该指令为调用用户自定义的指令,比如macro
实例:
<@listitems=["mouse", "elephant", "python"]title="Animals"/>
...
<#macro list titleitems>
<p>${title?cap_first}:
<ul>
<#list items as x>
<li>${x?cap_first}
</#list>
</ul>
</#macro>
输出:
<p>Animals:
<ul>
<li>Mouse
<li>Elephant
<li>Python
</ul>
...
实例:
<@myRepeatMacro count=4 ;x, last>
${x}. Something... <#if last> This wasthe last!</#if>
</@myRepeatMacro>
14、macro,nested, return
语法:
<#macro name param1 param2... paramN>
...
<#nested loopvar1, loopvar2, ...,loopvarN>
...
<#return>
...
</#macro>
备注:该指令保存着模板的部分定义,可以用用户指令来调用该指令使用。该指令可以定义在任何地方,不管设定的地方之前或者之后都能使用。也可以指定默认参数的默认值。
实例:
<#macrotest foo bar="Bar" baaz=-1>
Test text, and the params: ${foo}, ${bar},${baaz}
</#macro>
<@testfoo="a" bar="b" baaz=5*5-2/>
<@test foo="a"bar="b"/>
<@test foo="a"baaz=5*5-2/>
<@testfoo="a"/>
输出:
Test text, and the params: a, b, 23
Test text, and the params: a, b, -1
Test text, and the params: a, Bar, 23
Test text, and the params: a, Bar, -1
实例:
<#macro img srcextra...>
<img src="/context${src?html}"
<#list extra?keys as attr>
${attr}="${extra[attr]?html}"
</#list>
>
</#macro>
<@imgsrc="/images/test.png" width=100 height=50 alt="Test"/>
输出:
<img src="/context/images/test.png"
alt="Test"
height="50"
width="100"
>
实例:
<#macro do_thrice>
<#nested 1>
<#nested 2>
<#nested 3>
</#macro>
<@do_thrice ; x>
${x} Anything.
</@do_thrice>
输出:
1 Anything.
2 Anything.
3 Anything.
实例:
<#macrotest>
Test text
<#return>
Will not be printed.
</#macro>
<@test/>
输出:
Testtext
15、function,return
语法:
<#functionname param1 param2 ... paramN>
...
<#return returnValue>
...
</#function>
备注:该指令创建了一个方法变量,该指令和macro指令类似,只是return 中必须有返回值。
实例:
<#functionavg x y>
<#return (x + y) / 2>
</#function>
${avg(10,20)}
输出:
15
实例:
<#functionavg nums...>
<#local sum = 0>
<#list numsas num>
<#local sum = sum + num>
</#list>
<#if nums?size != 0>
<#return sum / nums?size>
</#if>
</#function>
${avg(10, 20)}
${avg(10, 20, 30, 40)}
${avg()!"N/A"}
输出:
15
25
N/A
16、flush
语法:
<#flush>
备注:强制输出。虽然FreeMarker会自动的flush 但有些时候要强制flash 的时候可以使用该指令。
17、stop
语法:
<#stop>
or
<#stop reason>
备注:当FreeMarker要强制终止的时候,可以使用该指令,reason 为自定义终止的原因。
18、ftl
语法:
<#ftl param1=value1param2=value2 ... paramN=valueN>
备注:该指令是提供一些参数如果该文件是ftl文件,如果该文件存在则该设置在文件的最开始的地方。
设置的参数有:
encoding:模板的编码,取值为:utf-8、GBK等
strip_whitespace:是否去掉空格。取值为true、false
strip_text:是否去掉最高层的文本,取值为true、false
strict_syntax:是否为严格的语法,取值为true、false
ns_prefixes:
attributes:
19、t,lt, rt
语法
<#t> -在该行中忽略所有的空格
<#lt>-在该行中忽略左边的所有空格
<#rt>-在该行中忽略右边的所有空格
<#nt>-不去掉该行的空格
实例:
--
1 <#t>
2<#t>
3<#lt>
4
5<#rt>
6
--
输出:
--
1 23
4
5 6
--
20、attempt,recover
语法:
<#attempt>
attempt block
<#recover>
recover block
</#attempt>
备注:该指令是一个错误的捕获,和java 中的 try{}catch 相似。<#recover>是修复指令,代替出错的输出文本。
实例:
Primarycontent
<#attempt>
Optional content: ${thisMayFails}
<#recover>
Ops! The optional content is not available.
</#attempt>
Primarycontent continued
输出:
如果thisMayFails 变量不存在
Primarycontent
Ops! The optional content is not available.
Primarycontent continued
如果thisMayFails 变量存在
Primarycontent
Optional content: 123
Primarycontent continued
21、visit,recurse, fallback
语法:
<#visitnode using namespace>
or
<#visit node>
<#recurse node usingnamespace>
or
<#recursenode>
or
<#recurseusing namespace>
or
<#recurse>
<#fallback>
备注:visit 和recurse 指令是用来递归处理树节点的。在实际中,很多情况下是用来处理xml。
实例:
<#--Assume that nodeWithNameX?node_name is "x" -->
<#visitnodeWithNameX>
Done.
<#macro x>
Now I‘m handling a node that has the name"x".
Just to show how to access this node: thisnode has ${.node?children?size} children.
</#macro>
输出:
NowI‘m handling a node that has the name "x".
Just to show how to access this node: thisnode has 3 children.
Done.
实例:
主体
<#import"n1.ftl" as n1>
<#import"n2.ftl" as n2>
<#-- This will call n2.x(because there is no n1.x): -->
<#visit nodeWithNameXusing [n1, n2]>
<#-- This will call the xof the current namespace: -->
<#visitnodeWithNameX>
<#macro x>
Simply x
</#macro>
n1.ftl
<#macro y>
n1.y
</#macro>
n2.ftl:
<#macro x>
n2.x
<#-- This will call n1.y, becuase itinherits the "using [n1, n2]" from the pending visit call: -->
<#visit nodeWithNameY>
<#-- This will call n2.y: -->
<#visit nodeWithNameY using .namespace>
</#macro>
<#macro y>
n2.y
</#macro>
输出:
n2.x
n1.y
n2.y
Simply x
freemark 语法与示例