因为打算自己动手改造博客而不是一味地使用模板
也就是自己亲手写模板(结果还是在用模板),但至少使用的是自己写的模板
本文内容大部分来自
FREEMARKER在线手册
在此本人只提炼出其中认为重要的部分
引论
- FreeMarker 是一款模板引擎,也就是一种基于模板和要改变的数据,并用来生成输出文本的通用工具
- 是一个Java类库
- 模板编写为FTL(FreeMarker Template Language)
在模板中可以专注于如何展现数据,而在模板之外可以专注于要展示什么数据
该模式一般称为MVC(模型视图控制器)模式
入门
1.模板 + 数据模型 = 输出
倘若一个HTML页面如下
<html>
<head>
<title>Welcome!</title>
</head>
<body>
<h1>Welcome John Doe!</h1>
<p>Our latest product:
<a href="products/greenmouse.html">green mouse</a>!
</body>
</html>
其中John Doe应当是该网站的访问者
a标签中的href也应当是对应选择产品所在的url
gree mouse 是产品的名字
因为每次访问网站的用户不同,而每次用户所访问的内容不同,因此为了随时更新内容,不能使用静态代码。此时就可以使用要求输出的模板,模板与静态HTML类似
只不过其包含了一些FreeMarker将其变为动态内容的指令
<html>
<head>
<title>Welcome!</title>
</head>
<body>
<h1>Welcome ${user}!</h1>
<p>Our latest product:
<a href="${latestProduct.url}">${latestProduct.name}</a>!
</body>
</html>
模板文件存放在Web服务器上,就像通常存放静态HTML页面那样。当有人来访问这个页面, FreeMarker将会介入执行,然后动态转换模板
用最新的内容替换模板中${...}
的部分,随后将结果发送到访问者的Web浏览器中
重要的是访问者收到的内容样式与第一个HTML样例一样不包含${...}
,访问者也不会察觉到服务端使用了FreeMarker
模板并没有包含程序逻辑来查找当前的访问者是何人,显示的数据是在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"
- 上图中的变量扮演目录的角色,被称为hashes(哈希表),哈希表可存储其他变量(子变量)
- 存储单值的变量称为scalars(标量)
- 倘若要访问变量price,要从根root开始制定其路径,每级之间用
.
隔开,可以这样写animals.elephant.prize
- sequences:它们像哈希表那样存储自变量,但是子变量没有名字 ,如下图中的animals与misc.fruits
(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"
-
要访问序列中的子变量可使用方括号形式的数字索引下标,从0开始,比如要得到上表中第一个动物的名字,可以使用
animals[0].name
-
标量类型:字符串,数字,日期/时间,布尔值
3.模板
FreeMaker本身不属于HTML
①interpolation
${...}
FreeMarker会输出真实的值来替换大括号内的表达式
②FTL标签
- 与HTML标签有相似之处,但是它们并不会在输出中打印,属于FreeMarker指令
- 名字以
#
开头 - 用户自定义的FTL标签以
@
开头
③注释
使用<#--
与-->
标识,注意的是FTL注释不会出现在访问者的界面中(就是你对一个浏览器界面右键检察元素,显示HTML代码,HTML注释会显示而FTL注释不会)
Q.E.D.
Comments | 1 条评论