macro , nested , return指令

macro可以用于实现自定义指令,通过使用自定义指令,可以将一段模板片段定义成一个用户指令,使用macro指令的语法格式如下:
< #macro name param1 param2 ... paramN>
...
< #nested loopvar1, loopvar2, ..., loopvarN>
...
< #return>
...
< /#macro>
在上面的格式片段中,包含了如下几个部分:
name:name属性指定的是该自定义指令的名字,使用自定义指令时可以传入多个参数
paramX:该属性就是指定使用自定义指令时报参数,使用该自定义指令时,必须为这些参数传入值
nested指令:nested标签输出使用自定义指令时的中间部分
nested指令中的循环变量:这此循环变量将由macro定义部分指定,传给使用标签的模板
return指令:该指令可用于随时结束该自定义指令.

看如下的例子:
< #macro book>   //定义一个自定义指令
j2ee
< /#macro>
< @book />    //使用刚才定义的指令
上面的代码输出结果为:j2ee

在上面的代码中,可能很难看出自定义标签的用处,因为我们定义的book指令所包含的内容非常简单,实际上,自定义标签可包含非常多的内容,从而可以实现更好的代码复用.此外,还可以在定义自定义指令时,为自定义指令指定参数,看如下代码:
< #macro book booklist>     //定义一个自定义指令booklist是参数
<#list booklist as book>
   ${book}
< /#list>
< /#macro>
< @book booklist=["spring","j2ee"] />   //使用刚刚定义的指令
上面的代码为book指令传入了一个参数值,上面的代码的输出结果为:spring j2ee

不仅如此,还可以在自定义指令时使用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>

从上面的例子可以看出,使用macro和nested指令可以非常容易地实现页面装饰效果,此外,还可以在使用nested指令时,指定一个或多个循环变量,看如下代码:
< #macro book>
< #nested 1>      //使用book指令时指定了一个循环变量值
<#nested 2>
< /#macro>
< @book ;x> ${x} .图书</@book>
当使用nested指令传入变量值时,在使用该自定义指令时,就需要使用一个占位符(如book指令后的;x).上面的代码输出文本如下:
1 .图书    2 .图书

return指令用于结束macro指令,一旦在macro指令中执行了return指令,则FreeMarker不会继续处理macro指令里的内容,看如下代码:
< #macro book>
spring
< #return>
j2ee
< /#macro>
< @book />
上面的代码输出:spring,而j2ee位于return指令之后,不会输出.

原文地址:https://www.cnblogs.com/zifashaonian10000/p/4218617.html