學習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,那麼就不會引發混亂了,由於兩個模 板使用了不一樣 的命名空間 。