1、數據類型:html
四種基本類型:String、Number、Boolean、Date。直接指定值能夠是字符串、數值、布爾值、集合及Map對象spring
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")}spa
2、控制語句.net
if指令 orm
這是一個典型的分支控制指令,該指令的做用徹底相似於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會將>符號當成標籤的結束字符,可能致使程序出錯,爲了不這種狀況,咱們應該在凡是出現這些符號的地方都使用括號。htm
自定義指令(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" />
3、集合操做
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
4、空值處理
FreeMarker的變量必須賦值,不然就會拋出異常。
而對於FreeMarker來講,null值和不存在的變量是徹底同樣的,由於FreeMarker沒法理解null值。
FreeMarker提供兩個運算符來避免空值:
1. !: 指定缺失變量的默認值;
2. ??:判斷變量是否存在。
!運算符有兩種用法:variable!或variable!defaultValue。第一種用法不給變量指定默認值,代表默認值是空字符串、長度爲0的集合、或長度爲0的Map對象。
使用variable!defaultValue運算符指定默認值並不要求默認值的類型和變量類型相同。
測試空值處理:
<#-- ${sss} 沒有定義這個變量,會報異常! -->
${sss!} <#--沒有定義這個變量,默認值是空字符串! -->
${sss!"abc"} <#--沒有定義這個變量,默認值是字符串abc! -->
5、命名空間_宏指令
當運行 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
6、字符串操做
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」 -->
7、內置函數
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>