1.1定义自己的指令
1.1.1基础知识
宏是一个模板片段与变量相关联。你可以使用定义的指令,可以帮助你多次使用
<#macro greet>
<font size=’+2’>HelloW Joe!</font>
</#macro>
上面这个macro不会打印任何东西,它只是创建一个宏变量。这里有个变量叫greet,在<#macro greet>和</#macro>之间叫宏定义体.,里面将仅当你使用的参数。如果你要使用这样一个macro,可以这样
<@greet></@greet>
这个时候才真正使用这个macro,将会打印一句话
macro可以执行很多东西,你可以在它里面使用插值和FTL tags
1.1.2参数
在macro中定义参数要放在macro变量后面,如:
<#macro greet person>
<font size=’+2’>Hello ${person}</font>
</#macro>
在使用的时候:
<@greet person=’Fred’/> and <@greet person=’Batman’/>
就会打印两条数据分别为 Hello Fred! 和Hello Batman,参数person众所我们所传进去的.
在使用参数的时候要注意下面两点:
1、 使用的参数一定要事先定义;
2、 定义的参数在使用的时候一定要进行赋值,除非在创建macro的时候给参数默认值;
3、 参数所能赋予的值不一定是字符串,也可以是其他类型,还可以是一个预运算表达式
4、 在使用的时候,对参数赋值顺序不确定,可随意
5、 参数是局部变量,只能在宏定义中有效
如果不满足上面任何一个,程序就会出错。
1.1.3嵌套内容
在macro定义题中您可以嵌套内容,如:
<#macro border>
<table border=4>
<tr><td><#nested></td></tr>
</table>
</#macro>
在使用的时候可以在开始标记和结束标记中填充内容:
<@border>Hellow World</@border>
这样就会输出以及Hellow World,使用<#nested>可以嵌套指令可以在宏定义体中多次调用。
如果你使用了一个定义体中没有<#nested>嵌套指令的宏,而开始标记和结束标记中嵌套的又有内容,FreeMarker不会出现任何错误,但内容不会输出.
宏的局部变量并不满足可见嵌套:
<#macro repeat count>
<#local y = ‘test’>
<#list 1.. count as x>
${y} ${count}/${x}:<#nested>
</#list>
</#macro>
<@repeat count=3>${y!’?’} ${x!’?’} ${count!’?’}</@repeat>
上面将输出:
test 3/1: ? ? ?
test 3/2: ? ? ?
test 3/3: ? ? ?
可以看到y、x和count都是局部变量,不能宏的嵌套内容中调用,只能作用域单一一个宏,这样可以避免混乱.
1.1.4宏(macro)与循环变量
<#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>
循环变量:
循环变量是由像list这样的指令自己创建,它的作用范围只是他们的开始标记和结束标记之间。如果在一宏中,存在一个循环变量,并且循环变量的名字和宏的某参数相同,待循环结束之后并不会影响该宏参数的值。
<#assign x =”plain”>
${x}
<@test/>
<#list [“loop” as x]>
<#assign x = “plain2”>
</#list>
${x}
<#macro test>
${x}
<#local x=”local”>
<#lsit [”loop”] as x>
${x}
</#list>
${x}
</#macro>