上面的代码将一个HTML页面模板定义成一个page指令,则可以在其他页面中如此page指令:
<#import \as com> //假设上面的模板页面名为common.ftl,导入页面 <@com.page title=\
从上面的例子可以看出,使用macro和nested指令可以非常容易地实现页面装饰效果,此外,还可以在使用nested指令时,指定一个或多个循环变量,看如下代码: <#macro book>
<#nested 1> //使用book指令时指定了一个循环变量值 <#nested 2> #macro>
<@book ;x> ${x} .图书@book>
当使用nested指令传入变量值时,在使用该自定义指令时,就需要使用一个占位符(如book指令后的;x).上面的代码输出文本如下: 1 .图书 2 .图书
在nested指令中使用循环变量时,可以使用多个循环变量,看如下代码:
<#macro repeat count>
<#list 1..count as x> //使用nested指令时指定了三个循环变量 <#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;
return指令用于结束macro指令,一旦在macro指令中执行了return指令,则FreeMarker不会继续处理macro指令里的内容,看如下代码: <#macro book> spring <#return> j2ee #macro> <@book />
上面的代码输出:spring,而j2ee位于return指令之后,不会输出.
用户定义指令
? 宏和变换器变量是两种不同类型的用户定义指令,它们之间的区别是宏是在模板中使用macro指令定义,而变换器是在模板外由程序定义,这里只介绍宏 ? 基本用法
? 宏是和某个变量关联的模板片断,以便在模板中通过用户定义指令使用该变量,下面是一个例子: <#macro greet> ? 作为用户定义指令使用宏变量时,使用@替代FTL标记中的#
<@greet>@greet> ? 如果没有体内容,也可以使用: <@greet/> ? 参数
? 在macro指令中可以在宏变量之后定义参数,如: <#macro greet person> #macro> ? 可以这样使用这个宏变量:
<@greet person=\/> and <@greet person=\/> 输出结果是:
and ? 宏的参数是FTL表达式,所以下面的代码具有不同的意思: <@greet person=Fred/> ? 这意味着将Fred变量的值传给person参数,该值不仅是字符串,还可以是其它类型,甚至是复杂的表达式 ? 宏可以有多参数,下面是一个例子: <#macro greet person color> #macro> ? 可以这样使用该宏变量:
<@greet person=\? 其中参数的次序是无关的,因此下面是等价的: <@greet color=\? 只能使用在macro指令中定义的参数,并且对所有参数赋值,所以下面的代码是错误的:
<@greet person=\<@greet person=\? 可以在定义参数时指定缺省值,如: <#macro greet person color=\> #macro> ? 这样<@greet person=\就正确了 ? 宏的参数是局部变量,只能在宏定义中有效 ? 嵌套内容
? 用户定义指令可以有嵌套内容,使用<#nested>指令执行指令开始和结束标记之间的模板片断 ? 例子: <#macro border> <#nested> #macro> 这样使用该宏变量: