FreeMarker學習記錄

目錄

1.if標籤

2.List標籤

3.include 指令

4.使用內建函數

5.處理不存在的變量

1.if標籤

<#if animals.python.price < animals.elephant.price>

Pythons are cheaper than elephants today.

<#elseif animals.elephant.price < animals.python.price>

Elephants are cheaper than pythons today.

<#else>

Elephants and pythons cost the same today.

</#if>

在模板中可以用${user}來獲取user的值,在if標籤中只需要將user放入條件即可無需加上${user}。

 

2.List標籤

<p>We have these animals:

<table border=1>

<#list animals as animal>

<tr><td>${animal.name}<td>${animal.price} Euros

</#list>

</table>

1.list 指令的一般格式爲: <#list sequence as loopVariable>repeatThis</#list>。 repeatThis 部分將會在給定的 sequence 遍歷時在每一項中重複, 從第一項開始,一個接着一個。在所有的重複中, loopVariable 將持有當前遍歷項的值。 這個變量僅存在於 <#list ...> 和 </#list> 標籤內。

sequence 可以是任意表達式, 比如我們可以列表顯示示例數據模型中的水果,就像這樣:

<ul> <#list misc.fruits as fruit> <li>${fruit} </#list> </ul>

你應該很熟悉表達式 misc.fruits 了; 它 引用了數據模型中的變量

 

2.上面示例中的一個問題是如果我們有0個水果,它仍然會輸出一個空的 <ul></ul>,而不是什麼都沒有。 要避免這樣的情況,可以這麼來使用 list:

<#list misc.fruits> <ul> <#items as fruit> <li>${fruit} </#items> </ul> </#list>

此時, list 指令將列表視爲一個整體, 在 items 指令中的部分纔會爲每個水果重複。 如果我們有0個水果,那麼在 list 中的所有東西都被略過了, 因此就不會有 ul 標籤了。

 

3.另一個列表相關的常見任務是:使用一些分隔符來列出水果,比如逗號:

<p>Fruits: <#list misc.fruits as fruit>${fruit}<#sep>, </#list>

<p>Fruits: orange, banana

被 sep 覆蓋的部分(我們也可以這麼來寫: ...<#sep>, </#sep></#list>) 只有當還有下一項時纔會被執行。 因此最後一個水果後面不會有逗號。

 

 list 指令,也像 if 指令那樣,可以有 else 部分,如果列表中有0個元素時就會被執行:

<p>Fruits: <#list misc.fruits as fruit>${fruit}<#sep>, <#else>None</#list>

Note:

事實上,這個過於簡單的示例可以這麼來寫, 但是它使用了本主題中沒有介紹的語言特性:

<p>Fruits: ${fruits?join(", ", "None")}

所有的這些指令(list, items, sep, else)可以聯合起來使用:

<#list misc.fruits> <p>Fruits: <ul> <#items as fruit> <li>${fruit}<#sep> and</#sep> </#items> </ul> <#else> <p>We have no fruits. </#list>

 

3.include 指令

使用 include 指令, 我們可以在模板中插入其他文件的內容。

假設要在一些頁面中顯示版權聲明的信息。那麼可以創建一個文件來單獨包含這些版權聲明, 之後在需要它的地方插入即可。比方說,我們可以將版權信息單獨存放在頁面文件 copyright_footer.html 中:

<hr> <i> Copyright (c) 2000 <a href="http://www.acmee.com">Acmee Inc</a>, <br> All Rights Reserved. </i>

當需要用到這個文件時,可以使用 include 指令來插入:

<html> <head> <title>Test page</title> </head> <body> <h1>Test page</h1> <p>Blah blah... <#include "/copyright_footer.html"> </body> </html>

此時,輸出的內容爲:

<html> <head> <title>Test page</title> </head> <body> <h1>Test page</h1> <p>Blah blah... <hr> <i> Copyright (c) 2000 <a href="http://www.acmee.com">Acmee Inc</a>, <br> All Rights Reserved. </i> </body> </html>

當修改了 copyright_footer.html 文件, 那麼訪問者在所有頁面都會看到版權聲明的新內容。

 

聯合使用指令

在頁面上也可以多次使用指令,而且指令間也可以很容易地相互嵌套。 比如,在 list 指令中嵌套 if 指令:

<#list animals as animal> <div<#if animal.protected> class="protected"</#if>> ${animal.name} for ${animal.price} Euros </div> </#list>

 

4.使用內建函數

內建函數很像子變量(如果瞭解Java術語的話,也可以說像方法), 它們並不是數據模型中的東西,是 FreeMarker 在數值上添加的。 爲了清晰子變量是哪部分,使用 ?(問號)代替 .(點)來訪問它們。常用內建函數的示例:

  • user?html 給出 user 的HTML轉義版本, 比如 & 會由 &amp; 來代替。
  • user?upper_case 給出 user 值的大寫版本 (比如 "JOHN DOE" 來替代 "John Doe")
  • animal.name?cap_first 給出 animal.name 的首字母大寫版本(比如 "Mouse" 來替代 "mouse")
  • user?length 給出 user 值中 字符的數量(對於 "John Doe" 來說就是8)
  • animals?size 給出 animals 序列中 項目 的個數(我們示例數據模型中是3個)
  • 如果在 <#list animals as animal> 和對應的 </#list> 標籤中:
    • animal?index 給出了在 animals 中基於0開始的 animal的索引值
    • animal?counter 也像 index, 但是給出的是基於1的索引值
    • animal?item_parity 基於當前計數的奇偶性,給出字符串 "odd" 或 "even"。在給不同行着色時非常有用,比如在 <td class="${animal?item_parity}Row">中。

一些內建函數需要參數來指定行爲,比如:

  • animal.protected?string("Y", "N") 基於 animal.protected 的布爾值來返回字符串 "Y" 或 "N"。
  • animal?item_cycle('lightRow','darkRow') 是之前介紹的 item_parity 更爲常用的變體形式。
  • fruits?join(", ") 通過連接所有項,將列表轉換爲字符串, 在每個項之間插入參數分隔符(比如 "orange,banana")
  • user?starts_with("J") 根據 user 的首字母是否是 "J" 返回布爾值true或false。

內建函數應用可以鏈式操作,比如user?upper_case?html 會先轉換用戶名到大寫形式,之後再進行HTML轉義。(這就像可以鏈式使用 .(點)一樣)

可以閱讀 全部內建函數參考

 

5.處理不存在的變量

數據模型中經常會有可選的變量(也就是說有時並不存在)。 除了一些典型的人爲原因導致失誤外,FreeMarker 絕不能容忍引用不存在的變量, 除非明確地告訴它當變量不存在時如何處理。這裏來介紹兩種典型的處理方法。

這部分對程序員而言: 一個不存在的變量和一個是 null 值的變量, 對於FreeMarker來說是一樣的,所以這裏所指的"丟失"包含這兩種情況。

不論在哪裏引用變量,都可以指定一個默認值來避免變量丟失這種情況, 通過在變量名後面跟着一個 !(歎號,譯者注)和默認值。 就像下面的這個例子,當 user 不存在於數據模型時, 模板將會將 user 的值表示爲字符串 "visitor"。(當 user 存在時, 模板就會表現出 ${user} 的值):

<h1>Welcome ${user!"visitor"}!</h1>

也可以在變量名後面通過放置 ?? 來詢問一個變量是否存在。將它和 if 指令合併, 那麼如果 user 變量不存在的話將會忽略整個問候的代碼段:

<#if user??><h1>Welcome ${user}!</h1></#if>

 

關於多級訪問的變量,比如 animals.python.price, 書寫代碼:animals.python.price!0 當且僅當 animals.python 永遠存在, 而僅僅最後一個子變量 price 可能不存在時是正確的 (這種情況下我們假設價格是 0)。 如果 animals 或 python 不存在, 那麼模板處理過程將會以"未定義的變量"錯誤而停止。爲了防止這種情況的發生, 可以如下這樣來編寫代碼 (animals.python.price)!0。 這種情況就是說 animals 或 python 不存在時, 表達式的結果是 0。對於 ?? 也是同樣用來的處理這種邏輯的; 將 animals.python.price?? 對比(animals.python.price)??來看。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章