Freemarker | 模板指导概念部分

Freemarker

模板开发指南

1,模板+数据模型=输出
优势:相比于单纯的HTML,free marker具有动态更新数据的能力,主要依靠FTL标记和插值实现在HTML页面上
动态更新数据的能力。(指令可以等同于FTL标记)
页面显示流程:请求过程序-》经过freemarker将模板渲染,填充数据-》页面浏览器端显示

2,数据模型
数据模型的基本机构是树状的,如:
(root)
| ± animals
| |
| ± mouse
| | |
| | ± size = “small”
| | |
| | ± price = 50
树状结构名词解释:
–扮演目录角色的root,animals,mouse被称为hash哈希表。(作用:可以通过查找哈希表进而间接的找到其存储的子变量)。
–如果是仅仅存储单一数值的变量,被称为scalars标量。
–sequences序列:也是一种变量,和哈希表类似,但是不存储子变量的名字,类似与数组。如:whatnot.fruits[0]
说明下:序列通过索引来检索数据。
使用方式:如果要在模板中直接使用子变量的值,那么应该从该子变量的哈希表开始。
标量的类型:
1,字符串
2,数字,在free marker中字符串“50”和数字50是两种不同的类型,区分对待,不可混淆。
3,日期时间
4,boolean

3,模板
模板元素:
–interpolation 插值(类似与EL表达式) ${}
–FTL标签(功能标签,比如if判断标签)<# …
–指令,就等同于标签
----指令分类:
–if指令,暂时无特殊之处。
–list指令,暂时仅用于序列遍历。
–include指令,用于引入其他页面/数据用。
–指令嵌套,
处理不存在的变量
–如果free marker中引用的变量不存在,除非告知它不存在该怎么做,不然会报错,数据丢失。
–free marker中无引用对象存在和一个变量为null是一样的。
–解决:可以添加默认值,或者用if指令处理。
容器
仅仅作为容器,为例包含其他变量/数据。
强调一点:容器中的变量无类型限制。
类型:
–哈希表:里面的变量无顺序,通过唯一标识的变量名获取/区分。
–序列:里面的变量有序,通过索引下标获取/区分。
–集:受限制的序列,不能获取集合大小不能通过索引获取某个变量,但是可以使用list指令。

函数和用户自定义指令的比较使用
–尽量先使用指令,不行的话在使用函数。

模板总体结构
–FTL模板区分大小写(包括标签,插值等)。
–【BR】换行符号。

指令结构
–分类
–预定义指令,用户自定义指令。
强调一点:
–用户自定义指令对于没有嵌套内容的情况,必须用单标签《。。/》
–在模板中HTML标签和文本一样不会被解析,直接输出。
–如果使用的指令不存在,那么模板就会停止执行,并且抛出错误。

字符串
–“hh"和‘hh’ 这两种形式是相等的。
KaTeX parse error: Expected 'EOF', got '\和' at position 48: …对象。 --原生字符串,在其中\̲和̲{}都没有特殊含义,仅仅作为字符串而已。 在开始的引号或单引号之前放置字
母 r,如:KaTeX parse error: Expected '}', got 'EOF' at end of input: {r:"{foot}”}
–可以直接获取字符串中的一个字符,通过给定的索引。

序列
–连接+,但是效率低点。
–切分【firstindex。。lastindex】

哈希表
–连接+,但是效率低。
注意:如果左右两个哈希表中有相同的key,那么右边的哈希表优先。

数字
–对于+号,如果左右两边有一边是字符串而另一边是数字,那么就会将数字自动转为字符串,但是反过来就不行。

比较运算符
–比较是否相等可以用=,==。
提示一点:
–比较的两方,数据类型必须一致,否则模板执行中断。
–free marker进行的是精确比较,也就是说“A”和“a”是不相等的。
–对于>号,因为free marker把他作为标签结束符号,所以需要处理。
方式:
–<#if (r>d) >
–<#if r gt d >

逻辑操作符
提示一点:
–逻辑操作符仅仅在boolean类型的数值中使用,若用在其他类型,将会产生错误,停止模板渲染。

内建函数
–以?的形式来提供变量的不同形式时的表现。
–语法与使用哈希表访问子变量的方式很想,用?代替. 其他都一样。

空格
–FTL会自动忽略:插值,FTL标签,表达式等中的空格的。

自定义指令
–通过macro宏指令来创建自定义指令,宏后面的变量名就是指令名。
–具体的执行内容,实在宏定义体中定义的,里面可以用FTL标签和插值。
–宏名称后面的未知可以用来定义变量(对象),同样可以设置默认值。
–内容嵌套指令。
–宏定义的局部变量是每个指令自己私有的。
–自定义循环指令,

提示一点:
–param=foo 和param="${foo}" 是不一样的,前者不一定是字符串,但是后者一定是插值结果的字符串形式。

在模板中定义变量
–变量初始值为空,模板执行结束后,变量销毁。
–同名变量,比数据模型中的变量优先级更高,直接隐藏模型中数据。
–宏的参数是局部变量而不是循环变量。
分类
–简单变量,可以在模板的任何位置调用,使用assign或者macro指令来创建和更新值。
–局部变量,只能被定义在宏定义体内,而且只能宏内可见,使用local指令创建和更新
–循环变量,只在循环标签的开始和结束内有效。
优先级:同名同时出现时 循环变量《-局部变量《-简单变量。
简单说:近者优先。
提示一点:
–如果想使用同名的数据模型中的数据,那么需要用这样的方式。
${.globals.变量名} 通过globals变量(特殊变量)

命名空间/库
简单变量(assign)和局部变量(local,macro)的集合被称为命名空间。
–如果想要重复使用宏,局部/简单变量,函数这些集合内容,那么就需要引入library库,并且指定新的命名空间(相对于主命名空间)
–每个库中的变量名,名称无所谓相同不相同,因为每个库的变量名是和对应的命名空间有关的。
如何使用库/命名空间?
–用import导入,而不是include标签。
–用import导入library,同时创建一个空的命名空间接纳library,然后指定哈希表变量。
–通过哈希表变量进入这个空的命名空间。
优点:
–不会跟主命名空间冲突。

雪糕点:
–数据模型中的变量在任何模板中都是可见的。
–不能在模板中直接更改数据模型中的变量。
–命名空间不分层次,相互独立,可以相互引用。
–可以完全用【】替换<>

compress指令,基于输出的内容,不会对模板进行。

模板指导结束!

Freemarker的一般使用步骤为:
(1)创建Configuration实例, 该实例负责管理freemarker的模板加载路径
,以及设置编码格式等。
(2)使用Configuration实例创建Template实例, 并指定使用的模板文件
,以及设置模板编码格式等。
(3)使用Map对象(数据模型root)填充模板。
(4)调用Template实例的process方法完成合并,然后根据不同的流执行不同的输出操作(将合并后的内容放入到输出流中区),然后刷新流输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值