一、认识FreeMarker
FreeMarker是一款模板引擎:一种基于模板的、用来生成输出文本的通用工具。类似模板引擎还有Velocity,Common Template等。
对于java web开发来说,使用FreeMarker模板,可以将java代码从页面中分离出来。开发人员只需关注业务逻辑代码,而由页面设计人员去设计显示效果,两类人员各司其职,发挥其擅长的一面。
FreeMarker注释:类似HTML的注释,用<#--和-->来分隔的。任何介于这两个分隔符(包含分隔符本身)之间的内容会被FreeMarker忽略,不会执行或输出。
二、常用指令
if指令
if指令进行条件输出控制,类似程序语言中的if语句。
格式:
<#if condition>content</#if> <#if condition>content<#else>other content</#if>
示例:
<#if username == "boss">Hi boss!</#if> <#if username == "boss">Hi boss!<#else>Hi!</#if>
说明:上例意思是如果变量username值为"boss",输出Hi boss!,否则输出Hi!。
==是来判断在它两侧的值相等的操作符,比较的结果是布尔值,true 或者false。在==的左侧,是引用的变量,右侧是指定的字符串。
注意:右侧字面量可以是字符串或数字,如果是字符串,要用引号(单,双引号都行)括起来,并且==左右两边类型要一致,否则出报错。
list指令
list指令用来遍历集合中的内容。
格式:
<#list vars as var> repeat content </#list>
示例:
<#list ["星期一", "星期二", "星期三"] as day> ${day} </#list>
说明:上例输出三行,每行依次输出星期一、星期二、星期三。
集合中元素可以是简单的字符串,如上例,也可以是复杂对象
include指令
使用include指令,我们可以在当前的模板中插入其他文件的内容。
格式:
<#include "filepath">
示例:
<#include "/copyright_footer.html">
说明:
被包含进来的文件,既可以是静态页,也可以是动态页(即ftl模板)。include指令会先将该文件内容包含进当前模板,然后再跟数据模型结合输出。
处理未定义变量或值为null
当变量未定义时,或值为null时,默认设置下FreeMarker会报错。下面有两种处理方式
1.设置默认值
格式:
${varname!default_value}
示例:
${user!"visitor"} ${apple.price!0}
说明:对于多级访问的变量,比如animals.python.price,书写代码:${animals.python.price!0},当animals或者python不存在,那么模板处理过程将会以“未定义的变量”错误而停止。为了防止这种情况的发生,可以这样来书写代码${(animals.python.price)!0}。这种情况下当animals或python不存在时表达式的结果仍然是0。
2.加if判断
格式:
<#if varname??>content</#if> <#if varname?exists>content</#if>
示例:
<#if user??>Hi,${user}</#if> <#if user?exists>Hi,${user}</#if>
说明:
如果user变量存在,且值不为NULL时,才输出Hi,user变量值。同样对于多级访问的变量,??前面的变量名最好被()包含,原因参照!设置默认值。
3.修改全局配置
classic_compatible=true
直接指定值说明
FreeMarker字面量区别字符串,数字和布尔值,所以字符串”150”和数字150是完全不同的。数字持有的是数字的值,布尔值表达的是逻辑上的对或错(true或false)。字符串可以是任意字符的序列。
常见操作汇总
直接指定值
字符串:"Foo" 或者 ‘Foo‘ 或者 "It‘s \"quoted\"" 或者"C:\raw\string"
数字:123.45
布尔值:true, false
序列:["foo", "bar", 123.45], 1..100
哈希表:{"name":"green mouse", "price":150}
检索变量
顶层变量:user
从哈希表中检索数据:user.name, user[“name”]
从序列中检索:products[5]
特殊变量:.main
字符串操作
插值(或连接):"Hello ${user}!"(或"Free" + "Marker")
获取一个字符:name[0]
序列操作
连接:users + ["guest"]
序列切分:products[10..19] 或 products[5..]
哈希表操作
连接:passwords + {"joe":"secret42"}
算数运算
(x * 1.5 + 10) / 2 - y % 100
比较运算
x == y, x != y, x < y, x > y, x >= y, x <= y, x < y, x > y 等等
逻辑操作
!registered && (firstVisit || fromEurope)
内建函数
name?upper_case
方法调用
repeat("What", 3)
处理不存在的值
指定默认值:name!"unknown" 或name! 多级访问变量(user.name)!"unknown" 或者 (user.name)!
检测不存在的值:name?? ,(user.name)??
数字格式化问题
当数字超过3位的时候,默认输出会自动带上逗号。例如2000,会显示为2,000。还有当小数位数超过3位时,默认只显示小数点后3位。例如1.33213,会显示为1.332;1.33253,会显示为1.333;
如何解决呢?
1> 加?c,即转成字符串,如:${userId?c}
2> 修改配置文件freemarker.properties加上number_format=#
格式化输出
${xx?c} //转成字符串显示
${xx?string.number}//按数字显示
${xx?string.currency}//按贷币格式显示
${xx?string.percent} //按百分比格式显示
去空格
${xx?trim}
格式化日期
${date?string("yyyy-MM-dd HH:mm:ss")}
${date?string("yyyyMMdd")}