FreeMarker 那一眸我看懂了你
来源:互联网 发布:淘宝试用在哪 编辑:程序博客网 时间:2024/04/30 07:52
FreeMarker模板引擎:Java库基于模板和变化的数据来生成文本输出(HTML网页,电子邮件,配置文件,源代码,等等)。模板使用FreeMarker模板语言(FTL),这是一个简单的、专门的语言(而不是一个完整的编程语言如PHP)。你为了将准备的数据显示在一个真正的编程语言,就像数据库查询问题,然后模板将已经准备好的数据按指定格式显示。你仅仅需要专注于如何呈现数据, 和你关注哪些数据。Just like:Template + data-model = output
.
FreeMarker简介
FreeMarker模板文件主要由如下4个部分组成:
<!-- 示例: --><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的插值有如下两种类型:
- 通用插值${expr};
- 数字格式化插值:#{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"]
还可以使用数字范围定义数字集合,更有效率.注意:使用数字范围来定义集合时无需使用方括号.
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,但方括号语法没有该限制,因为名字可以是任意表达式的结果.
参考链接:官方指南
- 顶层变量名只能是字母, 数字, 下划线, $, @ 和 #的组合, 且不能以数字开头号。 ↩
- FreeMarker 那一眸我看懂了你
- 如果看了这篇文章你还不懂傅里叶变换,那就过来掐死我吧(一)
- 如果看了这篇文章你还不懂傅里叶变换,那就过来掐死我吧(一)
- 那一年,我大一,你研一
- 放弃你那一刻我真的哭了!
- 放弃你的那一刻我真的哭了
- 看懂了这些图你就看懂了整个世界
- 那一夜,我听了一宿梵唱
- 那一夜, 我懂了视频帧
- 三分钟电话~!你看懂了吗????
- 看懂这道题,你就学会指针了!!!
- 《大话西游》你真的看懂了吗?
- 某个人,告诉你,失去你的那一刻我哭了!
- 你能等 到那。我还会不愿意吗 你会不会都结婚了
- “妈,我不想吃大腰子了”“那你把这个给我戴上” | 钛空精分小剧场
- 那一年,我去了清华园,你去了阿里巴巴
- 快说那 3 个字,说了我就是你的人了
- 主管叫我看tcpmp播放器,下面几行代码1月没看懂,求求你了,
- VS2010 如何使用宏添加注释
- 在一个字符串中找到第一个只出现一次的字符
- 蒙板缓存和蒙板测试
- 线段树经典操作模板(单点更新,替换;区间更新,替换;区间求和求最值)
- downgrade node homebrew
- FreeMarker 那一眸我看懂了你
- 07-30 数组
- C++ string 与其他类型的转换
- JPA实体管理器
- 'WSGIRequest' object has no attribute 'user'
- 深入剖析Java中的装箱和拆箱
- putty
- Django-1.8.3新建一个简单的News app——01初探urls views
- MySQL 事务没有提交导致 锁等待 Lock wait timeout exceeded