freemarker(三) 宏

作者: 搁浅的双鱼 | 来源:发表于2016-06-20 15:21 被阅读1996次

    what

    宏是在模板中使用macro指令定义

    宏是和某个变量关联的模板片断,以便在模板中通过用户定义指令使用该变量,

    why

    有人说用freemarker,但没有用到它的宏(macro),就=没有真正用过freemarker。说的就是宏是freemarker的一大特色。

    how

    注意点:调用宏时,与使用FreeMarker的其他指令类似,只是使用@替代FTL标记中的#。

    1.macro定义模板,然后调用直接显示

    <#macro greet> 
    <font size="+2">Hello World!</font> 
    </#macro> 
    

    使用:<@greet>/@greet 或 <@greet/>

    结果:<font size="+2">Hello World!</font>

    2.在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>

    3.macro 定义多个参数

    macro可以有多个参数,参数的次序是无关的,在macro指令中只能使用定义的参数,并且必须对所有参数赋值,可以在定义参数时指定缺省值:

    <#macro greet person color="black"> 
    <font size="+2" color="${color}">Hello ${person}!</font> 
    </#macro> 
    

    4.自定义指令嵌套内容 <#nested>

    <#macro border> 
    <table border=4 cellspacing=0 cellpadding=4><tr><td> 
    <#nested> 
    </td></tr></table> 
    </#macro> 
    

    使用:<@border>The bordered text/@border

    结果:

    <table border=4 cellspacing=0 cellpadding=4> 
    <tr><td>The bordered text 
    </td></tr></table> 
    

    ps:<#nested>就相当于占位符

    <#nested>指令可以被多次调用:

    <#macro do_thrice> 
        <#nested> 
        <#nested> 
        <#nested> 
    </#macro> 
    

    使用:
    <@do_thrice>Anything.</@do_thrice>

    结果:
    Anything.
    Anything.
    Anything.
    ps:<@do_thrice>中的内容就是嵌套内容

    5.局部变量对嵌套内容不可见

    <#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: ? ? ?
      ps:其中嵌套内容中的y,x,count都是没定义的,所以取不到值

    6.宏定义中使用循环变量

    nested指令也可以有循环变量(循环变量的含义见下节),调用宏的时候在宏指令的参数后面,分号隔开依次列出循环变量的名字,格式如下:

    <@ macro_name paramter list; loop variable list[,]>

    eg:

    <#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> 
    

    ps:count是宏的参数,c,halfc,last则为循环变量,
    输出结果为:

    • 1, 0.5
    • 2, 1
    • 3, 1.5
    • 4, 2 Last!

    引用

    循环变量和宏标记指定的不同不会有问题,如果调用时少指定了循环变量,那么多余的值不可见。调用时多指定了循环变量,多余的循环变量不会被创建:

    <@repeat count=4 ; c, halfc, last> 
        ${c}. ${halfc}<#if last> Last!</#if> 
    </@repeat> 
    
    <@repeat count=4 ; c, halfc> 
        ${c}. ${halfc} 
    </@repeat> 
    
    <@repeat count=4> 
        Just repeat it... 
    </@repeat>
    

    相关文章

      网友评论

      • 36260b3aa487:我想请教一个问题,java自定义的标签,有nested这个东西吗?如果有,怎么用?
      • 搁浅的双鱼:第六个 宏定义中使用循环变量 有谁看懂了么 我这个不是很懂,贴过来 大家一起讨论讨论
        ada8c183ab8c:@搁浅的双鱼
        c, halfc, last这三个变量分别是<#nested x, x/2, x==count> 标签里定义的3个,对号入座就可以了

      本文标题:freemarker(三) 宏

      本文链接:https://www.haomeiwen.com/subject/svmwdttx.html