FreeMarker
简介
- FreeMarker是一款模板引擎,可以基于模板和要改变的数据来生成输出文本,因为不需要知道数据从哪里来,所以可以专注于如何展现数据。
- 核心概念:模板+数据模型=输出 。模板文件放在Web服务器上,就像静态HTML一样,当有人来访问时,FreeMarker介入执行,动态转换模板,将最新的数据内容替换模板中的${…}部分。注意:FreeMarker并不是去查找数据库,只是将后端传来的参数与页面中的标记进行替换。为模板准备的数据整体叫 数据模型。
- 数据模型是树形的,目录是hashes,存储单值的变量scalars,另一种变量sequences像顺序一样存储数据没有名字,只能用下标来寻找。可以用’.'来连接下一级,类型有:字符串,数字,日期/时间,布尔值四种类型。
模板一览
- FreeMarker使用${…}的方式添加数据,这个表达式称为interpolation
- FreeMarker提供FTL标签,以#开头,不会被输出到页面。(用户自定义以@开头)
- FreeMarker以<#-- -->的形式进行注释,这个注释不会被输出到用户页面。会被FreeMarker忽略掉。
一些符号
不存在判断
- ${param??} 判断变量是否存在,返回boolean
- ${param!} 判断变量是否存在,返回空串、长度为0的集合或Map对象
- ${param!“abc”}判断变量是否存在,如果不存在则为默认值。
内建函数(文档)
- ${obj?method()} 对象与方法直接用问号分隔。方法没有参数的话可以不写括号,${obj?mehtod}。
创建变量
<#assign mouse=“Jerry”> 创建了一个name为mouse,值为Jerry的变量。
极端使用情况,在标签之间的内容全部成为变量
<#macro myMacro>foo</#macro>
<#assign x>
<#list 1..3 as n>
${n} <@myMacro />
</#list>
</#assign>
Number of words: ${x?word_list?size}
${x}
输出:
<#-- Number of words: 6 -->
<#-- 1 foo -->
<#-- 2 foo -->
<#-- 3 foo -->
word_list是字符串内建函数,是字符串中所有单词(以空格分隔的东西)的序列。
快速浏览(备忘单)
这里给已经了解 FreeMarker 的人或有经验的程序员的提个醒:
- 直接指定值
- 字符串: "Foo" 或者 'Foo' 或者 "It's \"quoted\"" 或者 'It\'s "quoted"' 或者 r"C:\raw\string"
- 数字: 123.45
- 布尔值: true, false
- 序列: ["foo", "bar", 123.45]; 值域: 0..9, 0..<10 (或 0..!10), 0..
- 哈希表: {"name":"green mouse", "price":150}
- 检索变量
- 顶层变量: user
- 从哈希表中检索数据: user.name, user["name"]
- 从序列中检索数据: products[5]
- 特殊变量: .main
- 字符串操作
- 插值(或连接): "Hello ${user}!" (或 "Hello " + user + "!")
- 获取一个字符: name[0]
- 字符串切分: 包含结尾: name[0..4],不包含结尾: name[0..<5],基于长度(宽容处理): name[0..*5],去除开头: name[5..]
- 序列操作
- 连接: users + ["guest"]
- 序列切分:包含结尾: products[20..29], 不包含结尾: products[20..<30],基于长度(宽容处理): products[20..*10],去除开头: products[20..]
- 哈希表操作
- 连接: passwords + { "joe": "secret42" }
- 算术运算: (x * 1.5 + 10) / 2 - y % 100
- 比较运算: x == y, x != y, x < y, x > y, x >= y, x <= y, x lt y, x lte y, x gt y, x gte y, 等等。。。。。。
- 逻辑操作: !registered && (firstVisit || fromEurope)
- 内建函数: name?upper_case, path?ensure_starts_with('/')
- 方法调用: repeat("What", 3)
- 处理不存在的值:
- 默认值: name!"unknown" 或者 (user.name)!"unknown" 或者 name! 或者 (user.name)!
- 检测不存在的值: name?? 或者 (user.name)??
- 赋值操作: =, +=, -=, *=, /=, %=, ++, --
自定义指令(#macro)
概要
宏是有一个变量名的模板片段。可以在模板中使用宏作为自定义指令, 这样就能进行重复性的工作。
变量会在模板开始时被创建;而不管 macro 指令放置在模板的什么位置。
参数
<#macro name param1 param2 ... paramN>
...
<#nested loopvar1, loopvar2, ..., loopvarN>
...
<#return>
...
</#macro>
- name 是指令的命名。
- param 是指令的参数,…表示可变长参数。没有被匹配到的参数会形成一个哈希表,命名为paramN。没有赋初始值的参数,在调用时必须赋值不然报错,并且在定义时要写在前面。
- <#nested> 是嵌套标签,在调用时会用调用标签内容替换<#nested>。loopvar 是嵌套内容的参数,在调用时可以使用,在调用中在‘;’后面。
- 在其中也支持其他语句如 if list等
实例
一个简单的例子:
<#macro test foo bar baaz>
Test text, and the params: ${foo}, ${bar}, ${baaz}
</#macro>
<#-- call the macro: -->
<@test foo="a" bar="b" baaz=5*5-2/>
<#-- output: Test text, and the params: a, b, 23 -->
一个较为复杂的例子:
<#macro repeat count>
<#list 1..count as x>
<#nested x, x/2, x==count>
</#list>
</#macro>
<#-- call the macro: -->
<@repeat count=4 ; c, halfc, last>
${c}. ${halfc}<#if last> Last!</#if>
</@repeat>
<#-- output: Test text, and the params: a, b, 23 -->
记录
处理日期格式 value="${(vmpRepair.operateTime?string(“yyyy-MM-dd”))}"。
从后端传来的值,value="${vmpRepair.totalCost!}",要加上 ! 判断非空,并且在JS中要写在引号里面,不然会有语法错误。var name = “${vmpRepair.driverName!}”。
扩展资料
FreeMarker中的一些常用运算符