本文适合有一定Java、Jsp、Html开发基础的同学们,刚开始接触FreeMarker时学习参考。
- FreeMarker:
- 本质上是模板(Html、Jsp文件)和数据模型相结合,得到输出的一种工具;
- 输出的结果是静态的网页,数据与模板的结合在网页加载之前完成;
- FreeMarker使用模板生成文本页面来呈现已经准备好的数据,注意数据需要提前准备好。
- 数据模型:
- 数据模型的基本结构是树状的,可以很复杂、有很大的深度;
- “目录”即hash,哈希表;
- “存储单元”即scalars,标量,标量仅存储值,而没有深度;
- 如果在模板中需使用子变量,应从root(根)来寻找它的路径;
- 如上图示若需取“cola”的"color"属性:${Drink.cola.color} ,上图中的taste、color这样的属性,没有深度,即为标量。
- 数据类型(标量):
- 字符串;
- 数字;
- 日期/时间;
- 布尔值;
- 基本模板:
- ${........}:FreeMarker将会输出真实值来替换花括号内的表达式,此种方式称为interpolations插值;
- FTL tags标签:FreeMarker指令,不会直接输出值,形式类似<# ..></#..>的标签或标签对 ;
- Comments注释:以<#-- XXXXXX -->的形式展现,内容被忽略;
- 最常用的指令:
- if指令:使用if指令可以有条件的跳过忽略模板的一部分,形式如:<#if 判断表达式>.......</#if>,当且仅当判断表达式为真时,标签中包裹的内容才显示出来;
- if...else指令:在if标签对中添加else:<#if 判断表达式>aaaaa<#else>bbbbb</#if>,当判断表达式为真,输出aaaaa,否则输出bbbbbb;
- list遍历指令:遍历集合中的所有元素,格式形如:<#list sequence as loopVariable>Repeat</#list>,sequence指被遍历的集合,loopVariable持有当前项的值,循环变量仅存在于list标签对之间;
- include指令:在当前模板中添加其他文件的内容,形如:<#include "/xxxx.html">
- 类型:常用的数据类型有:字符串、数值、布尔、时间,另外有集合如序列、哈希表等。在指令中对操作对象的数据类型有许多常见限制,如:${user/2},除法操作中,user必须是数值类型;${animals.name},animals是哈希表时有效;${list shop as s},shop必须是序列;<#if flag>,flag必须是布尔型量;
- 标量:标量是最基本的数据类型,它们可以是:
- 字符串:简单的文本;
- 数字;
- 布尔值:逻辑上的true/false;
- 日期:精确到天的日期/精确到毫秒的时间(不包括日期)/日期-时间(称为时间戳);
- 容器:容器的存在是为了包含其他变量,它们作为容器,被包含的变量通常是子变量,容器的类型有:
- 哈希表:每个子变量都可以通过一个唯一的名称来查找,这个名称是不受限制的字符串。哈希表并不确认其中子变量的顺序,也就是说没有第x个变量这种说法,变量仅能通过名称来进行访问(类似JAVA中的HashMap);
- 序列:每个子变量通过一个整数来标识,以0为开始。这些整数通常称为“索引”。子变量的数据类型无需完全一致;
- 集:有限制的序列。无法获取集的大小,也无法通过索引获得集当中的数据,但仍可以通过list进行遍历;
- *******: 一个数值可以有多种数据类型,对于一个变量,可能存在哈希表和序列这两种类型。这时该变量就支持索引和名称两种访问方式,不过容器基本上还是仅作为一种容器来使用。储存在哈希表、序列(集)中的变量可以是任意类型的,这些变量也可以是哈希表、序列(集),这样可以构建任意深度的数据结构。数据模型本身也是哈希表;
- 方法和函数(了解):通过指令及参数传入(部分不需要参数),得到输出,例如:${avg(3,7)} , 输出是5(平均数函数);
- 用户自定义指令(了解):用户自定义指令也就是FreeMarker自定义标签,这种类型也是一种子程序,一种可以复用的模板代码片段;
- 常用转义字符:
转义序列 含义 \ 引号 \' 单引号 \\ 反斜杠 \n 换行符 \r 回车 \t 水平制表符 \b 退格 \f 换页 \l 小于号 < \g 大于号 > \a 与 & \xCode 字符的16进制Unicode码
- 常用转义字符:
欢迎大佬们进行交流学习~