FreeMarker 的常用指令介绍

jopen 9年前

一、数据类型:

四种基本类型:String、Number、Boolean、Date。直接指定值可以是字符串、数值、布尔值、集合及Map对象

1. 字符串
直接指定字符串值使用单引号或双引号限定。字符串中可以使用转义字符”\"。如果字符串内有大量的特殊字符,则可以在引号的前面加上一个字母r,则字符串内的所有字符都将直接输出。
2. 数值
数值可以直接输入,不需要引号。FreeMarker不支持科学计数法。
3. 布尔值
直接使用truefalse,不使用引号。
4. 集合
集合用中括号包括,集合元素之间用逗号分隔。
使用数字范围也可以表示一个数字集合,如1..5等同于集合[1, 2, 3, 4, 5];同样也可以用5..1来表示[5, 4, 3, 2, 1]
5. Map对象
Map对象使用花括号包括,Map中的key-value对之间用冒号分隔,多组key-value对之间用逗号分隔。
注意:Map对象的keyvalue都是表达式,但key必须是字符串。{"name":"green mouse", "price":150} 

6. 时间对象

root.put("date1", new Date());

${date1?string("yyyy-MM-dd HH:mm:ss")}

二、控制语句

 if指令 

这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: 
<#if condition>... 
    <#elseif condition>... 
    <#elseif condition>... 
  <#else> ... 
</#if> 

例子如下: 
<#assign age=23> 
<#if (age>60)>老年人 
        <#elseif (age>40)>中年人 
        <#elseif (age>20)>青年人 
    <#else> 少年人 
</#if> 
输出结果是:青年人 
上面的代码中的逻辑表达式用括号括起来主要是因为里面有“>”符号,由于FreeMarker会将>符号当成标签的结束字符,可能导致程序出错,为了避免这种情况,我们应该在凡是出现这些符号的地方都使用括号。

自定义指令(macro指令)

<#macro m1>   <#--定义指令m1 -->

<b>aaabbbccc</b>

<b>dddeeefff</b>

</#macro>

<@m1 /><@m1 />  <#--调用上面的宏指令 -->

输出:aaabbbccc

         dddeeefff

定义带参的宏指令:

<#macro m2 a b c >

${a}--${b}--${c}

</#macro>

<@m2 a="老高" b="老张" c="老马" />

nested指令:

<#macro border> 

  <table border=4 cellspacing=0 cellpadding=4><tr><td> 

    <#nested> 

  </td></tr></table> 

</#macro>

<@border >表格中的内容!</@border>

include指令:

<#include "included.txt" />

三、集合操作

list, break 

语法 
<#list  sequence  as item > 
... 
<#if item = "spring"><#break></#if> 
... 
</#list> 

关键字 
item_index: 是list当前值的下标 
item_has_next: 判断list是否还有值 

用例 
<#assign seq = ["winter", "spring", "summer", "autumn"]> 
<#list seq as x> 
  ${x_index + 1}. ${x}<#if x_has_next>,</#if> 

</#list> 

输出 
  1. winter, 
  2. spring, 
  3. summer, 
  4. autumn  

四、空值处理

FreeMarker的变量必须赋值,否则就会抛出异常。

而对于FreeMarker来说,null值和不存在的变量是完全一样的,因为FreeMarker无法理解null值。

FreeMarker提供两个运算符来避免空值:

1. !: 指定缺失变量的默认值;

2. ??:判断变量是否存在。

!运算符有两种用法:variable!或variable!defaultValue。第一种用法不给变量指定默认值,表明默认值是空字符串、长度为0的集合、或长度为0的Map对象。

使用variable!defaultValue运算符指定默认值并不要求默认值的类型和变量类型相同。

测试空值处理:

<#-- ${sss} 没有定义这个变量,会报异常! -->

${sss!} <#--没有定义这个变量,默认值是空字符串! -->

${sss!"abc"} <#--没有定义这个变量,默认值是字符串abc! -->

五、命名空间_宏指令

当运行 FTL 模板时,就会有使用 assign 和 macro 指令创建的变量的集合(可能是空的),可以从前一章节来看如何使用它们。像这样的变量集合被称为 namespace 命名空间。在简单的情况下可以只使用一个命名空间,称之为 main namespace 主命名空间。因为通常只使用本页上的命名空间,所以就没有意识到这点。 

    如果想创建可以重复使用的宏,函数和其他变量的集合,通常用术语来说就是引用

library 库。使用多个命名空间是必然的。只要考虑你在一些项目中,或者想和他人共享使用的时候,你是否有一个很大的宏的集合。但要确保库中没有宏(或其他变量)名和数据模型中变量同名,而且也不能和模板中引用其他库中的变量同名。通常来说,变量因为名称冲突也会相互冲突。所以要为每个库中的变量使用不同的命名空间。

定义b.ftl文件:

<#macro copyright date>

  <p>Copyright (C) ${date} 中国人民.</p> 

</#macro> 

<#assign mail = "zgrm@163.com">

在a.ftl文件中引入b.ftl,从而可以使用b.ftl中定义的宏和变量:

测试命名空间:

<#import "b.ftl" as bb  />

<@bb.copyright date="2010-2011" />

${bb.mail}

<#assign mail="my@163.com"  />

${mail}

<#assign mail="my@163.com" in bb  />

${bb.mail}

执行后,控制台打印:

测试命名空间:

  <p>Copyright (C) 2010-2011 中国人民.</p> 

zgrm@163.com

my@163.com

my@163.com

六、字符串操作

1. 字符串连接
字符串连接有两种语法:
1 使用${..}#{..}在字符串常量内插入表达式的值;
(2) 
直接使用连接运算符“+”连接字符串。
如,下面两种写法等效:
              ${"Hello, ${user}"}                                                                                                               
              ${"Hello, " + user + "!"}                                                                                                        
有一点需要注意: ${..}只能用于文本部分作为插值输出,而不能用于比较等其他用途,如:
              <#if ${isBig}>Wow!</#if>                                                                                                               
              <#if "${isBig}">Wow!</#if>                                                                                                             
应该写成:
              <#if isBig>Wow!</#if>                                                                                                                    

2.
截取子串
截取子串可以根据字符串的索引来进行,如果指定一个索引值,则取得字符串该索引处的字符;如果指定两个索引值,则截取两个索引中间的字符串子串。如:
              <#assign number="01234">
              ${number[0]} <#--
输出字符0 -->
              ${number[0..3]} <#--
输出子串“0123” -->

七、内置函数

FreeMarker提供了一些内建函数来转换输出,可以在任何变量后紧跟?。?后紧跟内建函数,就可以通过内建函数来转换输出变量。

字符串相关常用的内建函数:

1. html: 对字符串进行HTML编码;

2. cap_first: 使字符串第一个字母大写;

3. lower_case: 将字符串转成小写;

4. upper_case: 将字符串转成大写;

集合相关常用的内建函数:

1. size: 获得集合中元素的个数;

数字值相关常用的内建函数:

1. int: 取得数字的整数部分。

举例:

root.put("htm2", "<b>粗体</b>");

内建函数:

${htm2?html}

输出:<b>粗体</b>