Freemarker学习笔记
1、模板
- ${…}: FreeMarker将会输出真实的值来替换大括号内的表达式,这样的表达式被称为 interpolation(插值,译者注)。
- FTL 标签 (FreeMarker模板的语言标签): FTL标签和HTML标签有一些相似之处,但是它们是FreeMarker的指令,是不会在输出中打印的。 这些标签的名字以 # 开头。(用户自定义的FTL标签则需要使用 @ 来代替 #,但这属于更高级的话题了。)
- 注释: 注释和HTML的注释也很相似, 但是它们使用 <#-- and --> 来标识。 不像HTML注释那样,FTL注释不会出现在输出中(不出现在访问者的页面中), 因为 FreeMarker会跳过它们。
2、基本指令
(1)if指令
<html>
<head>
<title>Welcome!</title>
</head>
<body>
<h1>
Welcome ${user}
<#if user == "Big Joe">,
our beloved leader
</#if>!
</h1>
<p>Our latest product:
<a href="${latestProduct.url}">${latestProduct.name}</a>!
</body>
</html>
<#if animals.python.price == 0>
Pythons are free today!
</#if>
<#if animals.python.price < animals.elephant.price>
Pythons are cheaper than elephants today.
<#elseif animals.elephant.price < animals.python.price>
Elephants are cheaper than pythons today.
<#else>
Elephants and pythons cost the same today.
</#if>
(2)list指令
list 指令的一般格式为: <#list sequence as loopVariable>repeatThis</#list>
。 repeatThis 部分将会在给定的 sequence 遍历时在每一项中重复, 从第一项开始,一个接着一个。在所有的重复中, loopVariable 将持有当前遍历项的值。 这个变量仅存在于 <#list …> 和 </#list> 标签内。
<p>We have these animals:
<table border=1>
<#list animals as animal>
<tr><td>${animal.name}<td>${animal.price} Euros
</#list>
</table>
//输出
<p>We have these animals:
<table border=1>
<tr><td>mouse<td>50 Euros
<tr><td>elephant<td>5000 Euros
<tr><td>python<td>4999 Euros
</table>
(3)include指令
//将版权信息单独存放在页面文件 copyright_footer.html 中
<hr>
<i> Copyright (c) 2000 <a href="http://www.acmee.com">Acmee Inc</a>,
<br>
All Rights Reserved. </i>
<html>
<head>
<title>Test page</title>
</head>
<body>
<h1>Test page</h1>
<p>Blah blah...
<#include "/copyright_footer.html">
</body>
</html>
//最终输出为:
<html>
<head>
<title>Test page</title>
</head>
<body>
<h1>Test page</h1>
<p>Blah blah...
<hr>
<i> Copyright (c) 2000 <a href="http://www.acmee.com">Acmee Inc</a>,
All Rights Reserved.
<br>
</i>
</body>
</html>
//传递参数到index.ftl
<#assign flag="1">
<#include "/index.ftl">
(4)使用内建函数
为了清晰子变量是哪部分,使用 ?(问号)代替 .(点)来访问它们;
user?html 给出 user 的HTML转义版本
user?upper_case 给出 user 值的大写版本
...
(5)处理不存在的变量
可以指定一个默认值来避免变量丢失这种情况
//在变量名后面跟着一个 !(叹号),当 user 不存在于数据模型时, 模板将会将 user 的值表示为字符串 "visitor"。(当 user 存在时, 模板就会表现出 ${user}的值)
<h1>Welcome ${user!"visitor"}!</h1>
也可以在变量名后面通过放置 ?? 来询问一个变量是否存在。
<#if user??><h1>Welcome ${user}!</h1></#if>
模板包含文本、插值、FTL标签、注释
<html>[BR]
<head>[BR]
<title>Welcome!</title>[BR]
</head>[BR]
<body>[BR]
<#-- Greet the user with his/her name -->[BR]
<h1>Welcome ${user}!</h1>[BR]
<p>We have these animals:[BR]
<ul>[BR]
<#list animals as animal>[BR]
<li>${animal.name} for ${animal.price} Euros[BR]
</#list>[BR]
</ul>[BR]
</body>[BR]
</html>
注意:
- 插值 仅仅可以在 文本 中使用。
- FTL 标签 不可以在其他 FTL 标签 和 插值中使用。比如, 这样做是 错误 的: <#if <#include ‘foo’>=‘bar’>…</#if>
- 注释 可以放在 FTL 标签 和 插值中。
(6)Map的使用
@RequesetMapping("index")
public void index(ModelAndView modelAndView)
{
Map<String,String> map=new HashMap<>();
map.put("kobe","Lakers");
map.put("wade","Heat");
modelAndView.addObject("map",map);
}
<#if map??>
<#list map?keys as key>
key = ${key}
value = ${map[key]}
</#list>
</#if>
注:map中的key不能为Integer类型(使用Integer类型将无法读取map中的value),只能为String类型;
3、开发遇到的问题
(1)包含上级目录中的文件
-templates
-----fore
---------hearder.ftl
---------footer.ftl
-----page.html
如上目录结构,在hearder.ftl中引用page.html,应使用:<#include "../page.html">
在header.ftl中引用footer.ftl,应使用:<#include "footer.ftl">