what
FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具
why
选择freemarker的原因:
- 1、性能。velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差(虽然只是几毫秒到十几毫秒的差距)。但是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tag和el的jsp好。
- 2、宏定义比jsp tag方便
- 3、内置大量常用功能。比如html过滤,日期金额格式化等等,使用非常方便
- 4、支持jsp标签
- 5、可以实现严格的mvc分离
how
请接下来往下面看
FreeMarker模板文件主要由如下4个部分组成:
- 1,文本:直接输出的部分
- 2,注释:<#-- ... -->格式部分,不会输出
- 3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出
- 4,FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出
例子
<html><br>
<head><br>
<title>Welcome!</title><br>
</head><br>
<body><br>
<#-- 注释部分 --><br>
<#-- 下面使用插值 -->
<h1>Welcome ${user} !</h1><br>
<p>We have these animals:<br>
<u1><br>
<#-- 使用FTL指令 -->
<#list animals as being><br>
<li>${being.name} for ${being.price} Euros<br>
<#list><br>
<u1><br>
</body><br>
</html>
1.插值规则
FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format}
1.1基本输出
- 输出 ${book.name}
- 空值判断:${book.name?if_exists },
${book.name?default(‘xxx’)} //默认值xxx
${ book.name!"xxx"}//默认值xxx - 日期格式:${book.date?string('yyyy-MM-dd')}
- 数字格式:${book?string.number} //20
${book?string.currency} //$20.00
${book?string.percent} //20%
2.FTL指令规则
在FreeMarker中,使用FTL标签来使用指令,FreeMarker有3种FTL标签,这和HTML标签是完全类似的.
- 1,开始标签:<#directivename parameter>
- 2,结束标签:</#directivename>
- 3,空标签:<#directivename parameter/>
2.1遍历List集合
<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as item>
${item}
</#list>
这里会逐个输出星期几
此外,迭代集合对象时,还包含两个特殊的循环变量:
item_index:当前变量的索引值
item_has_next:是否存在下一个对象
也可以使用<#break>指令跳出迭代
2.2遍历map集合
{"语文":78, "数学":80}
Map对象的key和value都是表达式,但是key必须是字符串
<#list map?keys as key>
${key}=${map[key]}<br />
</#list>
2.3逻辑判断
if判断
<#if condition> ...
<#elseif condition2> ...
<#elseif condition3> ......
<#else> ...
</#if>
==其中空值判断可以写成==<#if book.name?? >
switch判断
<#switch value>
<#case refValue1> ...
<#break>
<#case refValue2> ...
<#break>
<#case refValueN>...
<#break>
<#default>
</#switch>
3.内置函数
常用的内置的字符串函数:
- html:对字符串进行HTML编码
- cap_first:使字符串第一个字母大写
- lower_case:将字符串转换成小写
- upper_case:将字符串转换成大写
- trim:去掉字符串前后的空白字符
下面是集合的常用内置函数
- size:获取序列中元素的个数
- chunk:分成几个一组
- xxx_index :计数器
下面是数字值的常用内置函数
- int:取得数字的整数部分,结果带符号
4.空值处理
FreeMarker对空值的处理非常严格,FreeMarker的变量必须有值,没有被赋值的变量就会抛出异常,因为FreeMarker未赋值的变量强制出错可以杜绝很多潜在的错误,如缺失潜在的变量命名,或者其他变量错误.这里所说的空值,实际上也包括那些并不存在的变量,对于一个Java的null值而言,我们认为这个变量是存在的,只是它的值为null,但对于FreeMarker模板而言,它无法理解null值,null值和不存在的变量完全相同.
为了处理缺失变量,FreeMarker提供了两个运算符:
- !:指定缺失变量的默认值
- ??:判断某个变量是否存在
其中,!运算符的用法有如下两种:
variable!或variable!defaultValue,第一种用法不给缺失的变量指定默认值,表明默认值是空字符串,长度为0的集合,或者长度为0的Map对象.
使用!指定默认值时,并不要求默认值的类型和变量类型相同.使用??运算符非常简单,它总是返回一个布尔值,用法为:variable??,如果该变量存在,返回true,否则返回false