freemarker數據類型,自定義指令

freemarker的數據模型最外層其實是相似的哈希表的數據結構(與json格式的map類型很類似),有一個根節點,只有經過根節點才能訪問到數據模型中存在的各個變量。java

1.freemarker支持的數據類型有:標量(字符串、數字、布爾型、日期),容器(哈希表、序列、集),子程序(方法函數、自定義指令),節點(xml文檔)json

序列與集的區別:集是有限的序列(數量已經固定),但集的大小獲取不到,可是仍能經過list指令遍歷集,相似java中的數組與list數組

2.檢索變量,freemarker 全部的數據都都須要頂層變量來獲取數據,從哈希表中獲取數據,如上圖獲取user值,直接使用user便可可是獲取name值就是用cargo.name或是cargo[name]來獲取數據;從序列中檢索數據如上圖,ltteryNumbers[0]=20,使用下標獲取。兩個序列經過「+」運算符鏈接生成一個總序列,內容是二者之和,不會去重;兩個哈希表也能夠經過「+」進行鏈接,對於重複key值的,以運算符右側的哈希表爲主。數據結構

3.字符串操做:任何數據類型變量經過「+」與字符串變量鏈接,都會生成一個新的字符串;能夠當作字符的序列,經過下標能夠獲取指定位置的字符函數

4.內建函數:freemarker自帶的一些函數,如cap_first使字符串首字母大寫,lower_case使字符串全部字母小寫,upper_case使字符串全部字母大寫等等;使用內建函數的格式:變量名?函數名spa

5.在ftl中自定義指令:使用macro指令來實現,macro指令不輸出任何內容,是用來建立宏變量,定義宏定義體。例:code

  

自定義指令使用"@"代替"#",自定義指令的能夠添加參數,即給標籤添加屬性上述截圖中指令添加參數:xml

<#macro hello name>
    <font color='green'>這是自定義指令輸出的內容,你好${name}</font>
</#macro>

<#--調用自定義指令-->
<@hello name='admin'/>

結果:生命週期

注意:自定義指令參數是在調用的時候其定義的參數在沒有指定默認值的狀況,全部參數都要給定一個值;同時不能再自定義指令中傳入未定義的參數值,上述兩種狀況都會報錯。可是針對第一種狀況能夠指定參數的默認值,這種狀況下能夠省略該參數,可是指定參數值時會覆蓋默認值。文檔

例如:

<#macro hello name color='red'>
    <font color=${color}>這是自定義指令輸出的內容,你好${name}</font>
</#macro>

<#--調用自定義指令-->
<@hello name='admin'/><br/>
<#--都指定-->
<@hello name='admin' color='blue'/>

顯示:


6.nested指令:自定義指令的標籤能夠嵌套任何內容,可是須要經過<#nested>通知freemarker引擎該指令能夠支持顯示嵌套的內容,若沒有該指令則會這樣:    

使用nested指令以後:

7.在模板中定義變量,模板中定義變量類型:簡單變量、局部變量、循環變量

   簡單變量:在模版中的任意位置都能訪問到,包括經過include指令引入的模版,使用assign和macro指令來建立的變量。

   局部變量:只能在宏定義體內聲明,且只能在宏定義體內使用,一個局部變量的生命週期就是一個宏調用(即:自定義指 令 執行的過程)的過程;使用local指令在宏定義體內建立。

  循環變量:該類型的變量是有list指令自動建立並使用的,只在list指令的開始結束和結束標記之間有效。

  三種變量之間的關係:簡單變量會覆蓋數據模型中的同名變量,局部變量會在本身適用範圍內掩蓋同名的簡單變量,循環變量會在本身的有效範圍內掩蓋同名的局部變量和簡單變量,內循環變量會掩蓋外循環同名變量。

若想訪問到數據模型中被隱藏的變量可以使用特殊變量globals進行訪問,格式爲:${.globals.變量名}

8.命名空間:經過macro和assign指令建立的變量、指令、函數的集合,用來封裝這些變量、指令、函數的集合稱爲命名空間也稱爲庫。

import指令與include指令的區別:include是在原有的命名空間中建立引用模版中定義聲明的變量,import指令則是爲引入的模版建立一個新的命名空間來建立這兩個變量。

include和import指令引用模版文件的路徑問題,實現模版之間的相互引用,在設置Configuration的DirectoryForTemplateLoading屬性的時候,必須設置爲兩模版文件共同目錄位置,而後在引用時使用相對DirectoryForTemplateLoading屬性值的相對路徑。舉例說明:

模版的位置:

在代碼中指定Configuration的DirectoryForTemplateLoading屬性值,以及獲取要展現的模版

在要展現的模版中引入其餘模版文件並指明命名空間名稱

命名空間之間是相互獨立的,若是命名空間N1中import命名空間N2,只能表明在N1中經過相似map訪問形式訪問名稱空間N2中的數據,而不表明着N2中的數據在名稱空間N1中

相關文章
相關標籤/搜索