首先说一下FreeMarker中的注释为: <#–这里是注释的内容 –>
if语句
<#-- 判断num1等于18就输出 18一枝花! -->
<#if num1==18>18一枝花!</#if>
<#-- 字符串需要加上双引号 -->
<#if user=="小明">欢迎你</#if>
<#--布尔值 -->
<#if b2>b2是true!</#if>
if else 语句测试:
<#-- 不是使用> 大部分时候,freemarker会把>解释成标签结束(大于可以写 gt )-->
<#if num0 gt 18>
及格!
<#else>
不及格!
</#if>
时间格式化处理
<#-- 将变量datel 时间格式转换成 yyyy-MM-dd HH:mm:ss 格式输出 -->
${date1?string("yyyy-MM-dd HH:mm:ss")}
内建函数:
1. html: 对字符串进行HTML编码;
2. cap_first: 使字符串第一个字母大写;
3. lower_case: 将字符串转成小写;
4. upper_case: 将字符串转成大写;
5. size 获得集合中元素的个数(集合相关常用的内建函数)
6. int: 取得数字的整数部分(数字值相关常用的内建函数)
内建函数的使用: 变量名?内建函数名,
假设后台传入一个htm2的参数,值为 <b>粗体</b>
root.put("htm2", "<b>粗体</b>");
<#--使用内建函数 html 对字符串(htm2变量)进行HTML编码-->
${htm2?html}
空值处理:
${sss} <#--这样写 如果${sss} 没有定义这个变量,会报异常! -->
${sss!} <#--这样写 没有定义这个变量,默认值是空字符串! -->
${sss!"abc"} <#--这样写 没有定义这个变量,默认值是字符串abc! -->
遍历集合
<#-- 遍历 ls , as ys 表示遍历ls时中的每个元素取别名为 ys -->
<#list ls as ys >
<b> ys </b><br/>
</#list>
取普通变量和对象的值:
<#--user 如果是一个普通变量,可以这样取值-->
${user},
<#--user 如果是一个对象,可以这样取该对象中name属性的值-->
${user.uname}
取List集合中的数据
<#-- lst为一个List集合 根据下标索引取对应得值 -->
${lst[0].city},
${lst[1].city},
${lst[2].city},
include包含
<#--将123.txt包含进来,这可以是包含另一个模板文件或者任何类型的文件-->
<#include "123.txt" />
自定义指令
<#--定义一个指令 为 dtest -->
<#macro dtest>
<b>aaa</b>
<b>bbb</b>
</#macro>
<#--调用上面定义的 dtest宏指令 -->
<@dtest/><@dtest />
<#--定义一个指令 为 dtest2 如下 a b c 为参数 -->
<#macro dtest2 a b c >
${a}==${b}==${c}
</#macro>
<#--调用上面定义的 dtest2宏指令,并传人参数 -->
<@dtest2 a="老高" b="老张" c="老马" />
<#--定义一个指令 为 dtest3, <#nested>是获取调用时标签中间传入的内容 -->
<#macro dtest3>
<table border=4 cellspacing=0 cellpadding=4>
<tr>
<td>
<#nested>
</td>
</tr>
</table>
</#macro>
<#--调用上面定义的 dtest3宏指令,标签中间是传入的内容 -->
<@dtest3 >这是要传入的内容!</@dtest3>
测试命名空间及优先级
<#--b.ftl文件内容如下-->
<#macro copyright date>
<p>Copyright (C) ${date} 测试</p>
</#macro>
<#---这里是定义一个mail变量,值为123@163.com -->
<#assign mail = "123@163.com">
<#-- 引入一个b.ftl模板 取别名为bb -->
<#import "b.ftl" as bb />
<#--这里是调用bb模板中的copyright指令 并传入date参数 -->
<@bb.copyright date="2010-2011" />
<#--这里是获取bb模板中的mail变量值 -->
${bb.mail}
<#--在当前模板中又定义一个跟bb模板中一样的变量-->
<#assign mail="234@163.com" />
<#--这样调用的是当前的模板中的mail变量,会输出234@163.com -->
${mail}
<!-- 重新设置bb模板中 mail变量的值 -->
<#assign mail="7654@163.com" in bb />
<#--再次获取bb模板中的mail变量值,输入的是修改后的值,为7654@163.com -->
${bb.mail}
比 较 运 算
= (或者==) 判断两个值是否相等;
!= 判断两个值是否不相等;
注: =和!=可以用作字符串、数值和日期的比较,但两边的数据类型必须相同。
而且FreeMarker的比较是精确比较,不会忽略大小写及空格。
>(或者gt) 大于
>=(或者gte) 大于等于
< (或者lt) 小于
<=(或者lte) 小于等于
注: 上面这些比较运算符可以用于数字和日期,但不能用于字符串。大部分时候,使用gt比>有更好的效果,因为FreeMarker会把>解释成标签的结束字符。可以使用括号来避免这种情况,如:<#if (x>y)>。
逻辑操作:!registered && (firstVisit || fromEurope)
内建函数:name?upper_case
方法调用:repeat("What", 3)
处理不存在的值
name! 或者 (user.name)!
如不存在默认值:name!"unknown" 或者(user.name)!"unknown"
检测不存在的值:name?? 或者(user.name)??
逻辑运算符
&& 逻辑与
|| 逻辑或
! 逻辑非
逻辑运算符只能用于布尔值。
算术运算符
FreeMarker表达式中支持 + - * / % 运算符
数据类型常见示例
直接指定值
字符串 : "Foo"或 者'Foo'或"It's \"quoted\""或r"C:\raw\string"
数字:123.45
布尔值:true, false
序列:["foo", "bar", 123.45] , 1..100
从序列中检索:products[5]
哈希表:{"name":"green mouse", "price":150}
检索变量(如 顶层变量为 user)
从哈希表中检索数据:user.name, user[“name”]
特殊变量:.main
字符串操作
插值(或连接):"Hello ${user}!"(或"Free" + "Marker")
获取一个字符:name[0]
序列操作
连接:users + ["guest"]
序列切分:products[10..19] 或 products[5..]
哈希表操作
连接:passwords + {"joe":"secret42"}
算数运算: (x * 1.5 + 10) / 2 - y % 100
截取子串
截取子串可以根据字符串的索引来进行,
如果指定一个索引值,则取得字符串该索引处的字符;如果指定两个索引值,
则截取两个索引中间的字符串子串。如:
<#assign number="01234">
${number[0]} <#-- 输出字符0 -->
${number[0..3]} <#-- 输出子串“0123” -->