FreeMarker 那一眸我看懂了你

来源:互联网 发布:淘宝试用在哪 编辑:程序博客网 时间:2024/04/30 07:52

FreeMarker模板引擎:Java库基于模板和变化的数据来生成文本输出(HTML网页,电子邮件,配置文件,源代码,等等)。模板使用FreeMarker模板语言(FTL),这是一个简单的、专门的语言(而不是一个完整的编程语言如PHP)。你为了将准备的数据显示在一个真正的编程语言,就像数据库查询问题,然后模板将已经准备好的数据按指定格式显示。你仅仅需要专注于如何呈现数据, 和你关注哪些数据。Just like:Template + data-model = output.

FreeMarker简介

FreeMarker模板文件主要由如下4个部分组成:

NO 组成部分 描述 1 文本 直接输出的部分 2 注释 <#– … –>格式部分,不会输出 3 插值 即${…}或#{…}格式的部分,将使用数据模型中的部分替代输出 4 FTL指令 FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出
<!-- 示例: --><html> <head>  <title>Welcome!</title><br> </head> <body>   <#-- 注释部分 -->   <#-- 下面使用插值 -->   <h1>Welcome ${user} !</h1>   <p>We have these animals:   <u1>   <#-- 使用FTL指令 -->   <#list animals as animal><br>     <li>${animal.name} for ${animal.price} Euros   <#list>   <u1> </body></html>

插值规则

FreeMarker的插值有如下两种类型:

  1. 通用插值${expr};
  2. 数字格式化插值:#{expr}或#{expr;format}

通用插值

对于通用插值,又可以分为以下4种情况:

字符串值

插值结果为字符串值:直接输出表达式结果

数字值

插值结果为数字值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:

<#settion number_format="currency"/> <#assign answer=42/> ${answer} ${answer?string} <#-- the same as ${answer} --> ${answer?string.number} ${answer?string.currency} ${answer?string.percent} ${answer} 输出结果是: $42.00 $42.00 42 $42.00 4,200% 
日期值

插值结果为日期值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:

${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")} ${lastUpdated?string("EEE, MMM d, ''yy")} ${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")} 输出结果是: 2008-04-08 08:08:08 Pacific Daylight Time Tue, Apr 8, '03 Tuesday, April 08, 2003, 08:08:08 PM (PDT) 
布尔值

插值结果为布尔值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:

<#assign foo=true/> ${foo?string("yes", "no")} 输出结果是: yes 

数字格式化插值

数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以是:

  • mX:小数部分最小X位
  • MX:小数部分最大X位

如下面的例子:

<#assign x=2.582/> <#assign y=4/> #{x; M2} <#-- 输出2.58 --> #{y; M2} <#-- 输出4 --> #{x; m2} <#-- 输出2.6 --> #{y; m2} <#-- 输出4.0 --> #{x; m1M2} <#-- 输出2.58 --> #{y; m1M2} <#-- 输出4.0 --> 

表达式

表达式是FreeMarker模板的核心功能,表达式放置在插值语法${}之中时,表明需要输出表达式的值;表达式语法也可与FreeMarker 标签结合,用于控制输出.实际上FreeMarker的表达式功能非常强大,它不仅支持直接指定值,输出变量值,也支持字符串格式化输出和集合访问等功能.

直接指定值

使用直接指定值语法让FreeMarker直接输出插值中的值,而不是输出变量值.直接指定值可以是字符串,数值,布尔值,集合和map对象.

字符串

直接指定字符串值使用单引号或双引号限定。如果字符串值中包含特殊字符需要转义,看下面FreeMarker支持的转义字符:

转义字符 含义 \" 双引号 (u0022) \' 单引号 (u0027) \{ { \\ 反斜杠 (u005C) \n 换行 (u000A) \r 回车 (u000D) \t 制表符 (u0009) \b 退格键 (u0008) \f 换页符 (u000C) \l < \g > \a & \xCode 直接通过4位的16进制数来指定Unicode码,输出该unicode码对应的字符



如果某段文本中包含大量的特殊符号,FreeMarker提供了另一种特殊格式:可以在指定字符串内容的引号前增加r标记,在r标记后的文件将会直接输出.如下面的例子:

${r"${foo}"} ${r"C:\foo\bar"} 输出结果是: ${foo} C:\foo\bar 
数值

表达式中的数值直接输出,不需要引号.小数点使用”.”分隔,不能使用分组”,”符号.

布尔值

直接使用true和false,不使用引号.

集合

集合以方括号包括,各集合元素之间以英文逗号”,”分隔,例:

<#list ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday",    "Sunday"] as x>     ${x} </#list> 

集合元素也可以是表达式,例:

[2 + 2, [1, 2, 3, 4], "what"]

还可以使用数字范围定义数字集合,更有效率.注意:使用数字范围来定义集合时无需使用方括号.

语法 示例 start..end 1..4 == [1, 2, 3, 4]

4..1 == [4, 3, 2, 1] start.. 1..<4 == [1, 2, 3]

4..<1 == [4, 3, 2]

1..<1 == [] start..*length 10..*4 == [10, 11, 12, 13]

10..*-4 == [10, 9, 8, 7] start.. 1.. == [1, 2, 3, 4, 5, 6, ... ]
Map对象

Map对象使用花括号包括,Map中的key-value对之间以英文冒号”:”分隔,多组key-value对之间以英文逗号”,”分隔.如下面的例子:

{"语文":78, "数学":80} 

输出变量值

FreeMarker的表达式输出变量时,这些变量可以是顶层变量,也可以是Map对象中的变量,还可以是集合中的变量,并可以使用点(.)语法来访问Java对象的属性.

顶层变量

所谓顶层变量就是直接放在数据模型中的值,例如有如下数据模型:

Map root = new HashMap();root.put("name","annlee");   // name是一个顶层变量 
为了输出上面的name的值,可以使用如下语法: ${name}

注意:对于顶层变量,直接使用${variableName}来输出变量值,变量名只能是字母,数字,下划线,$,@和#的组合,且不能以数字开头号.

输出集合元素

如果需要输出集合元素,则可以根据集合元素的索引来输出集合元素,集合元素的索引以方括号指定.假设有集合:

["星期一","星期二","星期三","星期四","星期五","星期六","星期天"].  // 该集合名为week
如果需要输出星期三,则可以使用如下语法: ${week[2]}   // 输出第三个集合元素 

此外,FreeMarker还支持返回集合的子集合,如果需要返回集合的子集合,则可以使用如下语法:

week[3..5]   // 返回week集合的子集合,子集合中的元素是week集合中的第4-6个元素 
输出Map元素

这里的Map对象可以是直接HashMap的实例,甚至包括JavaBean实例,对于JavaBean实例而言,我们一样可以把其当成属性为key,属性值为value的Map实例.为了输出Map元素的值,可以使用点语法或方括号语法.假如有下面的数据模型:

Map root = new HashMap(); Book book = new Book(); Author author = new Author(); author.setName("Emmo");        // 设置作者姓名author.setAddress("Bei Jing"); // 设置作者地址book.setName("struts2");       // 设置书名book.setAuthor(author);        // 设置作者root.put("info","struts");     // 存书籍信息root.put("book", book);        // 存书籍

为了访问数据模型中名为struts2的书的作者的名字,可以使用如下语法:

book.author.name        //全部使用点语法 book["author"].name     //混合使用点语法和方括号语法 book.author["name"]      book["author"]["name"]  //全部使用方括号语法 

使用点语法时,变量名字有顶层变量一样的限制1,但方括号语法没有该限制,因为名字可以是任意表达式的结果.

参考链接:官方指南


  1. 顶层变量名只能是字母, 数字, 下划线, $, @ 和 #的组合, 且不能以数字开头号。 ↩
0 0
原创粉丝点击