学习Freemarker,把其中比较容易忘记的点记录下: python
<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)??来看。 shell
原生字符串
${r"${foo}"} 结果${foo}
${r"C:\foo\bar"} 结果C:\foo\bar
ide
使用>=和>的时候有一点小问题。FreeMarker 解释>的时候能够把它看成 FTL 标签的结束符。为了不这种问题,不得不将表达式放到括号内:<#if (x > y)>,或者能够在比较关系处使用>和<:<#if x > y>。 学习
模板语言中没有 null这个概念。好比有一个 bean,bean 中有一个 maidenName属性,对于模板而言(假设你没有配置FreeMarker 来使用一些极端的对象包装),这个属性的值是 null,和不存在这个属性的状况是一致的。 spa
一个常犯的错误是在不能使用插值的地方使用了它。典型的错误就是<#if ${isBig}>Wow!</#if>,这是语法上的错误。只要写为<#if isBig>Wow!</#if>就对了,并且<#if "${isBig}">Wow!</#if>也是错误的,由于这样参数就是字符串类型了,可是 if 指令的参数要求是布尔值,因此运行时就会发生错误。 code
<#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"/> xml
<#macro do_thrice> <#nested 1> <#nested 2> <#nested 3> </#macro> <@do_thrice ; x> <#-- 用户自定义指令 使用";"代替"as" --> ${x} Anything. </@do_thrice>将会输出:
使用另外一个模板文件中定义的宏,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,那么就不会引发混乱了,由于两个模 板使用了不一样 的命名空间 。