1.?? freemarker 简介
1.1. 概述
FreeMarker 允许 Java servlet 保持图形设计同应用程序逻辑的分离,这是通过在模板中密封 HTML 完成的。模板用 servlet 提供的数据动态地生成 HTML 。模板语言是强大的直观的,编译器速度快,输出接近静态 HTML 页面的速度。
FreeMarker 是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯 Java 编写
FreeMarker 被设计用来生成 HTML Web 页面,特别是基于 MVC 模式的应用程序
虽然 FreeMarker 具有一些编程的能力,但通常由 Java 程序准备要显示的数据,由 FreeMarker 生成页面,通过模板显示准备的数据
FreeMarker 不是一个 Web 应用框架,而适合作为 Web 应用框架一个组件
FreeMarker 与容器无关,因为它并不知道 HTTP 或 Servlet ; FreeMarker 同样可以应用于非 Web 应用程序环境
FreeMarker 更适合作为 Model2 框架(如 Struts )的视图组件,你也可以在模板中使用 JSP 标记库。
2.?? freemarker 常用技巧
2.1. 截取字符串
有的时候我们在页面中不需要显示那么长的字符串,比如新闻标题,这样用下面的列子就可以自定义显示的长度
< lt . <= lte. > gt. >= gte
<#if jstbqkVO.gzdd?length lt 8>
?????????? <a
href>${jstbqkVO.gzdd?default("")}</a>
????? <#else>
?????????? <a href
title="${jstbqkVO.gzdd}">${jstbqkVO.gzdd[0..3]?default("")}...</a>
</#if>
意思就是如果这个字符串的长度小于 8 ,那么就正常显示,反之则取 4 位
???????
2.2. 连接字符串
${"Hello," + user + "!"}??? // 输出结果为 :hello,gs!
??????????????????????
2.3. 日期格式和 boolean 类型,转化为 string 类型
例子 1:
???????????????????????????????????? ${.now?string("yyyy-MM-dd HH:mm:ss zzzz")}?????
???????????????????????????????????? ${.now?string("EEE,MMM d, ''yy")}
???????????????????????????????????? ${.now?string("EEEE,MMM dd,yyyy, hh:mm:ss a '('zzz')'")}
???????????????????????????????????? 输出结果如下 :
?????????????????????????????????????????????? 2003-04-08 21:24:44 Pacific Daylight Time
?????????????????????????????????????????????? Tue,Apr 8,'03
?????????????????????????????????????????????? Tuesday,April 08,2003,09:24:44 PM (PDT)
???????????????????????????
??????????????????????????? 例子 2:
???????????????????????????????????? <#assign foo=true/>
???????????????????????????????????? ${foo?string("yes","no")}???????? // 输出结果 :yes
2.4. 排序:
1. 升序 .sort_by()
<#list list?sort_by("
字段
") as x>
</#list>
2. 降序 .sort_by()?reverse
<#list list?sort_by("
字段
")?reverse as x>
</#list>
2.5. 去空格:
${xx?trim}
?
2.6. 数值精度控制
??????????????????????????? mX: 小数部分最小 X 位。
???????????????????? MX: 小数部分最大 X 位。
???????????????????? 例子 :
??????????????????????????? <#assign x=2.582/>
??????????????????????????? <#assign y=4/>
??????????????????????????? #{x; M2}????????????? //2.58
??????????????????????????? #{y; M2}????????????? //4
??????????????????????????? #{x; m1M2}???????? //2.58
???????????????????????????????????? #{y; m1M2}???????? //4.0
?
2.7. 特殊字符串的转义
\": 双引号 ????????
\\: 反斜杠 ????????
\r: 回车 ?????????????
\b: 退格键
\': 单引号
\n: 换行 ????????????
\t:Tab????????????????
\f:Form feed
\l:<???????????
\g:>??????????
\a:&?????????
\{:{
\xCode: 直接通过 4 位的十六进制数来指定 Unicode 码 , 输出改 Unicode 对应的字符。
??????????????????????
2.8. 顶层变量
??????????????????????????? * 所谓顶层变量就是直接放在数据模型中的值。
???????????????????????????????????? Map root = new HashMap();
???????????????????????????????????? root.put("name","yeeku");???? //name 是一个顶层对象
??????????????????????????? * 对于顶层变量 , 直接使用 ${variableName} 来输出变量值
?????????????
2.9. 集合连接运算符
* 集合连接运算是将两个集合连接成一个新的集合 , 连接集合的运算符是 '+'.
???????????????????????????????????? <#list [" 一 "," 二 "," 三 "] + [" 四 "," 五 "," 六 "] as x>
?????????????????????????????????????????????? ${x}
???????????????????????????????????? </#list>
??????????????????????????? // 输出结果如下 :
?????????????????????????????????????????????? 一二三四五六
2.10.?? 算术运算符
??????????????????????????? * 取整运算
???????????????????????????????????? <#assign x=5>
???????????????????????????????????? ${(x/2)?>int}???? //2
???????????????????????????????????? ${1.1?int}?????????????????? //1
???????????????????????????????????? ${1.999?int}???? //1
???????????????????????????????????? ${-1.1?int}????????????????? //-1
2.11.?? 比较运算符
??????????????????????????? ??? =(==)???????? : 判断两个值是否相等
??????????????????????????? ???????? !=?????????????? :............ 不相等
??????????????????????????? ???????? >(gt)????????? : 判断左边是否大于右边
??????????????????????????? ???????? >=(gte)???? :.....
??????????????????????????? ???????? <(lt)? :.....
??????????????????????????? ???????? <=(lte)????? :.....
2.12.?? 逻辑运算符
??????????????????????????? ? ? * 逻辑运算符只能作用于布尔值 , 否则将产生错误 .
???????????????????????????????????? 逻辑与 :&&
???????????????????????????????????? 逻辑或 :||
???????????????????????????????????? 逻辑非 :!
?
2.13.?? 内置函数
html:
字符串中所有的特殊
HTML
字符都需要用实体引用来代替(比如
<
代替
<
)
cap_first:
字符串的第一个字母变为大写形式
lower_case:
字符串的小写形式
upper_case:
字符串的大写形式
trim:
去掉字符串首尾的空格
序列使用的内建函数:
size
:序列中元素的个数
数字使用的内建函数:
int:
数字的整数部分(比如
-1.9?int
就是
-1
)
9>.
空值运算符
length: 字符串的长度
string : 把其他格式的数据,转化为 string 类型
例:
${test?html}
${test?upper_case?html}
假设字符串 test 存储 ”Tom & Jerry” ,那么输出为:
Tom & Jerry
TOM & JERRY
${seasons?size}
${seasons[1]?cap_first}
${"horse"?cap_first}
假设 seasons 存储了序列 "winter", "spring", "summer", "autumn" ,那么上面的输出将会是:
4
Spring
Horse
2.14.?? 运算符优先级
??????????????????????????? * 推荐使用括号来决定运算优先级 .
???????????????????????????????????? 1>. 一元运算符 : !
???????????????????????????????????? 2>. 内建函数 ? : ?
???????????????????????????????????? 3>. 乘除法 ??? : *,/,%
???????????????????????????????????? 4>. 加减法 ??? : +,-
???????????????????????????????????? 5>. 比较 ???????????? : <,>,<=,>=(lt,lte,gt,gte)
???????????????????????????????????? 6>. 相等 ???????????? : ==(=),!=
???????????????????????????????????? 7>. 逻辑与 ??????? : &&
???????????????????????????????????? 8>. 逻辑或 ??????? : ||
???????????????????????????????????? 9>. 数字范围 ?? : ..
????????
?
?
2.15.?? freemarker 判断返回值是否为空, null 的方法
对于
null
,或者
miss value
,
freemarker
会报错
!
:
default value operator
,语法结构为:
unsafe_expr!default_expr
,比如
${mouse!"No mouse."}
当
mouse
不存在时,返回
default value
;
(product.color)!"red"??
这种方式,能够处理
product
或者
color
为
miss value
的情况;
而
product.color!"red"
将只处理
color
为
miss value
的情况
??: Missing value test operator ,
测试是否为
missing
value
unsafe_expr??
:
product.color??
将只测试
color
是否为
null
(unsafe_expr)??
:
(product.color)??
将测试
product
和
color
是否存在
null
?exists:
旧版本的用法
比如:
<#if mouse??>
?? Mouse found
<#else>
?? No mouse found
</#if>
Creating mouse...
<#assign mouse = "Jerry">
<#if mouse??>
?? Mouse found
<#else>
?? No mouse found
</#if>
2.16.???? 在 ftl 中嵌入另一个 controller
??????? <#assign c=JspTaglibs[ "http://java.sun.com/jsp/jstl/core" ] >
??????? <@c.import? url= "/product/hotlistByHttp.htm" />
?
3.?? FreeMarker 的 编写规范与定义
3.1. 编写的指令必须用小写字母
如 <#if></if> 类似这样的都必须小写标示
3.2. 编写的指令不允许嵌套
如 :
<#list>
<#if flag>…
</#list>
</#if>
这样是不正确的,会引起报错
3.3. 在指令中 ,${..} 只能用于文本部分
下面的代码是错误的:
<#if ${isBig}>Wow!</#if><#if "${isBig}">Wow!</#if>
应该写成:
<#if isBig>Wow!</#if>
?
3.4. 表达式的约定
字符串
使用单引号或双引号限定
如果包含特殊字符需要转义,如下面的例子:
${"It's \"quoted\" andthis is a backslash: \\"}
It's "quoted" andthis is a backslash: \
数字
直接输入,不需要引号
布尔值
true 和 false ,不使用引号
序列
由逗号分隔的子变量列表,由方括号限定,下面是一个例子:
<#list ["winter", "spring", "summer", "autumn"] as x>${x}</#list>
散列( hash )
由逗号分隔的键 / 值列表,由大括号限定,键和值之间用冒号分隔,下面是一个例子:
{"name":"green mouse", "price":150}
键和值都是表达式,但是键必须是字符串 ?
3.5. 顶层变量的规范
顶层变量: ${variable} ,变量名只能是字母、数字、下划线、 $ 、 @ 和 # 的组合,且不能以数字开头
3.6. 操作符两边必须是数字
因此下面的代码是错误的:
${3 * "5"} <#-- WRONG! -->?
?