当前位置: 代码迷 >> Web前端 >> Freemarker设计之南(1)
  详细解决方案

Freemarker设计之南(1)

热度:204   发布时间:2013-03-04 17:22:12.0
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 处理中使用,会在后面的专门章节中讲