模板一覽html
最簡單的模板是普通的HTML文件(或者是其餘任何文本文件--freemarker自己不屬於HTML)。當客戶端訪問頁面時,freemarker要發送HTML代碼至客戶端瀏覽器端顯示。若是想要頁面動起來,就要在HTML中放置能被freemarker所解析的特殊部分。python
${...}:freemarker將會輸出真實的值來替換花括號內的表達式,這樣的表達式被稱爲interpolations插值,能夠參考第上面示例的內容。程序員
FTL tags標籤(freemarker模板的語言標籤):FTL標籤和HTML標籤有一點類似,可是它們是freemarker的指令並且是不會直接輸出出來的東西。這些標籤的使用通常以符號#開頭。(用戶自定義的FTL標籤使用@符號來代替#,但這是更高級的主題內容了)瀏覽器
comments註釋:freemarker的註釋和HTML的註釋類似,可是它用<#--和-->來分隔的。任何介於這兩個分隔符(包含分隔符自己)之間內容會被freemarker忽略,就不會輸出出來了。oop
其餘任何不是FTL標籤,插值或者註釋的內容將被視爲靜態文本,這些東西就不會被FreeMarker所解析,會被按照原樣輸出出來。字體
directives 指令:就是所指訂的FTL標籤。這些指令在HTML的標籤(如<table>和</table>)和HTML元素(如table元素)中的關係是相同的。(若是如今你還不能區分它們,那麼把「FTL標籤」和「指令」看作是同義詞便可。)url
指令示例htm
儘管FreeMarker有不少指令,做爲入門,在快速瞭解過程當中咱們僅僅來看三個最爲經常使用的指令。blog
1.if指令字符串
使用if指令能夠有條件地跳過模板的一部分,這和程序語言中的if是類似的。假設在第一個示例中,你只想向你的老闆Big Joe(而不是其餘人)問好,就能夠這樣作:
<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>
在這裏,咱們告訴FreeMarker,咱們尊敬的領導纔是if條件中那惟一的user變量值,當它和「Big Joe」相同時才顯示出來。那麼,當condition的判斷結果爲false(布爾值)時,在<#if condition>和</if>標籤之間的內容將會被略過。
咱們詳細來講說condition的使用:==是來判斷在它兩側的值相等的操做符,比較的結果是布爾值,true或者false。在==的左側,是引用變量,咱們很熟悉這樣的語法,它會被變量的值來替代。右側是指定的字符串,在模板中的字符串必須放在引號內。
當price是0的時候,下面的代碼將會打印:「Pythons are free today!」
<#if animals.python.price == 0> Pythons are free today! </#if>
和前面的示例很類似,字符串被直接指定,可是這裏則是數字(0)被直接指定。注意到數字是不用放在引號內的。若是將0放在引號內(「0」),FreeMarker就會將其誤判爲字符串了。
當price不是0的時候,下面的代碼將會打印:「Pythons are not free today!」
<#if animals.python.price != 0> Pythons are free today! </#if>
你也許會猜想了,!=就是不等於。
你也能夠這樣來寫代碼(使用數據模型來描述哈希表變量):
<#if animals.python.price < animals.elephant.price> Pythons are cheaper than elephants today. </#if>
使用<#else>標籤能夠指定當條件爲假時程序執行的內容。例如:
<#if animals.python.price < animals.elephant.price> Pythons are cheaper than elephants today. <#else> Pythons are not cheaper than elephants today. </#if>
若是蟒蛇的價格比大象的價格低,將會打印「Python are cheaper than elephonts today.」,不然就會打印「Pythons are not cheaper than elephants today.」
若是變量自己就是布爾值(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>
那麼輸出結果將會是這樣的:
<p>We have these animals: <table border=1> <tr><th>Name<th>Price <tr><td>mouse<td>50 Euros <tr><td>elephant<td>5000 Euros <tr><td>python<td>4999 Euros </table>
list指令的通常格式爲:
<#list sequence as loopVariable>repeatThis</#list>
repeatThis部分將會在給定的sequence遍歷時在每項中重複,從第一項開始。一個接一個。在全部的重複中,loopVariable將持有當前項的值。這個循環變量僅存在於<#list...>和</#list>標籤之間。
3.include指令
使用include指令,咱們能夠在當前的模板中插入其餘文件的內容。
假設要在一些頁面中顯示版權聲明的信息。那麼能夠建立一個文件夾來單獨包含版權聲明,以後在須要它的地方插入便可。比方說,咱們能夠將版權信息單獨存放在頁面文件copy_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>
4.聯合使用指令
在頁面也能夠屢次使用指令,並且指令間能夠相互嵌套,正如在HTML元素中嵌套使用標籤同樣。下面的代碼會遍歷動物集合,用大號字體來打印大型動物的名字。
<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>
注意到FreeMarker並不解析FTL標籤外的文本,插值和註釋,當條件不知足時它也會忽略全部嵌套的font標籤。
5.處理不存在的變量
在實際應用中數據模型常常會有可選的變量(也就是說有時可能不存在實際值)。除了一些典型的人爲緣由致使失誤,FreeMarker不能容忍引用不存在的變量,除非明確地告訴它當變量不存在時如何處理。這裏介紹兩種典型的處理方法。
這部分對程序員而言:一個不存在的變量和一個是null的變量,對於FreeMarker來講是同樣的,因此這裏所指的丟失包含這兩種狀況。
不論在哪裏引用變量,均可以指定一個默認值來避免變量丟失這種狀況,經過在變量名後面跟一個!和默認值。就像下面的例子,當user從數據模型中丟失時,模板將會將user的值表示爲字符串「Anonymous」。(若user並無丟失,那麼模板就會表現出「Anonymous」不存在同樣):
<h1>Welcome ${user!"Anonymous"}!</h1>
固然也能夠在變量名後面經過放置??來詢問FreeMarker一個變量是否存在。將它和if指令合併,那麼若是user變量不存在的話將會忽略整個問候代碼段:
<#if user??><h1>Welcome ${user}!</h1></#if>
關於多級訪問的變量,好比animal.python.price,書寫代碼:animal.python.price!0,僅當animal.python存在而僅僅最後一個子變量price可能不存在(這種狀況下咱們假設價格是0)。若是animals或者python不存在,那麼模板處理過程將會以「未定義的變量」錯誤而中止。爲了防止這種狀況發生,能夠這樣來書寫代碼(animals.python.price)!0。這種狀況下當animals或Python不存在時表達式的結果仍然是0。對於??也是一樣用來的處理這種邏輯的:animals.python.price??對比(animals.python.price)??來看。