FreeMarker介绍
FreeMarker的下载网址为http://freemarker.sourceforge.net/,我这里下载的是freemarker-2.3.16.rar。
FreeMarker是一个用Java编写的模板引擎,主要用来生成HTML Web页面,特别是基于MVC模式的应用程序。虽然FreeMarker具有一些编程的能力,通常由Java程序准备要显示的数据,由 FreeMarker模板生成页面。 FreeMarker可以作为Web应用框架一个组件,但它与容器无关,在非Web应用程序环境也能工作的很好。
FreeMarker中模板 + 数据 = 输出,在模板中需要程序运行中填充数据的地方我们使用${temp_name}来代替,在程序执行的时候我们只需要提供给temp_name指定名字的变量提供值的话在页面展示时就可以展示我们希望的值,实现了动态页面的效果。
1.数据模型
上图中变量扮演目录的角色(根root,animal,mouse,elephant,python,whatnot)被称为hash哈希表。哈希表通过可查找的名称(例如:”animal”, ”mouse”, ”price”)来访问存储的其他变量(如子变量)。
如果仅存储单值的变量(size,price,text和because)则它们被称为scalars标量。
如果要在模板中使用子变量,那应该从根root开始指定它的路径,每级之间用点来分隔。要访问price和mouse的话,应该从根开始,先是animals,然后是mouse,最后是price,所以应该这样写:animals.mouse.price。当放置${…}这种特定代码在表达式前后时,我们就告诉FreeMarker在那个位置上要来输出对应的文本。
标量存储单一的值,这种类型的值可以是字符串,数字,日期/时间或者是布尔值。
字符串:这是文本类型,字符的任意序列,使用单引号或双引号限定。如果包含特殊字符需要转义符:${"It's \"quoted\" andthis is a backslash: \\"} ,有一类特殊的字符串:${r"C:\foo\bar"},输出结构为:C:\foo\bar,在引号前面加r被认为是纯文本。
数字:这是数值类型,直接输入,不需要引号。在FreeMarker中字符串”50”和数字50是两种完全不同的类型。前者只是两个字符的序列(这恰好是我们可以读的一个数字),而后者是一个可以在算数运算中直接使用的数值。比如${08}, ${+8}, ${8.00} and ${8} 都是相同的。
日期/时间:
Date(精确到天:date)。
Time(没有日期-天-部分,精确到毫秒)。
Date-time(又被成为:time stamp,精确到毫秒)。
布尔值:true和false,不使用引号。
哈希表是存储变量和与其相关且有唯一标识名称变量的容器。
序列(Sequences):存储有序变量的容器。存储的变量可以通过数字索引来检索,索引通常从零开始,获取Sequence(序列)片断-使用[startindex..endindex]。
例一:seq中存储了"a", "b", "c", "d","e",那么seq[1..2]包含了b和c两个值。
可以使用.variablename语法访问FreeMarker内置变量。
<#list ["winter", "spring", "summer", "autumn"] as x> ${x} </#list> 输出结果: winter spring summer autumn 例二:[2 + 2, [1, 2, 3, 4], "whatnot"]
例三:2..5,等同于[2, 3, 4, 5];5..2,等同于[5,4,3,2]。注意方括号是不需要的。
可以通过下标来读取序列中的数据,从0开始,如:取得第一条目的第一个animal可以使用 animals[0].name. 取得第二个条目的第二个值为whatnot.fruits[1](取得的值为"banana").
2.模板
最简单的模板是普通HTML文件。当客户端访问页面时,FreeMarker要发送HTML代码至客户端浏览器端显示。如果想要页面动起来,就要在HTML中放置能被FreeMarker所解析的特殊部分。
${…}:FreeMarker将会输出真实的值来替换花括号内的表达式,这样被称为interpolations插值。
FTL tags标签(FreeMarker 模板的语言标签):FTL标签和HTML标签有一点相似,但是它们是FreeMarker的指令而且是不会直接输出出来的东西。这些标签的使用一般以符号#开头,用户自定义的FTL标签使用@符号来代替#。
Comments注释:FreeMarker的注释和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> 上面的例子中,在简单的HTML中加入了一些由${…}包围的特定FreeMarker的指令,这个文件就称为模板了。而user、 latestProduct.url和latestProduct.name来自于数据模型,由Java程序提供,模板设计者就不用关心数据从哪来的。
(root) | +- user = "Big Joe" | +- latestProduct | +- url = "products/greenmouse.html" | +- name = "green mouse"
说明:实际上在Java的代码中使用FreeMarker的时候,我们是将所有的需要替换成的名称使用Map来设置它的值。我们直接在页面上添加的值就是添加在root的后面,而我们添加的时候也可以通过Map中添加Map的方式来实现递层的添加,如lastestProduct后面添加url、name等。
3.第一个例子
见附件。