学习Freemarker,把其中比较容易忘记的点记录下:
<h1>Welcome ${user!"Anonymous"}!</h1>
当user从数据模型中丢失或为空时,模板将会将user的值表示为字符串"Anonymous"。
<#if user??><h1>Welcome ${user}!</h1></#if>
变量名后面通过放置??来询问 FreeMarker 一个变量是否存在。
(animals.python.price)!0。这种情况下当animals或python不存在时表达式的结果仍然是0。对于??也是同样用来的处理这种逻辑的:可以animals.python.price??对比(animals.python.price)??来看。
原生字符串
${r"${foo}"} 结果${foo}
${r"C:\foo\bar"} 结果C:\foo\bar
使用>=和>的时候有一点小问题。FreeMarker 解释>的时候可以把它当作 FTL 标签的结束符。为了避免这种问题,不得不将表达式放到括号内:<#if (x > y)>,或者可以在比较关系处使用>和<:<#if x > y>。
模板语言中没有 null这个概念。比如有一个 bean,bean 中有一个 maidenName属性,对于模板而言(假设你没有配置FreeMarker 来使用一些极端的对象包装),这个属性的值是 null,和不存在这个属性的情况是一致的。
一个常犯的错误是在不能使用插值的地方使用了它。典型的错误就是<#if ${isBig}>Wow!</#if>,这是语法上的错误。只要写为<#if isBig>Wow!</#if>就对了,而且<#if "${isBig}">Wow!</#if>也是错误的,因为这样参数就是字符串类型了,但是 if 指令的参数要求是布尔值,所以运行时就会发生错误。
<#macro greet person>
<font size="+2">Hello ${person}!</font>
</#macro>
那么就可以这样来使用这个宏
<@greet person="Fred"/> and <@greet person="Batman"/>
这和 HTML 的语法是很相似的,它会打印出:
<font size="+2">Hello Fred!</font> and <font size="+2">Hello Batman!</font>
自定义指令可以有多个参数。如下所示,再添加一个新的参数 color:
<#macro greet person color>
<font size="+2" color="${color}">Hello ${person}!</font>
</#macro>
那么,这个宏就可以这样来使用( 参数的顺序不重要):<@greet person="Fred" color="black"/>
<#macro do_thrice>
<#nested 1>
<#nested 2>
<#nested 3>
</#macro>
<@do_thrice ; x> <#-- 用户自定义指令 使用";"代替"as" -->
${x} Anything.
</@do_thrice>
将会输出:
1 Anything.
2 Anything.
3 Anything.
使用另一个模板文件中定义的宏,import 指令来代替 include
定义:
<#macro copyright date>
<p>Copyright (C) ${date} Julia Smith. All rights reserved.</p>
</#macro>
<#assign mail = "jsmith@acme.com">
使用:
<#import "/lib/my_test.ftl" as my>
<#-- 被称为"my"的哈希表就会是那个"大门" -->
<@my.copyright date="1999-2002"/>
${my.mail}
要注意它是怎么访问为 lib/my_test.ftl 创建的命名空间中的变量的,通过新创建的哈希表,my。那么将会打印出:
<p>Copyright (C) 1999-2002 Julia Smith. All rights reserved.</p>
jsmith@acme.com
如果在主命名空间中有一个变量,名为 mail 或 copyright,那么就不会引起混乱了,因为两个模 板使用了不同 的命名空间 。