FreeMarker模板文件主要由以下4個部分組成:html
文本:直接輸出部分函數
註釋:<!-- …-->格式部分,不輸出編碼
插值:即${}或者#{}部分,使用數據模型中的部分替代輸出.spa
FTL指令:freemarker指定,和html標記相似,名字前加#予以區分,不會輸出.orm
一. Freemarker指令規則htm
前面的#能夠變爲@, ,若是該指令是一個用戶指令而不是系統內建指令時,應將#符號改爲@符號. FreeMarker會忽略FTL標籤中的空白字符,值得注意的是< , /> 和指令之間不容許有空白字符.對象
a) 開始標籤<#directivename parameter>索引
b) 結束標籤</#directivename>字符串
c) 空標籤:<#directivename parameter/>string
二. Freemarker插值規則
a) 通用插值${expr};
i. 插值結果爲字符串值:直接輸出表達式結果
ii. 插值結果爲數字值:根據默認格式(由#setting指令設置)將表達式結果轉換成文本輸出.可使用內建的字符串函數格式化單個插值
iii. 插值結果爲日期值:根據默認格式(由#setting指令設置)將表達式結果轉換成文本輸出.可使用內建的字符串函數格式化單個插值
iv. 插值結果爲布爾值:根據默認格式(由#setting指令設置)將表達式結果轉換成文本輸出.可使用內建的字符串函數格式化單個插值.
v. 字符串格式化例子: ${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}
b) 數字格式化插值:#{expr}或#{expr;format}
i. 數字格式化插值可採用#{expr;format}形式來格式化數字,其中format能夠是:
mX:小數部分最小X位
MX:小數部分最大X位
ii. 數字格式化例子:#{x; m1M2} <#-- 輸出2.58 -->
三. 表達式
表達式是FreeMarker模板的核心功能,表達式放置在插值語法${}之中時,代表須要輸出表達式的值;表達式語法也可與FreeMarker標籤結合,用於控制輸出.實際上FreeMarker的表達式功能很是強大,它不只支持直接指定值,輸出變量值,也支持字符串格式化輸出和集合訪問等功能.
a) 直接指定值, 使用直接指定值語法讓FreeMarker直接輸出插值中的值,而不是輸出變量值.直接指定值能夠是字符串,數值,布爾值,集合和MAP對象.
i. 字符串:直接指定字符串值使用單引號或雙引號限定,若是字符串值中包含特殊字符須要轉義.
ii. 數值: 表達式中的數值直接輸出,不須要引號.小數點使用"."分隔,不能使用分組","符號.FreeMarker目前還不支持科學計數法
iii. 布爾值: 直接使用true和false,不使用引號.
iv. 集合: 集合以方括號包括,各集合元素之間以英文逗號","分隔.
<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x>
${x}
</#list>
1. 集合: 可使用數字範圍定義數字集合,如2..5等同於[2, 3, 4, 5]
v. Map對象: Map對象使用花括號包括,Map中的key-value對之間以英文冒號":"分隔,多組key-value對之間以英文逗號","分隔
b) 輸出變量值: FreeMarker的表達式輸出變量時,這些變量能夠是頂層變量,也能夠是Map對象中的變量,還能夠是集合中的變量,並可使用點(.)語法來訪問Java對象的屬性
i. 頂層變量: 直接放在數據模型中的值直接使用${variableName}來輸出變量值
ii. 輸出集合元素: 若是須要輸出集合元素,則能夠根據集合元素的索引來輸出集合元素,集合元素的索引以方括號指定.FreeMarker還支持返回集合的子集合,若是須要返回集合的子集合
iii. 輸出Map元素: Map對象能夠是直接HashMap的實例,甚至包括JavaBean實例,對於JavaBean實例而言,咱們同樣能夠把其當成屬性爲key,屬性值爲value的Map實例.爲了輸出Map元素的值,可使用點語法或方括號語法
c) 字符串操做: 操做很是靈活,能夠將字符串常量和變量鏈接起來,也能夠返回字符串的子串
i. 使用${..}或#{..}在字符串常量部分插入表達式的值,從而完成字符串鏈接.
ii. 直接使用鏈接運算符+來鏈接字符串
d) 集合鏈接運算符: 集合運算符是將兩個集合鏈接成一個新的集合,鏈接集合的運算符是+
i. <#list ["星期一","星期二","星期三"] + ["星期四","星期五","星期六","星期天"] as x>
${x}
</#list>
e) Map對象的鏈接運算符也是將兩個Map對象鏈接成一個新的Map對象,Map對象的鏈接運算符是+
f) 算術運算符:FreeMarker表達式中徹底支持算術運算,FreeMarker支持的算術運算符包括:+, - , * , / , %
i. 運算符兩邊的運算數字必須是數字
ii. 使用+運算符時,若是一邊是數字,一邊是字符串,就會自動將數字轉換爲字符串再鏈接
iii. 使用內建的int函數可對數值取整
g) 比較運算符:
i. =或者==:判斷兩個值是否相等.
ii. !=:判斷兩個值是否不等. =和!=兩邊必須是相同類型的值
iii. >或者gt:判斷左邊值是否大於右邊值
iv. >=或者gte:判斷左邊值是否大於等於右邊值
v. <或者lt:判斷左邊值是否小於右邊值
vi. <=或者lte:判斷左邊值是否小於等於右邊值
h) 邏輯運算符
i. 邏輯與:&&
ii. 邏輯或:||
iii. 邏輯非:!
iv. 邏輯運算符只能做用於布爾值,不然將產生錯誤
i) 內建函數FreeMarker還提供了一些內建函數來轉換輸出,能夠在任何變量後緊跟?,?後緊跟內建函數,就能夠經過內建函數來輪換輸出變量
i. html:對字符串進行HTML編碼
ii. cap_first:使字符串第一個字母大寫
iii. lower_case:將字符串轉換成小寫
iv. upper_case:將字符串轉換成大寫
v. trim:去掉字符串先後的空白字符
j) 空值處理運算符FreeMarker對空值的處理很是嚴格,FreeMarker的變量必須有值,沒有被賦值的變量就會拋出異常,由於FreeMarker未賦值的變量強制出錯能夠杜絕不少潛在的錯誤,如缺失潛在的變量命名,或者其餘變量錯誤.這裏所說的空值,實際上也包括那些並不存在的變量,對於一個Java的null值而言,咱們認爲這個變量是存在的,只是它的值爲null,但對於FreeMarker模板而言,它沒法理解null值,null值和不存在的變量徹底相同.
i. !:指定缺失變量的默認值
ii. ??:判斷某個變量是否存在
四. FreeMarker的經常使用指令
FreeMarker的FTL指令也是模板的重要組成部分,這些指令可實現對數據模型所包含數據的撫今迭代,分支控制.除此以外,還有一些重要的功能,也是經過FTL指令來實現的.
a) if指令
b) switch , case , default , break指令
c) list, break指令
d) include指令
e) import指令
f) noparse指令noparse指令指定FreeMarker不處理該指定裏包含的內容,
g) escape , noescape指令escape指令致使body區的插值都會被自動加上escape表達式,但不會影響字符串內的插值,只會影響到body內出現的插值
h) assign指令用於爲該模板頁面建立或替換一個頂層變量
i) setting指令該指令用於設置FreeMarker的運行環境
j) macro , nested , return指令macro能夠用於實現自定義指令,經過使用自定義指令,能夠將一段模板片斷定義成一個用戶指令.