1、数据类型:html
四种基本类型:String、Number、Boolean、Date。直接指定值能够是字符串、数值、布尔值、集合及Map对象spring
1. 字符串
直接指定字符串值使用单引号或双引号限定。字符串中可使用转义字符”\"。若是字符串内有大量的特殊字符,则能够在引号的前面加上一个字母r,则字符串内的全部字符都将直接输出。
2. 数值
数值能够直接输入,不须要引号。FreeMarker不支持科学计数法。
3. 布尔值
直接使用true或false,不使用引号。
4. 集合
集合用中括号包括,集合元素之间用逗号分隔。
使用数字范围也能够表示一个数字集合,如1..5等同于集合[1, 2, 3, 4, 5];一样也能够用5..1来表示[5, 4, 3, 2, 1]。
5. Map对象
Map对象使用花括号包括,Map中的key-value对之间用冒号分隔,多组key-value对之间用逗号分隔。
注意:Map对象的key和value都是表达式,但key必须是字符串。{"name":"green mouse", "price":150} 函数
6. 时间对象测试
root.put("date1", new Date());编码
${date1?string("yyyy-MM-dd HH:mm:ss")}spa
2、控制语句.net
if指令 orm
这是一个典型的分支控制指令,该指令的做用彻底相似于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会将>符号当成标签的结束字符,可能致使程序出错,为了不这种状况,咱们应该在凡是出现这些符号的地方都使用括号。htm
自定义指令(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" />
3、集合操做
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
4、空值处理
FreeMarker的变量必须赋值,不然就会抛出异常。
而对于FreeMarker来讲,null值和不存在的变量是彻底同样的,由于FreeMarker没法理解null值。
FreeMarker提供两个运算符来避免空值:
1. !: 指定缺失变量的默认值;
2. ??:判断变量是否存在。
!运算符有两种用法:variable!或variable!defaultValue。第一种用法不给变量指定默认值,代表默认值是空字符串、长度为0的集合、或长度为0的Map对象。
使用variable!defaultValue运算符指定默认值并不要求默认值的类型和变量类型相同。
测试空值处理:
<#-- ${sss} 没有定义这个变量,会报异常! -->
${sss!} <#--没有定义这个变量,默认值是空字符串! -->
${sss!"abc"} <#--没有定义这个变量,默认值是字符串abc! -->
5、命名空间_宏指令
当运行 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
6、字符串操做
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” -->
7、内置函数
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>