freemarker 模板開發入門,freemarker模板
資料模型
scalars標量:從根 root 開始指定它的路徑,每級之間用點來分隔。
如:whatnot.fruits
sequences 序列:使用數組的方括弧方式來訪問一個序列的子變數。
如:animals[0].name,whatnot.fruits[1]
總結:
資料模型可以被看做是樹狀結構的。
標量儲存單一的值,這種類型的值可以是字串,數字,日期/時間或者是布爾值。
雜湊表是儲存變數和與其相關且有唯一標識名稱變數的容器。
序列是儲存有序變數的容器。儲存的變數可以通過數字索引來檢索,索引通常從零開始。
模板
${…}:FreeMarker 將會輸出真實的值來替換花括弧內的運算式,這樣的運算式被稱為interpolations 插值.
FTL tags 標籤(FreeMarker 模板的語言標籤):它們是 FreeMarker 的指令而且是不會直接輸出出來的東西。這些標籤的使用一般以符號#開頭。(使用者自訂的 FTL 標籤使用@符號來代替#)
Comments 注釋:FreeMarker 的注釋和 HTML 的注釋相似,但是它用<#--和-->來分隔的。任何介於這兩個分隔字元(包含分隔字元本身)之間內容會被 FreeMarker 忽略,就不會輸出出來了。
directives 指令:就是所指的 FTL 標籤。這些指令在 HTML 的標籤(如<table>和</table>)和 HTML 元素(如 table 元素)中的關係是相同的。(如果現在你還不能區分它們,那麼把“FTL 標籤”和“指令”看做是同義字即可。)
指令樣本
1 if 指令
<html> <head> <title>Welcome!</title> </head> <body> <h1> Welcome ${user}<#if user == "Big Joe">, our beloved leader</#if>! </h1> <p>Our latest product: <a href="${latestProduct.url}">${latestProduct.name}</a>! </body> </html>
我們來詳細說說 condition (條件判斷)的使用:==是來判斷在它兩側的值相等的操作符,比較的結果是布爾值,true 或者 false。在==的左側,是引用的變數,我們很熟悉這樣的文法,它會被變數的值來替代。右側是指定的字串,在模板中的字串必須放在引號內。
使用<#else>標籤可以指定當條件為假時程式執行的內容。
<#if animals.python.price < animals.elephant.price> Pythons are cheaper than elephants today. <#else> Pythons are not cheaper than elephants today. </#if>
如果變數本身就是布爾值(true 或者 false),那麼可以直接讓其作為 if 的條件
condition:
<#if animals.python.protected> Warning! Pythons are protected animals! </#if>
2 list 指令
當需要用列表來遍曆集合的內容時,list 指令是非常好用的。例如,如果在模板中用前面樣本描述序列的資料模型。
<p>We have these animals: <table border=1> <tr><th>Name<th>Price <#list animals as being> <tr><td>${being.name}<td>${being.price} Euros </#list> </table> list 指令的一般格式為:
<#list sequence as loopVariable>repeatThis</#list>
repeatThis 部分將會在給定的 sequence 遍曆時在每項中重複,從第一項開始,一個接著一個。在所有的重複中,loopVariable 將持有當前項的值。這個迴圈變數僅存在於<#list …>和</#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>
4 聯合使用指令
<p>We have these animals: <table border=1> <tr><th>Name<th>Price <#list animals as being> <tr> <td> <#if being.size == "large"><font size="+1"></#if> ${being.name} <#if being.size == "large"></font></#if> <td>${being.price} Euros </#list> </table>
5 處理不存在的變數
不論在哪裡引用變數,都可以指定一個預設值來避免變數丟失這種情況,通過在變數名後面跟著一個!和預設值。就像下面的例子,當 user 從資料模型中丟失時,模板將會將user 的值表示為字串”Anonymous”。(若 user 並沒有丟失,那麼模板就會表現
出”Anonymous”不存在一樣):
<h1>Welcome ${user!"Anonymous"}!</h1> 當然也可以在變數名後面通過放置??來詢問 FreeMarker 一個變數是否存在。將它和 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)??來看。
freemarker初學
自己寫的,freemarker需要載入這個模板檔案,然後與資料結合,產生HTML
freemarker設定模板路徑問題,看清問題了在回答,不要答非所問
reqeust.getRealPath("/") + "ftl"