《freemarker学习笔记(一)入门》

转载至:http://freemarker.foofun.cn/dgui_quickstart_template.html,手写的可能会有些错误的地方,建议大家去看原文。

一、入门

${…}:Freemarker将会输出真实的值来替换大括号内的表达式,这样的表达式被称为interpolation(插值)。
FTL标签(Freemarker Template Lanage):与HTML标签有一些相似之处,但是他们是FreeMarker的标签,是不会输出中打印的,这西恩标签名以#开头。(用户自定义的FTL标签则需要使用@来代替#,但这属于更高级的话题了)。
注释:注释和HTML的注释很相似,但是它们使用<#-- and --> 来标识。并且FreeMarker的注释不会出现在输出中(不会出现在访问者的页面中),因为FreeMarker会跳过他们。

其他任何不适FTL标签,插值或注释的内容将被视为静态文本,这些东西不会被FreeMarker所解析,会按照原样输出出来。
FTL标签页被称为指令。这些指令在HTML的标签(比如:

)和HTML元素(比如:table元素)中的关系是相同的。(如果现在还没感觉它们的不同,那么把"FTL标签"和“指令”看做是同义词即可)
1、基本标签
<#if ${a} == 0>
a等于0;
</#if>
如果a = 0,那么在页面上将会输出a等于0;

<#if ${a} == 0>
a等于0;
<#else>
a不等于0;
</#if>
如果a=0,页面输入a等于0,否则页面输出a不等于0。

<#if ${a == 0}>
a等于0;
<elseif ${a == 1}>
a等于1;
<#else>
a不等于0,也不等于1;
</#if>
以此类推,与java的条件语句类似。

2、list标签
当需要列表显示内容时,list标签是必须的。模板与输出对应如下。
TEMPLATE

We have these animals:

<#list animals as animal>
${animal.name}${animal.price} Euros

OUTPUT

We have these animals:

mouse50 Euros
elephant5000 Euros
python4999 Euros

list标签的一般格式为:<#list sequence as loopVariable> repeatThis</#list>
repeatThis部分将会在给定的sequence遍历时取出对应的值。在所有遍历中,loopVariable将持有当前遍历项的值。这个变量仅存在于<#list …>和<#list>标签内。

sequence可以是任意的表达式,比如我们可以列表显示示例数据模型中的水沟,就像这样:
TEMPLATE

  • <#list misc.fruits as fruit>
  • ${fruit}

上面示例中的一个问题是如果我们有0个水果,它仍然会输出一个空的

    ,而不是上面都没有。要避免这样的情况,可以这么来使用list:
    TEMPLATE
    <#list misc.fruit>

    • <#items as fruit>
    • ${fruit}

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

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

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

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

    所有这些标签(list, items, sep, else)可以联合起来使用:
    TEMPLATE
    <#list misc.fruits>

    Fruits:

    • <#items as fruit>
    • ${fruit}<#sep> and

    3、include标签
    使用include标签,我们可以再模板中插入其他文件的内容。

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


    Copyright (c) 2000 Acmee Inc,
    All Rights Reserved.

    当需要用到这个文件时,可以使用标签来插入:
    TEMPLATE

    Test page

    Test page

    Blah blah... <#include "/copyright_footer.html">

    此时,输出的内容为:
    OUTPUT

    Test page

    Test page

    Blah blah...


    Copyright (c) 2000 Acmee Inc,
    All Rights Reserved.

    当修改了copyright_footer.html文件,那么访问者在所有页面都会看到版权声明的新内容。 i NOTE 重用代码片段的一个更有力的方式是使用宏,但是只是更为高级的话题了, 将会在 后续讨论。

    使用联合标签

    在页面上也可以多次使用便签,而且标签之间也可以很容易的相互嵌套,比如在list指令中嵌套if指令:
    TEMPLATE
    <#list animals as animal>
    <div<#if animal.protected> class=“protected”</#if>>
    ${animal.name} for ${animal.price} Euros

    </#list>
    请注意,FreeMarker并不解析FTL便签以外的文本、插值和注释,上面示例在HTML属性中使用FTL标签页不会又问题。

    使用内建函数

    内建函数很像子变量(如果了解java术语的话,也可以说像方法),它们并不是数据模型中的东西,是FreeMarker在数值上添加的。为了清晰子变量是哪部分,使用?问好代替.点来访问它们。常用内建函数的示例:
    user?html 给出 user 的HTML转义版本, 比如 & 会由 & 来代替。
    user?upper_case 给出 user 值的大写版本 (比如 “JOHN DOE” 来替代 “John Doe”)
    animal.name?cap_first 给出 animal.name 的首字母大写版本(比如 “Mouse” 来替代 “mouse”)
    user?length 给出 user 值中 字符的数量(对于 “John Doe” 来说就是8)
    animals?size 给出 animals 序列中 项目 的个数(我们示例数据模型中是3个)
    如果在 <#list animals as animal> 和对应的 </#list> 标签中:
    animal?index 给出了在 animals 中基于0开始的 animal的索引值
    animal?counter 也像 index, 但是给出的是基于1的索引值
    animal?item_parity 基于当前计数的奇偶性,给出字符串 “odd” 或 “even”。在给不同行着色时非常有用,比如在 中。
    一些内建函数需要参数来指定行为,比如:
    animal.protected?string(“Y”, “N”) 基于 animal.protected 的布尔值来返回字符串 “Y” 或 “N”。
    animal?item_cycle(‘lightRow’,‘darkRow’) 是之前介绍的 item_parity 更为常用的变体形式。
    fruits?join(", ") 通过连接所有项,将列表转换为字符串, 在每个项之间插入参数分隔符(比如 “orange,banana”)
    user?starts_with(“J”) 根据 user 的首字母是否是 “J” 返回布尔值true或false。
    内建函数应用可以链式操作,比如user?upper_case?html 会先转换用户名到大写形式,之后再进行HTML转义。(这就像可以链式使用 .(点)一样)。

    处理不存在的变量

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

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

    不论在哪里引用变量,都可以指定一个默认值来避免变量丢失这种情况,通过在变量名后面跟着一个!(叹号)和默认值。就像下面的这个例子,当user不存在于数据模型时,模板将会将user的值标识为字符串"visitor"。(当user存在时,模板就会变现出${user}的值):
    TEMPLATE

    Welcome ${user!"visitor"}!

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

    Welcome ${user}!

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值