1.什么是Freemarker
FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。
在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。
上个图
即 模板+数据模型=输出
2.数据类型
请注意,这里讲的是数据类型而上面说的是数据模型+模板=输出
在freemarker中,数据模型特指一个以root为根节点的哈希表,这个表中的所有数据,都是从Java后台传过来的。
而但是在模板中,也是可以定义数据的,这两种来源(Java后台与模板创建)的数据本质上没有区别,我们可以统称其为变量,变量具有以下类型:
(1)标量
①字符串
②数字
③日期
④布尔值
以上的类型分别对应Java里面的
java.lang.String
java.lang.Number
日期暂时无对应
java.lang.Boolean
(2)矢量/容器
容器的作用就是用来存放其他变量
①序列
java.util.List 或Java数组
②散列/哈希
java.util.Map或用户自定义的JavaBean
(3)子程序
①方法
利用Java反射机制传递过来的位于数据模型的变量
②函数
利用指令function创建的变量
③用户自定义指令
利用指令macro创建的变量
注:
①许多有实用功能的内建函数是依附于标量变量来调用的。
假设有标量x,且有内建函数method,调用方式是x?method
②子程序也像函数式编程一样,在程序之中处于第一等地位。
③方法与函数也只是来源不同,调用方式是通过插值,${expression}
而用户自定义指令的调用方式却类似于指令,假如有名为method的自定义指令,调用方式为<@method>xxxxx</@method>
3.模板
(1)文本
即html语言,这个按照原样输出
(2)插值
即${expression}
(3)FTL标签/指令
比如<#list> xxxxxxx <./#list>
或者用户自定义标签<@method> xxxxxxx </@method>
(4)注释
<#-- 这就是注释 -->
4.其他
(1)常用指令
①条件语句
可以说是一目了然,其中#else是可选的
<#if predict>
语句1
<.#else>
语句2
<./#if>
②循环语句
这里面的循环类似于C++11的范围for
<#list sequences as element>
${element}的语句
</#list>
③包含语句
<#include "xxxx.ftl">
包含另一段ftl代码
(2)不存在变量
这里说的不存在的意思既包括没有定义,也包括变量值为null,假设变量为x,处理方式有
①提供默认值
${x}!"xxx"
即如果x不存在,就提供默认值"xxx"
②提前判断
<#if x??>xxxxxxxx</#if>
即如果x不存在,整个语句都不会起作用。
(3)插值注意事项
①作用范围
A。文本区
比如,<h1> Hello ${name} </h1>
B。字符串表达式
比如,<#include "/footer/${company}.html">
②插入自动转换
我们知道,变量有:数字、字符串、日期、布尔 4种类型
插入到文本区,都是要转换为字符串,可能够自动转换的类型有,数字和字符串。
A。日期的转换,需要借助内建函数date、time、datetime来帮助freemarker转换
B。布尔的转换,需要借助内建函数string,比如${married?string("true","false")}当然也可以这样${married?string("yes","no")}
③转意处理
这个目的是为了防止跨站脚本攻击之类的。
使用escape指令,比如
<#escape x as x?html>
...
<p>Title: ${book.title}</p>
<p>Description: <#noescape>${book.description}</#noescape></p>
<h2>Comments:</h2>
<#list comments as comment>
<div class="comment">
${comment}
</div>
</#list>
...
</#escape>