<#macro greet>   <font size="+2">Hello Joe!</font> </#macro>    
<#macro greet person>   <font size="+2">Hello ${person}!</font></#macro>   
<@greet person="Fred"/> and <@greet person="Batman"/>   
  <font size="+2">Hello Fred!</font>  and   <font size="+2">Hello Batman!</font>      
<#macro greet person color>   <font size="+2" color="${color}">Hello ${person}!</font></#macro>   
<@greet person="Fred" color="black"/>   
<@greet color="black" person="Fred"/>  
<@greet person="Fred" color="black" background="green"/> <@greet person="Fred"/>  
<#macro greet person color="black">   <font size="+2" color="${color}">Hello ${person}!</font></#macro>    
<#macro border>   <table border=4 cellspacing=0 cellpadding=4><tr><td>     <#nested>   </tr></td></table> </#macro>    
<@border>The bordered text</@border>  
  <table border=4 cellspacing=0 cellpadding=4><tr><td>     The bordered text   </tr></td></table>     
<#macro do_thrice>   <#nested>   <#nested>   <#nested> </#macro> <@do_thrice>   Anything. </@do_thrice>    
  Anything.   Anything.   Anything.   
<@border>   <ul>   <@do_thrice>     <li><@greet person="Joe"/>   </@do_thrice>   </ul> </@border>   
  <table border=4 cellspacing=0 cellpadding=4><tr><td>       <ul>     <li><font size="+2">Hello Joe!</font>       <li><font size="+2">Hello Joe!</font>       <li><font size="+2">Hello Joe!</font>     </ul>     </tr></td></table>    
<#macro repeat count>   <#local y = "test">   <#list 1..count as x>     ${y} ${count}/${x}: <#nested>  </#list> </#macro> <@repeat count=3>${y?default("?")} ${x?default("?")} ${count?default("?")}</@repeat> 
    test 3/1: ? ? ?     test 3/2: ? ? ?     test 3/3: ? ? ?  
<#macro repeat count>   <#list 1..count as x>     <#nested x, x/2, x==count>   </#list> </#macro> <@repeat count=4 ; c, halfc, last>   ${c}. ${halfc}<#if last> Last!</#if></@repeat>    
  1. 0.5   2. 1   3. 1.5   4. 2 Last!     
(2)在模板中定义变量 
l         在模板中定义的变量有三种类型: 
Ø         plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换 
Ø         局部变量:在宏定义体中有效,使用local指令创建和替换 
Ø         循环变量:只能存在于指令的嵌套内容,由指令(如list)自动创建;宏的参数是局部变量,而不是循环变量 
l         局部变量隐藏(而不是覆盖)同名的plain变量;循环变量隐藏同名的局部变量和plain变量,下面是一个例子: 
<#assign x = "plain"> 1. ${x}  <#-- we see the plain var. here --><@test/> 6. ${x}  <#-- the value of plain var. was not changed --><#list ["loop"] as x>     7. ${x}  <#-- now the loop var. hides the plain var. -->    <#assign x = "plain2"> <#-- replace the plain var, hiding does not mater here -->     8. ${x}  <#-- it still hides the plain var. --></#list> 9. ${x}  <#-- the new value of plain var. -->  <#macro test>   2. ${x}  <#-- we still see the plain var. here -->  <#local x = "local">   3. ${x}  <#-- now the local var. hides it -->  <#list ["loop"] as x>     4. ${x}  <#-- now the loop var. hides the local var. -->  </#list>   5. ${x}  <#-- now we see the local var. again --></#macro>    
1. plain   2. plain   3. local     4. loop   5. local 6. plain     7. loop     8. loop 9. plain2    
l         内部循环变量隐藏同名的外部循环变量,如: 
<#list ["loop 1"] as x>   ${x}  <#list ["loop 2"] as x>     ${x}    <#list ["loop 3"] as x>       ${x}    </#list>     ${x}  </#list>   ${x}</#list>  
  loop 1     loop 2       loop 3     loop 2   loop 1   
l         模板中的变量会隐藏(而不是覆盖)数据模型中同名变量,如果需要访问数据模型中的同名变量,使用特殊变量global,下面的例子假设数据模型中的user的值是Big Joe: 
<#assign user = "Joe Hider"> ${user}          <#-- prints: Joe Hider -->${.globals.user} <#-- prints: Big Joe -->   
(3)名字空间 
l         通常情况,只使用一个名字空间,称为主名字空间 
l         为了创建可重用的宏、变换器或其它变量的集合(通常称库),必须使用多名字空间,其目的是防止同名冲突 
l         创建库 
Ø         下面是一个创建库的例子(假设保存在lib/my_test.ftl中): 
<#macro copyright date>   <p>Copyright (C) ${date} Julia Smith. All rights reserved.  <br>Email: ${mail}</p></#macro>   <#assign mail = "[email protected]">   
Ø         使用import指令导入库到模板中,Freemarker会为导入的库创建新的名字空间,并可以通过import指令中指定的散列变量访问库中的变量: 
<#import "/lib/my_test.ftl" as my> <#assign mail="[email protected]"> <@my.copyright date="1999-2002"/> ${my.mail}${mail}   
输出结果: 
可以看到例子中使用的两个同名变量并没有冲突,因为它们位于不同的名字空间 
l         可以使用assign指令在导入的名字空间中创建或替代变量,下面是一个例子: 
<#import "/lib/my_test.ftl" as my> ${my.mail}<#assign mail="[email protected]" in my> ${my.mail}   
l         输出结果: 
l         数据模型中的变量任何地方都可见,也包括不同的名字空间,下面是修改的库: 
<#macro copyright date>   <p>Copyright (C) ${date} ${user}. All rights reserved.</p></#macro> <#assign mail = "${user}@acme.com">    
l         假设数据模型中的user变量的值是Fred,则下面的代码: 
<#import "/lib/my_test.ftl" as my> <@my.copyright date="1999-2002"/> ${my.mail}    
l         输出结果: 
  <p>Copyright (C) 1999-2002 Fred. All rights reserved.</p> Fred@acme.com     
 
  |