FreeMarker

简介
  1. FreeMarker是一款模板引擎,可以基于模板和要改变的数据来生成输出文本,因为不需要知道数据从哪里来,所以可以专注于如何展现数据。
  2. 核心概念:模板+数据模型=输出 。模板文件放在Web服务器上,就像静态HTML一样,当有人来访问时,FreeMarker介入执行,动态转换模板,将最新的数据内容替换模板中的${…}部分。注意:FreeMarker并不是去查找数据库,只是将后端传来的参数与页面中的标记进行替换。为模板准备的数据整体叫 数据模型。
  3. 数据模型是树形的,目录是hashes,存储单值的变量scalars,另一种变量sequences像顺序一样存储数据没有名字,只能用下标来寻找。可以用’.'来连接下一级,类型有:字符串,数字,日期/时间,布尔值四种类型。
模板一览
  1. FreeMarker使用${…}的方式添加数据,这个表达式称为interpolation
  2. FreeMarker提供FTL标签,以#开头,不会被输出到页面。(用户自定义以@开头)
  3. 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中的一些常用运算符