• freemarker详细教程从入门到精通(三)模板入门与指令


    模板

      最简单的模板通常是普通的HTML文件(或者是其他任何文本文件; FreeMarker本身不属于HTML)。当客户端访问某个页面时, FreeMarker要发送HTML代码至客户端浏览器中去显示。如果想要页面动起来 (这里指动态网页技术,译者注),那么就要在HTML中放置能被FreeMarker所解析的特殊代码片段,实际上用程序语言编写的程序就是模板。 FTL (代表FreeMarker模板语言)。 这是为编写模板设计的非常简单的编程语言。

    • 模板(FTL编程)是由如下部分混合而成的:

      • 文本:文本会照着原样来输出。

      • 插值:这部分的输出会被计算的值来替换。插值由 ${ and } 所分隔(或者 #{ and },这种风格已经不建议再使用了;点击查看更多)。

      • FTL 标签:FTL标签和HTML标签很相似,但是它们却是给FreeMarker的指示, 而且不会打印在输出内容中。

      • 注释:注释和HTML的注释也很相似,但它们是由 <#-- 和 -->来分隔的。注释会被FreeMarker直接忽略, 更不会在输出内容中显示。

    其他任何不是FTL标签,插值或注释的内容将被视为静态文本, 这些东西不会被FreeMarker所解析;会被按照原样输出出来。 

    <html>[BR]
    <head>[BR]
      <title>Welcome!</title>[BR]
    </head>[BR]
    <body>[BR]
      <#-- Greet the user with his/her name -->[BR]
      <h1>Welcome ${user}!</h1>[BR]
      <p>We have these animals:[BR]
      <ul>[BR]
      <#list animals as animal>[BR]
        <li>${animal.name} for ${animal.price} Euros[BR]
      </#list>[BR]
      </ul>[BR]
    </body>[BR]
    </html>
    

      FTL是区分大小写的。 list 是指令的名称而 List 就不是。类似地 ${name} 和 ${Name} 或 ${NAME} 也是不同的。

      请注意非常重要的一点: 插值 仅仅可以在 文本 中使用。FTL 标签 不可以在其他 FTL 标签 和 插值中使用。比如, 这样做是 错误 的: <#if <#include 'foo'>='bar'>...</#if>

      注释 可以放在 FTL 标签 和 插值中。

    指令

      FTL标签也被称为 指令。 这些指令在HTML的标签 (比如: <table> 和 </table>) 和HTML元素 (比如: table 元素) 中的关系是相同的。

      FTL 标签分为两种:

      •     开始标签: <#directivename parameters>

      •     结束标签: </#directivename>

      除了标签以 # 开头外,其他都和HTML,XML的语法很相似。 如果标签没有嵌套内容(在开始标签和结束标签之间的内容),那么可以只使用开始标签。 

      事实上,指令有两种类型: 预定义指令 和 用户自定义指令。 对于用户自定义的指令使用 @ 来代替 #,比如,<@mydirective parameters>...</@mydirective>。 更深的区别在于如果指令没有嵌套内容,那么必须这么使用 <@mydirective parameters />,这和XML语法很相似 (例如 <img ... />)。

    基本指令

    if 指令

        使用 if 指令可以有条件地跳过模板的一些片段。 比如,假设在 上一篇 中, 想向你的老板特别地问好,可其他人不同:

    <html>
    <head>
      <title>Welcome!</title>
    </head>
    <body>
      <h1>
        Welcome ${user}<#if user == "Big Joe">, our beloved leader</#if>!
      </h1>
      <p>Our latest product:
      <a href="${latestProduct.url}">${latestProduct.name}</a>!
    </body>
    </html>
    

      

      此时,告诉 FreeMarker,当和 "Big Joe" 相同时 ", our beloved leader" (我们最尊敬的领导,译者注) 才是if条件中那唯一的 user 变量的值。 通常来讲,如果 condition 是false(布尔值),那么介于 <#if condition> 和 </#if> 标签中的内容会被略过。

    我们来详细说说 condition 的使用: == 是用来判断它两侧的值是否相等的操作符, 比较的结果是布尔值,也就是true或者false。在 == 的左侧,是 被引用的变量, 我们很熟悉这样的语法结构;最终它会被变量的值所替代。通常来说, 在指令或插值中没有被引号标注的内容都被视为变量的引用。右侧则是指定的字符串, 在模板中的字符串 只能 放在引号内。

      

    当价格为0时,就会打印出 "Pythons are free today!":
    <#if animals.python.price == 0>
      Pythons are free today!
    </#if>
    和之前示例中,字符串被直接指定相似, 但这里则是数字(0)被直接指定了。 请注意,这里的数字 没有 放在引号内。 如果将("0")放在引号中, 那么FreeMarker就会将其误判为字符串了
    当价格不为0时,则会打印出"Pythons are not free today!":
    <#if animals.python.price != 0>
      Pythons are not free today!
    </#if>

      使用 <#else> 标签可以指定当条件为false时程序所要执行的内容。比如:

    <#if animals.python.price < animals.elephant.price>
      Pythons are cheaper than elephants today.
    <#else>
      Pythons are not cheaper than elephants today.
    </#if>
    

      也可以使用 elseif 来完善它:

      

    <#if animals.python.price < animals.elephant.price>
      Pythons are cheaper than elephants today.
    <#elseif animals.elephant.price < animals.python.price>
      Elephants are cheaper than pythons today.
    <#else>
      Elephants and pythons cost the same today.
    </#if>
    

      如果变量本身就是布尔值(true/false),则可以直接让其作为 if 的 condition (判断条件,译者注):

    <#if animals.python.protected>
      Pythons are protected animals!
    </#if>
    

      

    list 指令

      

    当需要列表显示内容时,list指令是必须的。
    <table border=1>
      <#list animals as animal>
        <tr><td>${animal.name}<td>${animal.price} Euros
      </#list>
    </table>
    那么输出结果将会是这样的:
    <table border=1>
      <tr><td>mouse<td>50 Euros
      <tr><td>elephant<td>5000 Euros
      <tr><td>python<td>4999 Euros

    </table>

       list 指令的一般格式为: <#list sequence as loopVariable>repeatThis</#list>。 repeatThis 部分将会在给定的 sequence 遍历时在每一项中重复, 从第一项开始,一个接着一个。在所有的重复中, loopVariable 将持有当前遍历项的值。 这个变量仅存在于 <#list ...> 和 </#list> 标签内。sequence 可以是任意表达式。

    比如我们可以列表显示示例数据模型中的水果,就像这样:
    <ul> <#list misc.fruits as fruit> <li>${fruit} </#list> </ul>

    上面示例中的一个问题是如果我们有0个水果,它仍然会输出一个空的 <ul></ul>,而不是什么都没有。 要避免这样的情况,可以这么来使用 list

    <#list misc.fruits> 
      <ul>
        <#items as fruit>
          <li>${fruit}
        </#items>
      </ul>
    </#list>

    此时, list 指令将列表视为一个整体, 在 items 指令中的部分才会为每个水果重复。 如果我们有0个水果,那么在 list 中的所有东西都被略过了, 因此就不会有 ul 标签了。

    另一个列表相关的常见任务是:使用一些分隔符来列出水果,比如逗号:

    <p>Fruits: <#list misc.fruits as fruit>${fruit}<#sep>, </#list>
    <p>Fruits: orange, banana

    被 sep 覆盖的部分(我们也可以这么来写: ...<#sep>, </#sep></#list>) 只有当还有下一项时才会被执行。 因此最后一个水果后面不会有逗号。

    再次回到这个话题,如果我们有0个水果,会怎么样?只是打印 "Fruits:" 也没有什么不方便。 list 指令,也像 if 指令那样,可以有 else 部分,如果列表中有0个元素时就会被执行

    <p>Fruits: <#list misc.fruits as fruit>${fruit}<#sep>, <#else>None</#list>

    include 指令

      使用 include 指令, 我们可以在模板中插入其他文件的内容。假设要在一些页面中显示版权声明的信息。那么可以创建一个文件来单独包含这些版权声明, 之后在需要它的地方插入即可。比方说,我们可以将版权信息单独存放在页面文件 copyright_footer.html 中:

      

    <hr>
    <i>
    Copyright (c) 2000 <a href="http://www.acmee.com">Acmee Inc</a>,
    <br>
    All Rights Reserved.
    </i>
    
    当需要用到这个文件时,可以使用 include 指令来插入:
    
    <html>
    <head>
      <title>Test page</title>
    </head>
    <body>
      <h1>Test page</h1>
      <p>Blah blah...
      <#include "/copyright_footer.html">
    </body>
    </html>
    当修改了 copyright_footer.html 文件, 那么访问者在所有页面都会看到版权声明的新内容。

     

  • 相关阅读:
    七、文件的排序、合并和分割
    六、awk编程
    五、sed命令
    四、grep命令
    三、正则表达式
    二、Linux文件系统和文本编辑器
    一、shell基础知识点
    mysql实现交易编码生成(代替oracle的序列)
    新安装Centos无法访问网络
    uiview 动画
  • 原文地址:https://www.cnblogs.com/youqc/p/14585099.html
Copyright © 2020-2023  润新知