一、FreeMarker

FreeMarker是一款模板引擎,即基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。它是一个Java类库,是一款程序员可以嵌入他们所开发的组件。

模板编写为FreeMarker Template Language(FTL)。在模板中,我们可以专注于如何展示数据,而在模板之外可以专注于要展示什么数据。这种方式通常被称为MVC(模型 视图 控制器)模式。对于动态网页来说,是一种特别流行的模式。它帮助从开发人员(Java程序员)中分离出网页设计师(HTML设计师)。

FreeMarker最初的设计,是被用来在MVC模式的web开发框架中生成HTML页面的,它没有被绑定到Servlet或HTML或任意Web相关的东西上,它也可以应用于非Web环境中。

二、入门

<html>
<head>
  <title>Welcome!</title>
</head>
<body>
  <h1>Welcome ${user}!</h1>
  <p>Our latest product:
  <a href="${latestProduct.url}">${latestProduct.name}</a>!
</body>
</html>

说明:(1)上面的${user}以及<a href="$......">使用的就是FTL中的模板进行动态更新的。模板和静态HTML是相同的,只是它会包含一些FreeMarker将它们变成动态内容的指令。

(2)模板文本存放在Web服务器上,就像通常存放静态HTML页面那样。当有人访问页面时,FreeMarker将介入执行,然后动态转为模板,用最新的数据内容替换模板中${...}的部分,之后将结果发送到访问者的web浏览器中。访问者的web浏览器会接收到一个完整的静态HTML页面。存储在web服务器端的模板文本是不会被修改的,替换也仅仅出现在web服务器的响应中。

(3)模板并没有包含程序逻辑来查找当前的访问者是谁,或者去查询数据库来获取最新的产品。显示的数据是在FreeMarker之外准备的,通常是一些编程语言(如Java)所编写的代码。模板作者无需知道这些数据是如何计算出来的。事实上,这些值的计算方式可以完全被修改,而模板可以保持不变,而且页面的样式也可以完全被修改而无需改动模板。

三、模板

最简单的模板就是普通的HTML文件。当客户端访问某个页面时,FreeMarker要发送HTML代码至客户端浏览器中去显示。如果要想变为动态网页,则要在HTML中放置能被FreeMarker所解析的特殊代码片段:

  • ${...}:FreeMarker将会输出真实的值来替换大括号内的表达式,这样的表达式称为插值(interpolation)。
  • FTL标签:FTL标签和HTML标签类似。但FTL的标签名字以”#"开头。
  • 注释:使用<#--and-->来标识。

其它任何不是FTL标签、插值或注释的内容将被视为静态文本。这些东西不会被FreeMarker所解析,会照原样输出出来。

四、数据模型

1 定义

为模板准备的数据整体被称作为数据模型。模板作者要关心的是,数据模型是树形结构。如数据模型可以是:

ftm模式能跑android应用吗 ftl 安卓_ftm模式能跑android应用吗

 数据模型不是文本格式,来自于Java对象。对于Java程序员来说,root就像一个有getUser()和getLatestProducts方法的Java 对象,也可以有"user"和“latestProducts"键值的Java Map对象。相似地,latestProduct就像是有getUrl()和getName()方法的Java对象。

总结:模板和数据模型是FreeMarker来生成输出所必需的:模板+数据模型=输出

2 分类

请看下面的数据模型:

ftm模式能跑android应用吗 ftl 安卓_Java_02

上图中扮演目录的角色(比如root、animals、mouse、elephant、python和misc)被称为hashes(哈希表)。哈希表存储其它变量(被称为子变量),它们可以通过名称来查找(即它们相应的目录)。

存储单值的变量(size、price、foo)称为scalars(标量)。标量类型又可分为:

  • 字符串:即文本。就是任意的字符序列。如:name和size
  • 数字:数值类型。如:price
  • 日期/时间:可以是日期-时间格式(存储某一天的日期和时间),或者是日期(只有日期,没有时间),或者是时间(只有时间,没有日期)。
  • 布尔值:对/错、开/关、是/否。比如动物可以有一个protected(受保护的)的子变量,该变量存储动物是否被保护起来的值。

还有一种变量像哈希表那样存储子变量,但是子变量没有名字,它们只是列表中的项。这种变量称为sequences(序列)。

ftm模式能跑android应用吗 ftl 安卓_HTML_03

 如上图中的animals和fruits就是序列类型(sequences)。

2.3 数据的使用

访问哈希表中的子变量:如果要在模板中使用子变量,那应该从根root开始指定它的路径,每级之间用点来分隔开。如mouse的price,则使用animals.mouse.price。

访问序列中的子变量:使用方括号形式的数字索引下标。索引下标从0开始。如果要获取第一个动物的名称的话,就使用animals[0].name。要得到misc.fruits中的第二项(字符串"banana")使用misc.fruits[1]。