FreeMarker 的常用指令介紹
一、數據類型:
四種基本類型:String、Number、Boolean、Date。直接指定值可以是字符串、數值、布爾值、集合及Map對象
1. 字符串
直接指定字符串值使用單引號或雙引號限定。字符串中可以使用轉義字符”\"。如果字符串內有大量的特殊字符,則可以在引號的前面加上一個字母r,則字符串內的所有字符都將直接輸出。
2. 數值
數值可以直接輸入,不需要引號。FreeMarker不支持科學計數法。
3. 布爾值
直接使用true或false,不使用引號。
4. 集合
集合用中括號包括,集合元素之間用逗號分隔。
使用數字范圍也可以表示一個數字集合,如1..5等同于集合[1, 2, 3, 4, 5];同樣也可以用5..1來表示[5, 4, 3, 2, 1]。
5. Map對象
Map對象使用花括號包括,Map中的key-value對之間用冒號分隔,多組key-value對之間用逗號分隔。
注意:Map對象的key和value都是表達式,但key必須是字符串。{"name":"green mouse", "price":150}
6. 時間對象
root.put("date1", new Date());
${date1?string("yyyy-MM-dd HH:mm:ss")}
二、控制語句
if指令
這是一個典型的分支控制指令,該指令的作用完全類似于Java語言中的if,if指令的語法格式如下:
<#if condition>...
<#elseif condition>...
<#elseif condition>...
<#else> ...
</#if>
例子如下:
<#assign age=23>
<#if (age>60)>老年人
<#elseif (age>40)>中年人
<#elseif (age>20)>青年人
<#else> 少年人
</#if>
輸出結果是:青年人
上面的代碼中的邏輯表達式用括號括起來主要是因為里面有“>”符號,由于FreeMarker會將>符號當成標簽的結束字符,可能導致程序出錯,為了避免這種情況,我們應該在凡是出現這些符號的地方都使用括號。
自定義指令(macro指令)
<#macro m1> <#--定義指令m1 -->
<b>aaabbbccc</b>
<b>dddeeefff</b>
</#macro>
<@m1 /><@m1 /> <#--調用上面的宏指令 -->
輸出:aaabbbccc
dddeeefff
定義帶參的宏指令:
<#macro m2 a b c >
${a}--${b}--${c}
</#macro>
<@m2 a="老高" b="老張" c="老馬" />
nested指令:
<#macro border>
<table border=4 cellspacing=0 cellpadding=4><tr><td>
<#nested>
</td></tr></table>
</#macro>
<@border >表格中的內容!</@border>
include指令:
<#include "included.txt" />
三、集合操作
list, break
語法
<#list sequence as item >
...
<#if item = "spring"><#break></#if>
...
</#list>
關鍵字
item_index: 是list當前值的下標
item_has_next: 判斷list是否還有值
用例
<#assign seq = ["winter", "spring", "summer", "autumn"]>
<#list seq as x>
${x_index + 1}. ${x}<#if x_has_next>,</#if>
</#list>
輸出
1. winter,
2. spring,
3. summer,
4. autumn
四、空值處理
FreeMarker的變量必須賦值,否則就會拋出異常。
而對于FreeMarker來說,null值和不存在的變量是完全一樣的,因為FreeMarker無法理解null值。
FreeMarker提供兩個運算符來避免空值:
1. !: 指定缺失變量的默認值;
2. ??:判斷變量是否存在。
!運算符有兩種用法:variable!或variable!defaultValue。第一種用法不給變量指定默認值,表明默認值是空字符串、長度為0的集合、或長度為0的Map對象。
使用variable!defaultValue運算符指定默認值并不要求默認值的類型和變量類型相同。
測試空值處理:
<#-- ${sss} 沒有定義這個變量,會報異常! -->
${sss!} <#--沒有定義這個變量,默認值是空字符串! -->
${sss!"abc"} <#--沒有定義這個變量,默認值是字符串abc! -->
五、命名空間_宏指令
當運行 FTL 模板時,就會有使用 assign 和 macro 指令創建的變量的集合(可能是空的),可以從前一章節來看如何使用它們。像這樣的變量集合被稱為 namespace 命名空間。在簡單的情況下可以只使用一個命名空間,稱之為 main namespace 主命名空間。因為通常只使用本頁上的命名空間,所以就沒有意識到這點。
如果想創建可以重復使用的宏,函數和其他變量的集合,通常用術語來說就是引用
library 庫。使用多個命名空間是必然的。只要考慮你在一些項目中,或者想和他人共享使用的時候,你是否有一個很大的宏的集合。但要確保庫中沒有宏(或其他變量)名和數據模型中變量同名,而且也不能和模板中引用其他庫中的變量同名。通常來說,變量因為名稱沖突也會相互沖突。所以要為每個庫中的變量使用不同的命名空間。
定義b.ftl文件:
<#macro copyright date>
<p>Copyright (C) ${date} 中國人民.</p>
</#macro>
<#assign mail = "zgrm@163.com">
在a.ftl文件中引入b.ftl,從而可以使用b.ftl中定義的宏和變量:
測試命名空間:
<#import "b.ftl" as bb />
<@bb.copyright date="2010-2011" />
${bb.mail}
<#assign mail="my@163.com" />
${mail}
<#assign mail="my@163.com" in bb />
${bb.mail}
執行后,控制臺打印:
測試命名空間:
<p>Copyright (C) 2010-2011 中國人民.</p>
zgrm@163.com
my@163.com
my@163.com
六、字符串操作
1. 字符串連接
字符串連接有兩種語法:
(1) 使用${..}或#{..}在字符串常量內插入表達式的值;
(2) 直接使用連接運算符“+”連接字符串。
如,下面兩種寫法等效:
${"Hello, ${user}"}
${"Hello, " + user + "!"}
有一點需要注意: ${..}只能用于文本部分作為插值輸出,而不能用于比較等其他用途,如:
<#if ${isBig}>Wow!</#if>
<#if "${isBig}">Wow!</#if>
應該寫成:
<#if isBig>Wow!</#if>
2. 截取子串
截取子串可以根據字符串的索引來進行,如果指定一個索引值,則取得字符串該索引處的字符;如果指定兩個索引值,則截取兩個索引中間的字符串子串。如:
<#assign number="01234">
${number[0]} <#-- 輸出字符0 -->
${number[0..3]} <#-- 輸出子串“0123” -->
七、內置函數
FreeMarker提供了一些內建函數來轉換輸出,可以在任何變量后緊跟?。?后緊跟內建函數,就可以通過內建函數來轉換輸出變量。
字符串相關常用的內建函數:
1. html: 對字符串進行HTML編碼;
2. cap_first: 使字符串第一個字母大寫;
3. lower_case: 將字符串轉成小寫;
4. upper_case: 將字符串轉成大寫;
集合相關常用的內建函數:
1. size: 獲得集合中元素的個數;
數字值相關常用的內建函數:
1. int: 取得數字的整數部分。
舉例:
root.put("htm2", "<b>粗體</b>");
內建函數:
${htm2?html}
輸出:<b>粗體</b>