1、概念
FreeMarker是基于模板和要改变的数据的,用来生成输出文本的通用工具。
2、数据模型
数据模型的基本结构是树状的 如下所示:
(root) | +- animals | | | +- mouse | | | | | +- size = "small" | | | | | +- price = 50 | | | +- elephant | | | | | +- size = "large" | | | | | +- price = 5000 | | | +- python | | | +- size = "medium" | | | +- price = 4999 | +- message = "It is a test" | +- misc | +- foo = "Something"
图中的变量充当类似目录的角色,如root, animals, mouse, elephant, python, misc,是哈希表;存储的其他变量又称为子变量;存储单值的变量称为标量,如size、price。message、foo;
哈希表是存储相关变量和与其相关的具有唯一标识名称的容器;
如果想在模板中使用子变量,比如第一个price,就要这样写:animals.mouse.price
(root) | +- animals | | | +- (1st) | | | | | +- name = "mouse" | | | | | +- size = "small" | | | | | +- price = 50 | | | +- (2nd) | | | | | +- name = "elephant" | | | | | +- size = "large" | | | | | +- price = 5000 | | | +- (3rd) | | | +- name = "python" | | | +- size = "medium" | | | +- price = 4999 | +- misc | +- fruits | +- (1st) = "orange" | +- (2nd) = "banana"
还有一种变量叫做序列,只不过是哈希表中的子变量没有名字,比如上图的animals、misc。fruits就是序列;序列是存储有序变量的容器。
访问序列的子变量用索引。比如anims[0].name、misc.fruits[0]等;
3、模板文件构成
有4部分:
- 插值:${ } 大括号里面的值输出的真实的值;
- 注释:<#-- -->,和HTML类似
- FTL标签:类似与HTML,<#.. > </#..> ,还有把#换成@,这是用户自定义的标签
- 静态文本:直接输出的
例子:
welcome <#--这是一个注释-->welcome${user}!
we have these animals:
- <#list animals as being>
- ${being.name} for ${being.price} Euros