zoukankan      html  css  js  c++  java
  • freemarker 自己定义指令

    1 简单介绍

    自己定义指令能够使用 macro 指令来定义,这是模板设计者所关心的内容。

    Java 程序猿若不想在模板中实 现定义指令 ,而是在 Java 语言中实现指令 的定义,这时 能够使用freemarker.template.TemplateDirectiveModel 类来扩展


    2 基本内容

    macro 指令自身不打印不论什么内容,它仅仅是用来创建宏变量,所以就会有一个名为greet 的变量。在 <#macro greet> 和 </#macro> 之间的内容(称为宏定义体)当使用它作为指令时将会被运行。

    <#macro greet>
    <font size="+2">Hello Joe!</font>
    </#macro>
    能够在 FTL 标记中通过 @ 取代 # 来使用自己定义指令。使用变量名作为指令名。

    <@greet></@greet>
    <@greet/>

    3 參数

    宏名称的后面位置是用来定义变量的。

    <#macro greet person>
    <font size="+2">Hello ${person}!</font>
    </#macro>
    那么就能够这样来使用这个宏:
    <@greet person="Fred"/> and <@greet person="Batman"/>
    使用提前定义指令时,參数的值( = 号后边的值)能够是 FTL 表达式。

    这样,不像 HTML, "Fred"和 "Batman" 的引號就能够不用要了。 < @greet person=Fred/> 也意味着使用变量的值 Fred 作为 person 參数,而不是字符串 "Fred" 。

    也能够在 = 号左边使用复杂表达式(比方someParam=(price + 50)*1.25 )。

    能够有多个參数。

    <#macro greet person color>
        <font size="+2" color="${color}">Hello ${person}!</font>
    </#macro>
    宏就能够这样来使用:

    <@greet person="Fred" color="black"/>
    <@greet color="black" person="Fred"/>
    你只能够使用在 macro 指令中定义的參数,同 时 也 必 须 给 出 在 宏 中 定 义 所 有 參 数 的 值 。

    指定默认值:

    <#macro greet person color="black">
    <font size="+2" color="${color}">Hello ${person}!</font>
    </#macro>
    <@greet person="Fred"/> ,由于它和<@greet person="Fred" color="black"/> 是同样的

    如 果 想 给 color 设 置 为 ”red” , 那 么 就 写 成 : <@greet person="Fred" color="red"/>


    someParam=foo 和someParam="${foo}" 是不同的。假设指令须要 someParam是一个数字值,那么就不要用另外一种方式。

    4 嵌套内容

    <#macro border>
       <table border=4 cellspacing=0 cellpadding=4><tr><td>
    <#nested>
       </td></tr></table>
    </#macro>
    <#nested> 指令运行位于開始和结束标记指令之间的模板代码段。假设这样写:

    <@border>The bordered text</@border>
    那么就会输出:
    <table border=4 cellspacing=0 cellpadding=4><tr><td>
    The bordered text
    </td></tr></table>
    nested 指令也能够多次被调用
    <#macro do_thrice>
       <#nested>
       <#nested>
       <#nested>
    </#macro>
    <@do_thrice>
       Anything.
    </@do_thrice>
    就会输出:
    Anything.
    Anything.
    Anything.

    嵌套的内容能够是随意有效的 FTL,包括其它的用户自己定义指令,这样也是对的:
    <@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!"?"} ${x!"?"} ${count!"?"}</@repeat>
    test 3/1: ? ? ?
    test 3/2: ?

    ? ? test 3/3: ? ? ?

    局部变量的设置是为每一个宏自己调用的
    <#macro test foo>${foo} (<#nested>) ${foo}</#macro>
    <@test foo="A"><@test foo="B"><@test foo="C"/></@test></@test>
    A (B (C () C) B) A

    5 宏和循环变量
    循环变量的名字是已经给定的,变量值的设置是由指令本身完毕的。
    <#macro do_thrice>
     <#nested 1>
     <#nested 2>
     <#nested 3>
    </#macro>
    <@do_thrice ; x> <#-- 用户自己定义指令 使用";"取代"as" -->
     ${x} Anything.
    </@do_thrice>
    1 Anything.
    2 Anything.
    3 Anything.
    语法规则是为特
    nested 指令(当然參数能够是随意的表达式)的參数。

    循环变量的名称是在自己定义指令的開始标记( <@...> )的參数后面通过分号确定的。



    能够使用多个循环变量(变量的顺序是非常重要的):

    <#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.
    2.
    3.
    4.
    0.5
    1
    1.5
    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>
    假设在分号后面指定了比 nested 指令还多的变量,那么最后的循环变量将不会被创建(在嵌套内容中不会被定义)。





  • 相关阅读:
    PHP(运算符,语句,函数)
    数据库高级查询
    MySQL数据库常用函数
    mySQL数据库数据查询操作详解
    mySQL数据库设计范式及增删改查操作
    mySQL-创建表
    JavaScript-选项卡
    JavaScript做DIV下拉列表
    JavaScript-事件
    JavaScript函数-递归
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5303043.html
Copyright © 2011-2022 走看看