zoukankan      html  css  js  c++  java
  • 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 文件, 那么访问者在所有页面都会看到版权声明的新内容。

     

  • 相关阅读:
    [转发]深入理解git,从研究git目录开始
    iOS系统网络抓包方法
    charles抓包工具
    iOS多线程中performSelector: 和dispatch_time的不同
    IOS Core Animation Advanced Techniques的学习笔记(五)
    IOS Core Animation Advanced Techniques的学习笔记(四)
    IOS Core Animation Advanced Techniques的学习笔记(三)
    IOS Core Animation Advanced Techniques的学习笔记(二)
    IOS Core Animation Advanced Techniques的学习笔记(一)
    VirtualBox复制CentOS后提示Device eth0 does not seem to be present的解决方法
  • 原文地址:https://www.cnblogs.com/youqc/p/14585099.html
Copyright © 2011-2022 走看看