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 处理中使用,会在后面的专门章节中讲

相关推荐