freemarker(二)


模板一覽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)??來看。

相關文章
相關標籤/搜索