表達式是FreeMarker的核心功能,FreeMarker中的插值支持多種表達式。
一、直接指定值
直接指定值可以是字符串、數值、布爾值、集合及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必須是字符串。
二、輸出變量值 FreeMarker的表達式輸出變量時,這些變量可以是頂層變量,也可以是Map對象的變量,還可以是集合中的變量,并可以使用點(.)語法來訪問Java對象的屬性。
1. 頂層變量 所謂頂層變量就是直接放在數據模型中的值。輸出時直接用${variableName}即可。
2. 輸出集合元素 可以根據集合元素的索引來輸出集合元素,索引用中括號包括。如: 輸出[“1”, “2”, “3”]這個名為number的集合,可以用${number[0]}來輸出第一個數字。FreeMarker還支持用number[1..2]來表示原 集合的子集合[“2”, “3”]。
3. 輸出Map元素 對于JavaBean實例,FreeMarker一樣把它看作屬性為key,屬性值為value的Map對象。
輸出Map對象時,可以使用點語法或中括號語法,如下面的幾種寫法的效果是一樣的:
book.author.name book.author["name"] book["author"].name book["author"]["name"] 使用點語法時,變量名字有和頂層變量一樣的限制,但中括號語法沒有任何限制。
三、字符串操作 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” --> 四、集合連接操作
連接集合的運算符為“+”
五、Map連接操作 Map連接操作的運算符為“+”
六、算術運算符 FreeMarker表達式中支持“+”、“-”、“*”、“/”、“%”運算符。
七、比較運算符 表達式中支持的比較運算符有如下幾種:
1. =(或者==): 判斷兩個值是否相等;
2. !=: 判斷兩個值是否不相等;
注: =和!=可以用作字符串、數值和日期的比較,但兩邊的數據類型必須相同。而且FreeMarker的比較是精確比較,不會忽略大小寫及空格。
3. >(或者gt): 大于
4. >=(或者gte): 大于等于
5. <(或者lt): 小于
6. <=(或者lte): 小于等于
注: 上面這些比較運算符可以用于數字和日期,但不能用于字符串。大部分時候,使用gt比>有更好的效果,因為FreeMarker會把>解釋成標簽的結束字符??梢允褂美ㄌ杹肀苊膺@種情況,如:<#if (x>y)>。
八、邏輯運算符 1. &&: 邏輯與;
2. ||: 邏輯或;
3. !: 邏輯非
邏輯運算符只能用于布爾值。
九、內建函數 FreeMarker提供了一些內建函數來轉換輸出,可以在任何變量后緊跟?,?后緊跟內建函數,就可以通過內建函數來轉換輸出變量。
字符串相關常用的內建函數:
1. html: 對字符串進行HTML編碼;
2. cap_first: 使字符串第一個字母大寫;
3. lower_case: 將字符串轉成小寫;
4. upper_case: 將字符串轉成大寫;
集合相關常用的內建函數:
1. size: 獲得集合中元素的個數;
數字值相關常用的內建函數:
1. int: 取得數字的整數部分。
十、空值處理運算符 FreeMarker的變量必須賦值,否則就會拋出異常。而對于FreeMarker來說,null值和不存在的變量是完全一樣的,因為FreeMarker無法理解null值。
FreeMarker提供兩個運算符來避免空值:
1. !: 指定缺失變量的默認值;
2. ??:判斷變量是否存在。
!運算符有兩種用法:variable!或variable!defaultValue。第一種用法不給變量指定默認值,表明默認值是空字符串、長度為0的集合、或長度為0的Map對象。
使用!運算符指定默認值并不要求默認值的類型和變量類型相同。
??運算符返回布爾值,如:variable??,如果變量存在,返回true,否則返回false。