案例-指令參考描述:本人自己測試寫了一遍,如有錯的地方,懂freemarker的朋友望指點指點!
案例-指令參考
表示式
一、 Assign
1、<#assign name1="北京" name2="上海" name3="廣東">
呼叫:${name1}、${name2}、${name3}
2、<#assign name1> 訊息模擬.. </#assign>
呼叫:${name1}
3、<#assign name5 in my名稱空間> 訊息模擬.. </#assign>
呼叫:<#import "InstructionReference.ftl" as my名稱空間>
${my.name5}
二、attempt, recover
<#attempt>
=============>輸出:${my.name5}
<#recover>
錯誤recover block
</#attempt>
attempt block:任意內容的模板塊。這是會被執行的, 但是如果期間發生了錯誤,那麼這塊內容的輸出將會回滾,之後 recover block 就會被執行。
recover block: 任意內容的模板塊。 這個僅在 attempt block 執行期間發生錯誤時被執行。你可以在這裡列印錯誤資訊或其他操。
三、compress
當你使用了對空白、換行的格式(比如HTML或XML) 時壓縮指令對於移除多餘的空白
<#assign x = " moo \n\n ">
<#compress>
1 2 3 4 5
${x}
test only
I said, test only
</#compress>
四、flush
<#Flush>
說明:當 FreeMarker 生成輸出時,它通常不會立即傳送到最終接收端
(比如web瀏覽器或最終的檔案),而是會將內容累積在緩衝區,
傳送一個大塊的內容。 緩衝區的精確規則不是由 FreeMarker 決定的
,而是由嵌入的軟體決定的。 將緩衝區中累積的內容傳送出去稱為沖洗。
五、function, return
<#function name param1 param2 ... paramN>
...
<#return returnValue>
...
</#function>
說明:
name:方法變數的名稱(不是表示式)
param1, param2 等: 區域性變數的名稱, 儲存引數的值(不是表示式),在 = 號後面和預設值 (是表示式)是可選的。
paramN,最後一個引數, 可以可選的包含一個尾部省略(...), 這就意味著巨集接受可變的引數數量。區域性變數 paramN 將是額外引數的序列。
returnValue: 計算方法呼叫值的表示式。
return 指令可以在 <#function ...> 和 </#function> 之間被用在任意位置和任意次數。
沒有預設值的引數必須在有預設值引數 (paramName=defaultValue) 之前
示例1:
<#function avg x y>
<#return (x + y) * 6>
</#function>
${avg (10, 20)}
示例2:
<#function avg nums...>
<#local sum = 0>
<#list nums as num>
<#local sum = sum + num>
</#list>
<#if nums? size = 5>
<#return sum / nums? size>
</#if>
</#function>
${avg (10, 20, 30, 40, 40)}//引數可任意個
六、global全域性變數
1、<#global name1="北京2">
呼叫:${name1} 2、<#global name1="北京" name2="上海" name3="廣東">
呼叫:${name1}、${name2}、${name3} 3、<#global name4>訊息模擬. </#global>
呼叫:${name4} 說明:一個相同名稱的變數存在的話, 那麼會隱藏由 global 指令建立的變數。
七、if, else, elseif
示例1:只有 if 沒有 elseif 和 else
<#if x == >
x is 1
</#if>
示例2:只有 if 沒有 elseif 但是有 else
<#if x == >
x is 1
<#else>
x is not 1
</#if>
示例3:有 if 和兩個 elseif 但是沒有 else
<#if x == >
x is 1
<#elseif x == >
x is 2
<#elseif x == >
x is 3
</#if>
示例4:有 if 和三個 elseif 還有 else
<#if x == >
x is 1
<#elseif x == >
x is 2
<#elseif x == >
x is 3
<#elseif x == >
x is 4
<#else>
x is not 1 nor 2 nor 3 nor 4
</#if>
示例5:巢狀 if 指令
<#if x == >
x is 1
<#if y == >
and y is 1 too
<#else>
but y is not
</#if>
<#else>
x is not 1
<#if y < 0>
and y is less than 0
</#if>
</#if>
八、import
<#import path as hash>
說明:使用參考assign,建立一個名稱空間引入然後被呼叫。
path模板的路徑。 這是一個算作是字串的表示式。(換句話說,它不是一個固定的字串, 它可以是這樣的一些東西,比如,profile.baseDir + "/menu.ftl"。)
hash訪問名稱空間的雜湊表變數不帶引號的名字。不是表示式。 (要引入動態建立的名字)
示例:<#import "/libs/mylib.ftl" as my>
<@my.copyright date="1999-2002"/>
九、include
<#include path> 或 <#include path options>
path包含檔案的路徑;一個算作是字串的表示式。(用其他話說, 它不用是一個固定的字串,它也可以是像"/menu.ftl"這樣的東西。)
options一個或多個這樣的選項: encoding=encoding, parse=parse
parse: 算作是布林值的表示式(為了向下相容,也接受一部分字串值)
encoding: 算作是字串的表示式
ignore_missing: 算作是布林值的表示式
parse:如果它為 true, 那麼被包含的檔案將會當作FTL來解析,否則整個檔案將被視為簡單文字 (也就是說不會在其中查詢 FreeMarker 的結構)。如果你忽略了這個選項, 那麼它預設是 true。
encoding:被包含檔案從包含它的檔案繼承的編碼方式 (實際就是字符集),除非你用這個選項來指定編碼方式。 合法的名字有:ISO-8859-2,UTF-8,Shift_JIS,Big5,EUC-KR,GB2312。
ignore_missing:當為 true,模板引用為空時壓制錯誤,而 <#include ...> 不會輸出任何東西。當為 false 時,如果模板不存在, 那麼模板處理就會發生錯誤並停止。如果忽略這個選項,那麼它的預設值是 false。
說明:使用它在你的模板中插入另外一個 FreeMarker 模板檔案 (由 path 引數指定)。 被包含模板的輸出格式是在 include 標籤出現的位置插入的。 被包含的檔案和包含它的模板共享變數,就像是被複制貼上進去的一樣。
示例:
<#include "/common/copyright.ftl">
<#include "/common/navbar.html" parse=false encoding="Shift_JIS">
十、local
<#local name=value>
或
<#local name1=value1 name2=value2 ... nameN=valueN>
或
<#local name>
capture this
</#local> 說明:name在root中區域性物件的名稱。它不是一個表示式。但它可以被寫作是字串形式, 如果變數名包含保留字元,這是很有用的,比如 <#local "foo-bar" = 1>。 請注意,這個字串沒有擴充套件插值(如"${foo}")。
=:賦值操作符,也可以簡寫的賦值操作符之一 (++,+= 等...),和 assign 指令 相似。value 儲存的值,是表示式。 示例:它和 assign 指令 類似,但是它建立或替換區域性變數。 這僅僅在巨集和方法的內部定義才會有作用。
<#function Str1 nums>
<#local sum = ".......">
<#return sum + nums>
</#function>
呼叫:${Str1("測試")} 輸出:.......測試
十一、macro, nested, return
<#macro name param1 param2 ... paramN>
...
<#nested loopvar1, loopvar2, ..., loopvarN>
...
<#return>
...
</#macro>
說明:
• name: 巨集變數的名稱,它不是表示式。和 頂層變數 的語法相同,比如 myMacro 或 my\-macro。 然而,它可以被寫成字串的形式,如果巨集名稱中包含保留字元時,這是很有用的,
比如 <#macro "foo~bar">...。 注意這個字串沒有擴充套件插值(如"${foo}")。
• param1, param2,等...: 區域性變數 的名稱,儲存引數的值 (不是表示式),在 = 號後面和預設值(是表示式)是可選的。 預設值也可以是另外一個引數,
比如 <#macro section title label=title>。引數名稱和 頂層變數 的語法相同,所以有相同的特性和限制。
• paramN, 最後一個引數,可能會有三個點(...), 這就意味著巨集接受可變數量的引數,不匹配其它引數的引數可以作為最後一個引數 (也被稱作籠統引數)。
當巨集被命名引數呼叫, paramN 將會是包含巨集的所有未宣告的鍵/值對的雜湊表。當巨集被位置引數呼叫,
paramN將是額外引數的序列。 (在巨集內部,要查詢引數,可以使用 myCatchAllParam?is_sequence。)
• loopvar1, loopvar2等...: 可選的,迴圈變數 的值, 是 nested 指令想為巢狀內容建立的。這些都是表示式。
return 和 nested 指令是可選的,而且可以在 <#macro…> 和 </#macro> 之間被用在任意位置和任意次數
示例1:標準寫法
<#macro test1>
Test text
</#macro>
呼叫:
<@mtest1/>
示例2:帶引數的巨集(引數可多個)
<#macro test2 data>
Test text:${data}
</#macro>
呼叫:
<@test2 data="Hello"/>
示例3:帶引數、預設引數(可多個)
<#macro test3 data1 data2="2" data3="3">
===>${data1}
===>${data2}
===>${data3}
</#macro>
呼叫:
<@test3 data1="Hello" data2="Hello"/> <@test3 data1="Hello" />
示例4:集合迭代元素的巨集
<#macro list title items>
<p>${title? cap_first}: </p>
<ul>
<#list items as x>
<li>${x? cap_first} </li>
</#list>
</ul>
</#macro>
呼叫:
<@list items=["mouse", "elephant", "python"] title="標題"/>
Nested
Nested
說明:ested 指令執行自定義指令開始和結束標籤中間的模板片段。 巢狀的片段可以包含模板中任意合法的內容 示例1:標準簡單
<#macro do_twice>
1. <#nested>
2. <#nested>
</#macro>
呼叫:<@do_twice>something</@do_twice>
輸出:
示例2:巢狀內容建立迴圈變數
<#macro do_thrice>
<#nested >
<#nested >
<#nested >
</#macro>
呼叫:<@do_thrice; x>
${x} Anything.
</@do_thrice>
return
說明:可以在任意位置留下一個巨集或函式定義。
<#macro test d>
This test
<#return>
Will not be printed${d}
</#macro>
呼叫:<@test d="===>"/>
十二、noparse(不解析ftl)
<#noparse>
...
</#noparse>
說明:不會在這個指令體中間尋找FTL標籤, 插值和其他特殊的字元序列,除了noparse的結束標記,避開對noparse內部ftl的解析。 示例1:
<#noparse>
<#list animals as animal>
<tr><td>${animal.name} <td>${animal. price} Euros
</#list>
</#noparse>
十三、stop
<#stop>
或
<#stop reason> 說明:reason停止對模版解析,並且丟擲一個異常,終止原因的資訊化訊息。是表示式,被算做是字串,中止模板處理,給出(可選的)錯誤訊息。 不要在普通情況下對結束模板處理使用! FreeMarker 模板的呼叫者會將它視為失敗的模板呈現。
十四、switch, case, default, break
<#switch "2">
<#case "1">
===>;1
<#break>
<#case "2">
===>; 2
<#break>
<#case "3">
===>; 3
<#break>
</#switch>
說明:value, refValue1表示式將會計算成相同型別的標量,break 和 default 是可選的。
十五、t, lt, rt
<#t>
<#lt>
<#rt>
說明:指示FreeMarker去忽略標記中行的特定的空白的移除發生在解析階段
t (整體削減):忽略本行中首和尾的所有空白。
lt (左側削減):忽略本行中首部所有的空白。
rt (右側削減):忽略本行中尾部所有的空白。