在使用FreeMarker时需要用到以下几个方面:
- FreeMarker在工程中与MVC结合的配置
- 使用FreeMarker的基本语法
- Freemarker静态化的支持
- 如何实现Freemarker自定义标签
- Freemarker宏定义
一、FreeMarker在工程中与MVC结合的配置
二、FreeMarker的基本语法
基本输出:${student.name}
空值判断:${student.name?if_exists} or <#if student.name??>
默认值: ${student.name?default('xxx')}或者${student.name!"xxx"}//每次输出最好带默认值,防止空指针
日期格式:${student.birthday?string('yyyy-MM-dd')}
数字格式:${student.age?string.number} //20
${student.age?string.currency} //20.00
${student.age?string.percent} //20%
传递url的参数:<a href='search.htm?name=${student.name?url}'>查询</a> //对于中文参数,freemarker会自动给我们编码
定义并输出boolean值:<#assign flag=ture /> ${flag?string("yes","no")} //yes
逻辑判断
a:if else 形式
<#if condition>...<#elseif condition2>...<#else>...</#if>
b:switch 形式
<#switch value>
<#case refValue1>...<#break>
<#case refValue2>...<#break>
<#default>...
</#switch>
循环
a.遍历普通list:
<#list someList as item>...</#list>
b.遍历list的前面几项:
<#assign x=3><#list 1..x as i>${i}</#list>
c.遍历map:
<#list nameMap.keySet() as name>${name}-${nameMap.get(name)}</#list>
或者
<#list nameMap?keys as name>${name}-${nameMap.get(name)}</#list>
或者
<#list nameMap?keys as key>${key}-${afterCheckMap[key]}</#list>
list排序输出
a.按照属性name进行排序(默认升序):
<#list someList?sort_by(["name"]) as item>${item.name}</#list>
b.按照属性name进行降序排序:
<#list somelist?sort_by(["name"])?reverse as item>${item.name}</#list>
注意:
- list指令还隐含了两个循环变量:item_index:当前迭代项在所有迭代项中的位置,是数字值。
- item_has_next:用于判断当前迭代项是否是所有迭代项中的最后一项。
- 关于map的key,它必须是String,这个在一定程度上限制了后台程序对于map的表达。
比较符
大于:gt
小于:lt
大于等于:gte
小于等于:lte
使用方法很简单
<#if x gt 1>...</#if>
其他参考资料如下:
内置函数 数字、字符串、日期格式化用法介绍:http://blog.csdn.net/lufeng20/article/details/7790156
三、Freemarker静态化的支持
四、如何实现Freemarker自定义标签
五、Freemarker宏定义
宏定义能够减少重复代码的编写,也可以封装几个不同的脚本(例如分页模块),供页面开发人员使用。同时也利于样式的扩展。
简单实例
定义一个简单的分页样式宏:<#macro pager><div class="pager-style">这是个分页样式</div></#macro>
调用宏:<@pager/>
在macro指令中可以在宏变量之后定义参数
<#macro pager pageIndex>
<div class="pager-style">这是第${pageIndex}页</div>
</#macro>
调用宏:<@pager pageIndex="1"/>
注意此种情况:<@pager pageIndex=pagination/>
此时的pagination变量的值传给pageIndex参数,该值不仅是字符串,还可以是其它类型,甚至是复杂的表达式。
定义多参数的宏
<#macro pager pageIndex totalSize>
<div class="pager-style">这是第${pageIndex}页,总共${totalSize}条记录</div>
</#macro>
调用时参数的次序是无关的:<@pager pageIndex="1" totalSize="20"/>
在定义宏参数时可以指定缺省值,若未指定则必须保证对所有参数进行赋值,否则会出现空指针异常:
<#macro pager pageIndex totalSize pageSize="10">
<div class="pager-style">这是第${pageIndex}页,总共${totalSize}条记录,每页${pageSize}条</div>
</#macro>
注意:宏的参数是局部变量,只能在宏定义中有效。
在宏里嵌套内容
<#nested>//该指令会获取宏调用指令开始和结束标记之间的模板片断
<#macro pager><div class="pager-style">这是个分页样式</div></#macro>
执行宏调用:<@pager>我爱分页</@pager>
执行结果:我爱分页<div class="pager-style">这是个分页样式</div>