zoukankan      html  css  js  c++  java
  • freemarker(二)


    模板一览

      最简单的模板是普通的HTML文件(或者是其他任何文本文件--freemarker本身不属于HTML)。当客户端访问页面时,freemarker要发送HTML代码至客户端浏览器端显示。如果想要页面动起来,就要在HTML中放置能被freemarker所解析的特殊部分。

      ${...}:freemarker将会输出真实的值来替换花括号内的表达式,这样的表达式被称为interpolations插值,可以参考第上面示例的内容。

      FTL tags标签(freemarker模板的语言标签):FTL标签和HTML标签有一点相似,但是它们是freemarker的指令而且是不会直接输出出来的东西。这些标签的使用一般以符号#开头。(用户自定义的FTL标签使用@符号来代替#,但这是更高级的主题内容了)

      comments注释:freemarker的注释和HTML的注释相似,但是它用<#--和-->来分隔的。任何介于这两个分隔符(包含分隔符本身)之间内容会被freemarker忽略,就不会输出出来了。

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

      directives 指令:就是所指订的FTL标签。这些指令在HTML的标签(如<table>和</table>)和HTML元素(如table元素)中的关系是相同的。(如果现在你还不能区分它们,那么把“FTL标签”和“指令”看做是同义词即可。)

    指令示例

      尽管FreeMarker有很多指令,作为入门,在快速了解过程中我们仅仅来看三个最为常用的指令。

      1.if指令

        使用if指令可以有条件地跳过模板的一部分,这和程序语言中的if是相似的。假设在第一个示例中,你只想向你的老板Big Joe(而不是其他人)问好,就可以这样做:

    <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,我们尊敬的领导才是if条件中那唯一的user变量值,当它和“Big Joe”相同时才显示出来。那么,当condition的判断结果为false(布尔值)时,在<#if condition>和</if>标签之间的内容将会被略过。

        我们详细来说说condition的使用:==是来判断在它两侧的值相等的操作符,比较的结果是布尔值,true或者false。在==的左侧,是引用变量,我们很熟悉这样的语法,它会被变量的值来替代。右侧是指定的字符串,在模板中的字符串必须放在引号内。

        当price是0的时候,下面的代码将会打印:“Pythons are free today!”

    <#if animals.python.price == 0>
        Pythons are free today!
    </#if>
    

         和前面的示例很相似,字符串被直接指定,但是这里则是数字(0)被直接指定。注意到数字是不用放在引号内的。如果将0放在引号内(“0”),FreeMarker就会将其误判为字符串了。

        当price不是0的时候,下面的代码将会打印:“Pythons are not free today!”

    <#if animals.python.price != 0>
        Pythons are free today!
    </#if>
    

         你也许会猜测了,!=就是不等于。

        你也可以这样来写代码(使用数据模型来描述哈希表变量):

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

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

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

         如果蟒蛇的价格比大象的价格低,将会打印“Python are cheaper than elephonts today.”,否则就会打印“Pythons are not cheaper than elephants today.”

        如果变量本身就是布尔值(true或者false),那么可以直接让其作为if的条件condition:

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

       2.list指令

        当需要用列表来遍历集合的内容时,list指令是非常好用的。例如,如果在模板中用前面示例描述序列的数据类型。

    <p>We have these animals:
    <table border=1>
        <tr><th>Name<th>Price
        <#list animals as being>
        <tr><td>${being.name}<td>${being.price} Euros
        </#list>
    </table>
    

         那么输出结果将会是这样的:

    <p>We have these animals:
    <table border=1>
        <tr><th>Name<th>Price
        <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>标签之间。

      3.include指令

        使用include指令,我们可以在当前的模板中插入其他文件的内容。

        假设要在一些页面中显示版权声明的信息。那么可以创建一个文件夹来单独包含版权声明,之后在需要它的地方插入即可。比方说,我们可以将版权信息单独存放在页面文件copy_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>
    

         输出内容为:

    <html>
    <head>
    <title>Test page</title>
    </head>
    <body>
    <h1>Test page</h1>
    <p>Blah blah...
    <hr>
    <i>
    Copyright (c) 2000 <a href="http://www.acmee.com">Acmee Inc</a>,
    <br>
    All Rights Reserved.
    </i>
    </body>
    </html>
    

       4.联合使用指令

        在页面也可以多次使用指令,而且指令间可以相互嵌套,正如在HTML元素中嵌套使用标签一样。下面的代码会遍历动物集合,用大号字体来打印大型动物的名字。

    <p>We have these animals:
        <table border=1>
            <tr><th>Name<th>Price
                <#list animals as being>
            <tr>
        <td>
        <#if being.size == "large"><font size="+1"></#if>
            ${being.name}
        <#if being.size == "large"></font></#if>
        <td>${being.price} Euros
        </#list>
    </table>
    

         注意到FreeMarker并不解析FTL标签外的文本,插值和注释,当条件不满足时它也会忽略所有嵌套的font标签。

      5.处理不存在的变量

        在实际应用中数据模型经常会有可选的变量(也就是说有时可能不存在实际值)。除了一些典型的人为原因导致失误,FreeMarker不能容忍引用不存在的变量,除非明确地告诉它当变量不存在时如何处理。这里介绍两种典型的处理方法。

        这部分对程序员而言:一个不存在的变量和一个是null的变量,对于FreeMarker来说是一样的,所以这里所指的丢失包含这两种情况。

        不论在哪里引用变量,都可以指定一个默认值来避免变量丢失这种情况,通过在变量名后面跟一个!和默认值。就像下面的例子,当user从数据模型中丢失时,模板将会将user的值表示为字符串“Anonymous”。(若user并没有丢失,那么模板就会表现出“Anonymous”不存在一样):

    <h1>Welcome ${user!"Anonymous"}!</h1>
    

         当然也可以在变量名后面通过放置??来询问FreeMarker一个变量是否存在。将它和if指令合并,那么如果user变量不存在的话将会忽略整个问候代码段:

    <#if user??><h1>Welcome ${user}!</h1></#if>
    

         关于多级访问的变量,比如animal.python.price,书写代码:animal.python.price!0,仅当animal.python存在而仅仅最后一个子变量price可能不存在(这种情况下我们假设价格是0)。如果animals或者python不存在,那么模板处理过程将会以“未定义的变量”错误而停止。为了防止这种情况发生,可以这样来书写代码(animals.python.price)!0。这种情况下当animals或Python不存在时表达式的结果仍然是0。对于??也是同样用来的处理这种逻辑的:animals.python.price??对比(animals.python.price)??来看。

      

  • 相关阅读:
    猜数游戏
    计算数组长度
    python 将IP地址转换成打包后的32位格式
    nutch-2.2.1 hadoop-1.2.1 hbase-0.92.1 集群部署
    Julien Nioche谈Apache Nutch 2的特性及产品路线图
    一次心惊肉跳的服务器误删文件的恢复过程
    Http长连接200万尝试及调优
    zookeeper 系列
    Enhancing the Scalability of Memcached
    linux杂谈(十八):DNS服务器的配置(一)
  • 原文地址:https://www.cnblogs.com/xiaonanman/p/7252042.html
Copyright © 2011-2022 走看看