FreeMarker 的常用指令介紹

jopen 10年前發布 | 24K 次閱讀 FreeMarker 模板引擎

一、數據類型:

四種基本類型:String、Number、Boolean、Date。直接指定值可以是字符串、數值、布爾值、集合及Map對象

1. 字符串
直接指定字符串值使用單引號或雙引號限定。字符串中可以使用轉義字符”\"。如果字符串內有大量的特殊字符,則可以在引號的前面加上一個字母r,則字符串內的所有字符都將直接輸出。
2. 數值
數值可以直接輸入,不需要引號。FreeMarker不支持科學計數法。
3. 布爾值
直接使用truefalse,不使用引號。
4. 集合
集合用中括號包括,集合元素之間用逗號分隔。
使用數字范圍也可以表示一個數字集合,如1..5等同于集合[1, 2, 3, 4, 5];同樣也可以用5..1來表示[5, 4, 3, 2, 1]
5. Map對象
Map對象使用花括號包括,Map中的key-value對之間用冒號分隔,多組key-value對之間用逗號分隔。
注意:Map對象的keyvalue都是表達式,但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>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!