Freemarker设计之南(一)
1 、快速入门
( 1 )模板 + 数据模型 = 输出
l FreeMarker 基于设计者和程序员是具有不同专业技能的不同个体的观念
l 他们是分工劳动的:设计者专注于表示——创建 HTML 文件、图片、 Web 页面的其它可视化方面;程序员创建系统,生成设计页面要显示的数据
l 经常会遇到的问题是:在 Web 页面(或其它类型的文档)中显示的信息在设计页面时是无效的,是基于动态数据的
l 在这里,你可以在 HTML (或其它要输出的文本)中加入一些特定指令, FreeMarker 会在输出页面给最终用户时,用适当的数据替代这些代码
l 下面是一个例子:
<html>
<head>
<title>Welcome!</title>
</head>
<body>
<h1>Welcome ${user}!</h1>
<p>Our latest product:
<a href="${latestProduct.url}">${ latestProduct.name } </a>!
</body>
</html>
l 这个例子是在简单的 HTML 中加入了一些由 ${…} 包围的特定代码,这些特定代码是 FreeMarker 的指令,而包含 FreeMarker 的指令的文件就称为模板( Template )
l 至于 user 、 latestProduct.url 和 latestProduct.name 来自于数据模型( data model )
l 数据模型由程序员编程来创建,向模板提供变化的信息,这些信息来自于数据库、文件,甚至于在程序中直接生成
l 模板设计者不关心数据从那儿来,只知道使用已经建立的数据模型
l 下面是一个可能的数据模型:
(root)
|
+- user = "Big Joe"
|
+- latestProduct
|
+- url = "products/greenmouse.html"
|
+- name = "green mouse"
l 数据模型类似于计算机的文件系统.
2 、数据模型
( 1 )基础
l 在快速入门中介绍了在模板中使用的三种基本对象类型: scalars 、 hashes 和 sequences ,其实还可以有其它更多的能力:
Ø scalars :存储单值
Ø hashes :充当其它对象的容器,每个都关联一个唯一的查询名字
Ø sequences :充当其它对象的容器,按次序访问
Ø 方法:通过传递的参数进行计算,以新对象返回结果
Ø 用户自定义 FTL 标记:宏和变换器
l 通常每个变量只具有上述的一种能力,但一个变量可以具有多个上述能力,如下面的例子:
(root)
|
+- mouse = "Yerri"
|
+- age = 12
|
+- color = "brown">
l mouse既是scalars 又是 hashes ,将上面的数据模型合并到下面的模板:
${mouse}<#-- use mouse as scalar -->
${mouse.age}<#-- use mouse as hash -->
${mouse.color} <#-- use mouse as hash -->
l 输出结果是:
Yerri
12
brown
( 2 ) Scalar 变量
l Scalar 变量存储单值,可以是:
Ø 字符串:简单文本,在模板中使用引号(单引号或双引号)括起
Ø 数字:在模板中直接使用数字值
Ø 日期:存储日期 / 时间相关的数据,可以是日期、时间或日期 - 时间( Timestamp );通常情况,日期值由程序员加到数据模型中,设计者只需要显示它们
Ø 布尔值: true 或 false ,通常在 <#if …> 标记中使用
( 3 ) hashes 、 sequences 和集合
l 有些变量不包含任何可显示的内容,而是作为容器包含其它变量,者有两种类型:
Ø hashes :具有一个唯一的查询名字和它包含的每个变量相关联
Ø sequences :使用数字和它包含的每个变量相关联,索引值从 0 开始
l 集合变量通常类似 sequences ,除非无法访问它的大小和不能使用索引来获得它的子变量;集合可以看作只能由 <#list …> 指令使用的受限 sequences
( 4 )方法
l 方法变量通常是基于给出的参数计算值
l 下面的例子假设程序员已经将方法变量 avg 放到数据模型中,用来计算数字平均值:
The average of 3 and 5 is: ${avg(3, 5)}
The average of 6 and 10 and 20 is: ${avg(6, 10, 20)}
The average of the price of python and elephant is: ${avg(animals.python.price, animals.elephant.price)}
( 5 )宏和变换器
l 宏和变换器变量是用户自定义指令(自定义 FTL 标记),会在后面讲述这些高级特性
( 6 )节点
l 节点变量表示为树型结构中的一个节点,通常在 XML 处理中使用,会在后面的专门章节中讲