macro能夠用於實現自定義指令,經過使用自定義指令,能夠將一段模板片斷定義成一個用戶指令,使用macro指令的語法格式以下:
< #macro name param1 param2 ... paramN>
...
< #nested loopvar1, loopvar2, ..., loopvarN>
...
< #return>
...
< /#macro>
在上面的格式片斷中,包含了以下幾個部分:
name:name屬性指定的是該自定義指令的名字,使用自定義指令時能夠傳入多個參數
paramX:該屬性就是指定使用自定義指令時報參數,使用該自定義指令時,必須爲這些參數傳入值
nested指令:nested標籤輸出使用自定義指令時的中間部分
nested指令中的循環變量:這此循環變量將由macro定義部分指定,傳給使用標籤的模板
return指令:該指令可用於隨時結束該自定義指令. html
看以下的例子:
< #macro book> //定義一個自定義指令
j2ee
< /#macro>
< @book /> //使用剛纔定義的指令
上面的代碼輸出結果爲:j2ee spring
在上面的代碼中,可能很難看出自定義標籤的用處,由於咱們定義的book指令所包含的內容很是簡單,實際上,自定義標籤可包含很是多的內容,從而能夠實現更好的代碼複用.此外,還能夠在定義自定義指令時,爲自定義指令指定參數,看以下代碼:
< #macro book booklist> //定義一個自定義指令booklist是參數
<#list booklist as book>
${book}
< /#list>
< /#macro>
< @book booklist=["spring","j2ee"] /> //使用剛剛定義的指令
上面的代碼爲book指令傳入了一個參數值,上面的代碼的輸出結果爲:spring j2eeoop
不只如此,還能夠在自定義指令時使用nested指令來輸出自定義指令的中間部分,看以下例子:
< #macro page title>
< html>
< head>
<title>FreeMarker示例頁面 - ${title?html}</title>
< /head>
< body>
<h1>${title?html}</h1>
<#nested> //用於引入用戶自定義指令的標籤體
</body>
< /html>
< /#macro>
上面的代碼將一個HTML頁面模板定義成一個page指令,則能夠在其餘頁面中如此page指令:
< #import "/common.ftl" as com> //假設上面的模板頁面名爲common.ftl,導入頁面
<@com.page title="book list">
< u1>
< li>spring</li>
< li>j2ee</li>
< /ul>
< /@com.page> htm
從上面的例子能夠看出,使用macro和nested指令能夠很是容易地實現頁面裝飾效果,此外,還能夠在使用nested指令時,指定一個或多個循環變量,看以下代碼:
< #macro book>
< #nested 1> //使用book指令時指定了一個循環變量值
<#nested 2>
< /#macro>
< @book ;x> ${x} .圖書</@book>
當使用nested指令傳入變量值時,在使用該自定義指令時,就須要使用一個佔位符(如book指令後的;x).上面的代碼輸出文本以下:
1 .圖書 2 .圖書it
return指令用於結束macro指令,一旦在macro指令中執行了return指令,則FreeMarker不會繼續處理macro指令裏的內容,看以下代碼:
< #macro book>
spring
< #return>
j2ee
< /#macro>
< @book />
上面的代碼輸出:spring,而j2ee位於return指令以後,不會輸出.模板