最常用的3个概念
sequence 序列,对应java里的list、数组等非键值对的集合
hash 键值对的集合
namespace 对一个ftl文件的引用,利用这个名字可以访问到该ftl文件的资源
指令
if, else, elseif
switch, case, default, break
list, break
include
Import
compress
escape, noescape
assign
global
setting
macro, nested, return
常用语法
输出:输出对象book的name属性:${book.name}
判断为空值:${book.name?if_elsets} 或者<#if book.name??>
设置默认值:${book.name?default('xxxx')}或者 ${ book.name!"xxx"}
日期格式:${book.date?string('yyyy-MM-dd')}
数字格式:${book?string.number}<#--20->
${book?string.currency}<#--$20->
${book?string.percent}<#-20%->
插入布尔值:<#assign foo = true/>
${foo?string("yes","no")}<#-yes->
逻辑判断
<#if condition>
<elseif condition2>
</#if>
空值判断<#if book.name??>
<#switch value>
<#case refValue1>
<#break>
<#case refValue2>
<#break>
<#default>
</#switch>
循环读取
<#list employess as e>
${e_index}.${e.name}
<#list>
<#if mole?default(0)!=0>
压缩空白空间和空白行
<#assign x = " moo">
<#compress>
1 2 3 4 7 9
${abcd}
test only
I said,test only
)
输出
(1 2 3 4 7 9
abcd
test only
I said,test only
Sequence内置的计算器
显示序列号
item_index:是list当前值的下标
item_has_next:判断list是否还有值
<#list employees as e>
${e_index}..${e.name}
<#list>
输出: 1.aaa
2.bbb
3.ccc
Sequence内置分段器:chunk
用途:某些比较BT的排版需求
模板:
<#assign seq = ['a','b','c','d','e','f','g','h','i']>
<#list seq?chunk(4)as row>
<ul>
<li><#list row as cell>${cell}</#list></li>
</ul>
</#list>
<#list seq?chunk(4,'---') as row>
<ul>
<li><#list row as cell>${cell}></#list></li>
</ul>
输出
<ul><li>a</li><li>b</li><li>c</li><li>d</li><ul>
<ul><li>e</li><li>f</li><li>g</li><li>h</li><ul>
<ul><li>i</li><ul>
<ul><li>a</li><li>b</li><li>c</li><li>d</li><ul>
<ul><li>e</li><li>f</li><li>g</li><li>h</li><ul>
<ul><li>i</li><li> --- </li><li> --- </li><li> --- </li><ul>
</ul>
Freemarker的list
List 元素为Scalar对象
<#list scalarList as value0>
Scalar 的 list值:${vlue0}
</#list>
List 元素为Object
<#list objectList as object>
Object 的 list值:${object.name}
</#list>
Map 的Values元素为 Scalar
<#list scalarMap?keys as mykey>
Scalar 的Map key值是:${mykey]
Scalar 的Map values 值是:${scalarMap[mykey]}
</#list>
Map 的Map Values元素为 Object
<#list objectMap?keys as key>
<#assign mapUser="userMap[key]">
The User Object is ${mapUser}
The UserId is ${mapUser.userId}
</#list>
FreeMarker中的list 排序
升序:<#list lsit?sort_by('time') as v> ${v}</#>
降序:<#list list?sort_by('') as v>${v}></#>
Freemark在模板中定义变量
plain变量:可以在模板的任何地方访问,包括include指令插入的模板,使用
assign指令创建和替换
<#include filename options>
options包含两个属性
encoding=”GBK” 编码格式
<#import path as hash>
类似于java里的import,它导入文件,然后就可以在当前文件里使用被导入文件
里的宏组件
假设mylib.ftl里定义了宏copyright那么我们在其他模板页面里可以这样使用
<#import "/libs/mylib.ftl" as my>
<@my.copyright date="1999-2002"/>
"my"在freemarker里被称作namespace
parse=true 是否作为ftl语法解析,默认是true,false就是以文本方式引入.注意在
ftl文件里布尔值都是直接赋值的如parse=true,而不是parse=”true”
<#import path as hash>
类似于java里的import,它导入文件,然后就可以在当前文件里使用被导入文件
里的宏组件
<#include "/WEB-INF/index/top.html" encoding=”utf-8">
Sequence的内置函数
freemarker.properties配置
解决中文乱码问题:
default_encoding=UTF-8
locale=zh_CN
number_format=#
提高freemarker的性能
template_update_delay=6000
freemarker的表签种类:
${} #代表FTL tags
<#if></#if>
@,代表用户自定义标签
<#--- --- --- --->
注释标志
<#--
这里是注释
-->
旧版本的freemarker采用的是<#comment> 注释 </#comment>方法
1.sequence?first 返回sequence的第一个值。
2.sequence?last 返回sequence的最后一个值。
3.sequence?reverse 将sequence的现有顺序反转,即倒序排序
4.sequence?size 返回sequence的大小
5.sequence?sort 将sequence中的对象转化为字符串后顺序排序
6.sequence?sort_by(value) 按sequence中对象的属性value进行排序
注意:Sequence不能为null
二、Hash的内置函数
1.hash?keys 返回hash里的所有key,返回结果为sequence
2.hash?values 返回hash里的所有value,返回结果为sequence