1. 程式人生 > >FreeMarker初級攻略

FreeMarker初級攻略

1. 備忘單

字串:"Foo" 或者 'Foo' 或者 "It's \"quoted\"" 或者 r"C:\raw\string"
 數字:123.45 <#list[BR] animals as[BR] being[BR] >[BR] ${being.name} for ${being.price} Euros[BR] </#list >
 布林值:true, false
 序列:["foo", "bar", 123.45], 1..100
 雜湊表:{"name":"green mouse", "price":150}
 檢索變數
 頂層變數:user
 從雜湊表中檢索資料:user.name, user[“name”]
 從序列中檢索:products[5]
 特殊變數:.main
 字串操作
 插值(或連線):"Hello ${user}!"(或"Free" + "Marker")
 獲取一個字元:name[0]
 序列操作
 連線:users + ["guest"]
 序列切分:products[10..19] 或 products[5..]
 雜湊表操作
 連線:passwords + {"joe":"secret42"}
 算數運算: (x * 1.5 + 10) / 2 - y % 100
 比較運算:x == y, x != y, x < y, x > y, x >= y, x <= y, x &lt; y, 等等
 邏輯操作:!registered && (firstVisit || fromEurope)
 內建函式:name?upper_case
 方法呼叫:repeat("What", 3)
 處理不存在的值
 預設值:name!"unknown" 或者(user.name)!"unknown" 或者name! 或者 (user.name)!
 檢測不存在的值:name?? 或者(user.name)??

2.字串操作

插值(或連線)

${...}   ${"${user}${user}${user}${user}"}

${user[0]}  等同 user?string[0]

3.序列操作

<#list ["Joe", "Fred"] + ["Julia", "Kate"] as user>
- ${user}
</#list>

序列切分

[firstindex..lastindex]    。如果seq儲存序列"a", "b", "c", "d", "e", "f",那麼表示式seq[1..4]將會是含有"b", "c", "d", "e"的序列  ,從FreeMarker 2.3.3版本以後lastindex才能省略。

4.雜湊表操作

<#assign ages = {"Joe":23, "Fred":25} + {"Joe":30, "Julia":18}>
- Joe is ${ages.Joe}
- Fred is ${ages.Fred}
- Julia is ${ages.Julia}

列印

- Joe is 30
- Fred is 25
- Julia is 18

5.算數運算

算數運算包含基本的四則運算和求模運算,運算子有:
 加法:+
<#assign ages = {"Joe":23, "Fred":25} + {"Joe":30, "Julia":18}>
- Joe is ${ages.Joe}
- Fred is ${ages.Fred}
- Julia is ${ages.Julia}
- Joe is 30
- Fred is 25
- Julia is 18
 減法:-
 乘法:*
 除法:/
 求模(求餘):%

${100 – x*x}
${x/2}
${12%10}

+號,它可用來連線字串的  ${3 + "5"} --》 35    FreeMarker不會自動將字串轉換為數字,反之會自動進行

${(x/2)?int}   計算結果的整數

比較運算

<#if user = "Big Joe">
It is Big Joe
</#if>
<#if user != "Big Joe">
It is not Big Joe
</#if>

<#if (x > y)>   等同  <#if x &gt; y>

可以使用lt代替<,lte代替<=,gt代替>,gte代替>=

常用的邏輯操作符:
 邏輯或:||
 邏輯與:&&
 邏輯非:!

6.內建函式

字串使用的內建函式:
 html: 字串中所有的特殊HTML字元都需要用實體引用來代替(比如<代替&lt;)。
 cap_first:字串的第一個字母變為大寫形式
 lower_case:字串的小寫形式
 upper_case:字串的大寫形式
 trim:去掉字串首尾的空格
序列使用的內建函式:
 size:序列中元素的個數
數字使用的內建函式:
 int:數字的整數部分(比如-1.9?int就是-1)

7.方法呼叫

${repeat("What", 3)}   列印WhatWhatWhat

8.處理不存在的值     FreeMarker 2.3.7版本以後(用來代替內建函式default,exists和if_exists)。

這會出現undefinded

9.預設值

unsafe_expr!default_expr或unsafe_expr!或(unsafe_expr)!default_expr或(unsafe_expr)!
這個操作符允許你為可能不存在的變數指定一個預設值或空值空序列空雜湊。

建議使用(unsafe_expr)!default_expr或(unsafe_expr)!  不管多少層裡面多少操作,出錯就變預設值

允許其中表達式的任意部分可以未定義

如 (something.product.color)!"red"     something為null也預設為red

10.檢測不存在的值

unsafe_expr??或(unsafe_expr)??

11.操作符優先順序規則 同java javascript

12.插值僅僅可以在兩種位置使用:

文字區(如<h1>Hello ${name}!</h1>)和字串表示式(如<#include "/footer/${company}.html">)中

如果插值在文字區(也就是說,不再字串表示式中),如果escapse指令起作用了,即將被插入的字串會被自動轉義。如果你要生成HTML,那麼強烈建議你利用它來阻止跨站指令碼攻擊和非格式良好的HTML頁面。

<#escape x as x?html>
...
<p>Title: ${book.title}</p>
<p>Description: <#noescape>${book.description}</#noescape></p>
<h2>Comments:</h2>
<#list comments as comment>
<div class="comment">
${comment}
</div>
</#list>
...
</#escape>

美式數字格式  ${product.id?c}   給機器看的

日期/時間插入指南

date_format,time_format和datetime_format的setting   

布林值插入指南

${married?string("yes", "no")}     後面的會出錯${a == 2}

精確的轉換規則
對於有興趣研究的人,表示式的值轉換為字元(仍有變數不存在的可能)串精確的規則就是下面這些,以這個順序進行:
1. 如果這個值是數字,那麼它會按照指定的number_format設定規則來轉換為字串。所以這些轉換通常是對使用者進行的,而不是對計算機。
2. 如果這個值是日期,時間或時間日期型別的一種,那麼它們會按照指定的time_format,date_format和datetime_format設定規則來轉換為字串,這要看日期資訊中是隻包含時間,日期還是全包括了。如果它不能被探測出來是哪種日期型別(日期或時間或日期時間)時,就會發生錯誤了。
3. 如果值本來就是字串型別的,不需要轉換。
4. 如果FreeMarker引擎在傳統相容模式下:
1. 如果值是布林型別,那麼就轉換成”true”,false值將會轉換為空串。
2. 如果表示式未被定義(null或者變數未定義),那麼就轉換為空串。
3. 否則就會發生錯誤中止模板執行。
5. 否則就會發生錯誤中止模板執行。

序列的索引

<#if (secondGoodsCategoryT3??)&&(secondGoodsCategoryT3?size>0) >
        <#list secondGoodsCategoryT3 as second3>  

        <#if  second3_index == 0>
        <a href="${basepath}/${second3.htmlpath}}" target="_blank">${second3.name}</a>      

       </#if> 
        <#if second3_has_next>
        | 
        </#if>                                     
        </#list>
        </#if>