一:FreeMarker简介
FreeMarker是一种模板引擎:是一种基于模板的,用来生成输出文本的通用工具。
FreeMarker的设计实际上是被用来生成HTML网页,尤其是通过基于实现了MVC模型的Servlet应用程序。使用MVC模式的动态网页的构思使得你可以将前端设计者从程序员分离出来,因为应用程序的逻辑和页面设计已经分开了。
FreeMarker仅仅使用模板生成文本页面来呈现已经准备好的数据。
二:FreeMarker的语法
1. 类型
1.1 标量
- 字符串:这是文本类型
- 数字::这是字符类型
- 日期/时间:这是时间日期类型
- 布尔值
1.2 容器
- 哈希表
- 序列
<#list ["winter", "spring", "summer", "autumn"] as x>
${x}
</#list>
也可以用start..end 定义存储数字范围的序列,这里的start 和end 是处理数字值表达式,比如2..5 和[2, 3, 4, 5]是相同的,但是使用前者会更有效率(内存
占用少而且速度快)。
- 集
1.3 子程序
- 方法和函数
- 用户自定义指令
1.4 使用原生字符串
字符序列$ { ;(#{)有特殊的含义,如果想要打印 ${,在开始的引号或者单引号之前放置字母r
2. 模板
2.1 总体结构
- Text文本:文本会照着原样来输出
- Interpolation插值:${....}:FreeMarker将会输出真实的值来替换花括号内的表达式,这样的表达式被称为interpolations插值。
- FTL tags标签:这些标签的使用一般以符号#开头(用户自定义的FTL标签使用@来代替#)
- Comments注释:
2.1 指令
2.1.1 if指令
使用if指令可以有条件地跳过模板的一部分,这和程序语言中的if是相似的。
<#if condition> <#if>标签之间的内容将会被忽略
<#if condition><#else><#if>
2.1.2 list指令
<#list sequence as loopVariable>repeatThis</#list>
repeatThis部分将会在给定的sequence遍历时在每项中重复,在所有的重复中,loopVariable将持有当前项值。
2.1.3. include指令
使用include指令,我们可以在当前的模板中插入其他文件的内容。
2.2 表达式
${expression}:使用插值的方式,表达式计算的结果会打印到你放置的位置
2.3 内建函数
内建函数提供供可用的内置功能。内建函数以?形式提供变量的不同形式或者其他信息。
3. 自定义指令
自定义指令可以使用macro指令来定义。
宏是有一个变量名 模板段,这样就能进行重复性的工作
<#macro name...par> </#macro>之间是模板段,可以包含插值和FLT标签,之间的内容是宏定义体,使用<@...>,称为宏调用。
name是宏的名称,par是参数,在宏名称后面位置是用来定义变量的。
<#macro name> <#nested></#macro>:自定义指令可以嵌套内容。
在用户自定义指令中使用";"代替as。
4. 在模板中定义变量
模板中可以使用在数据模型中定义的变量。在数据模型之外,模板本身也可以定义变量来使用。这些临时变量可以适应FRL指令创建和替换。
模板执行时都要维护它自己 这些变量的私有设置,这些变量在页面用以呈现,初始值为空,当模板执行结束这些变量便被销毁。
模板里定义的变量比定义在数据型中的同名参数有更高的优先级。
在模板中可以定义三种类型的变量:
-
简单变量:它能从模板中的任意位置来访问,或者从使用include指令引入的模板访问。可以使用assign或macro指令来创建或者替换这些变量。
-
局部变量:它们只能被设置在宏定义体内,而且只在宏内可见。
-
循环变量:循环变量时由指令(如list)自动创建的。
-
使用globals
5. 处理不存在的变量
在实际应用中数据模型经常会有可选的变量。(也就是说有时可能不存在实际值)。除了一些典型的人为原因导致失误,FreeMarker不能容忍引用不存在的变量,除非明确地告诉它当变量不存在时候如何处理。一个不存在的变量和一个是null的变量,对于FreeMarker来说是一样的。下面介绍典型的处理方法。
- 不论在哪里引用变量,都可以指定一个默认值爱避免变量丢失这种情况,通过变量名后面跟着一个!和默认值。
<h1>Welcome ${user!"Anonymous"}!</h1>
当user从数据模型中丢失时,模板将会将user的值表示为字符串”Anoymous"。
- 在变量名后面通过放置??来询问FreeMarker一个变量是否存在。将它和if指令合并,那么如果user变量不存在的话将忽略整个问候代码段:
<#if user??><h1>Welcome ${user}!</h1></#if>
- 要注意这个操作是FreeMarker 2.3.7 版本以后才有的(用来代替内建函数default,exists 和if_exists)。