天天看點

FreeMarker幫助手冊

FreeMarker學習1(Ftl)

2008-07-31 13:47

<# ... > 中存放所有freemaker的内容,之外的内容全部原樣輸出。
<@ ... /> 是函數調用
 兩個定界符内的内容中,第一個符号表示指令或者函數名,其後的跟随參數。freemaker提供的控制包括如下:
<#if condition><#elseif condition><#else></#if> 條件判斷
<#list hash_or_seq as var></#list> 周遊hash表或者collection(freemaker稱作sequence)的成員
<#macro name param1 param2 ... ><#nested param></#macro> 宏,無傳回參數
<#function name param1 param2><#return val></#function>函數,有傳回參數
var?member_function(...) 用函數對var進行轉換,freemaker稱為build-ins。實際内部實作類似member_function(var, ...)
stringA[M .. N] 取子字元串,類似substring(stringA, M, N)
{key:value, key2:value2 ...} 直接定義一個hash表
[item0, item1, item2 ...] 直接定義一個序列
hash0[key0] 存取hash表中key對應的元素
seq0[5] 存取序列指定下标的元素
<@function1 param0 param1 ... /> 調用函數function1
<@macro0 param0 param1 ; nest_param0 nest_param1 ...> nest_body < /@macro> 調用宏,并處理宏的嵌套
<#assign var = value > 定義變量并初始化
<#local var = value> 在 macro 或者 function 中定義局部變量并初始化
<#global var = value > 定義全局變量并初始化
${var} 輸出并替換為表達式的值
<#visit xmlnode> 調用macro比對xmlnode本身及其子節點
<#recurse xmlnode> 
<#if condition ></#if> 
<#list SequenceVar as variable > repeatThis </#list>
<#include "/copyright_footer.html">

 一個ftl标記不能放在另外一個ftl标記裡面,但是注釋标記能夠放在ftl标記裡面。

 系統預定義指令采用<#...></#>
 使用者自定義指令采用<@...></@>

 hash片段可以采用: products[10..19] or products[5..] 的格式。

序列也可以做加法計算:passwords + {"joe":"secret42"}


預設值: name!"unknown" 或者 (user.name)!"unknown" 或者 name! 或者 (user.name)!
null值檢查: name?? or (user.name)??

轉義清單:
 如果想列印${,則需要将{轉義,可以寫成"$/{user}",或者可以用生字元(r指令):$(r "${xx}"}


 序列構成:<#list 
["winter", "spring", "summer", "autumn"] as x>${x}</#list>


 不同的對象可以存放在一個序列裡面,比如:
       [2 + 2, [1, 2, 3, 4], "whatnot"]. 第一個是數字,第二個是序列,第三個是字元串。       

 可用采用start..end的方式來定義一個數字序列,start可以小于end,同時,end也可以省略。


 hash取值支援一下四種模式:
       book.author.name,        book["author"].name,        book.author.["name"],       book["author"]["name"].       
特殊變量是指freemaker引擎本身定義的變量。通路時,以.variable_name的文法通路。

 變量表達式支援嵌套模式,比如:${"Hello ${user}!"}。

 變量表達式在指令中的使用情況:
 變量表達式可以在指令中,用“”的方式存在,不如:<#include "/footer/${company}.html">. 
 但是不允許下面的方式存在: <#if ${isBig}>Wow!</#if>, 正确寫法是:<#if isBig>Wow!</#if>. 
 而且 <#if "${isBig}">Wow!</#if>寫法也不正确,因為"${isBig}"傳回的是字元串,不是boolean類型。

字元串中取字元或字元串采用以下文法:${user[0]},${user[0..2]} ${user[4..]},${user?string(4)}

 序列操作:
     加法:<#list ["Joe", "Fred"] + ["Julia", "Kate"] as user> 但要注意串聯之後的讀取速度變慢。
     子序列:seq[1..4]

 序列和hash的串聯都隻能用于兩個相加,不能有多個相加的模式,hash相加,如果兩個相加的hash存在相同的key,則後面會覆寫前面的。

 在使用>=或者>時,需要注意一些問題,因為freemaker會将>解釋成标記的關閉符,為了解決這個問題,需要在表達式加上括号,比如: <#if (x > y)>. 或者使用 > and <符号來代替。

無值變量(包括無該變量,null,傳回void,無屬性等):unsafe_expr!default_expr or unsafe_expr! or(unsafe_expr)!default_expr or (unsafe_expr)!
預設值可以是任何類型,不一定是數字,比如:hits!0 或者 colors!["red", "green", "blue"]. 

 如果預設值忽略,那麼将會預設為空串、空序列或者空hash,因為freemarker支援多類型的值。不過要讓預設值為0或false,則不能省略預設值。

 非頂層變量的無值處理:
     product.color!"red":隻處理product不為空,color為空的預設值處理,如果product為空,則freemaker會抛 出異常。(product.color)!"red":則會處理product為空,color為空,或者沒有color屬性的無值情況。

 無值變量的判斷操作:unsafe_expr?? or (unsafe_expr)??      
Escape sequence Meaning
/" Quotation mark (u0022)
/' Apostrophe (a.k.a. apostrophe-quote) (u0027)
// Back slash (u005C)
/n Line feed (u000A)
/r Carriage return (u000D)
/t Horizontal tabulation (a.k.a. tab) (u0009)
/b Backspace (u0008)
/f Form feed (u000C)
/l Less-than sign: <
/g Greater-than sign: >
/a Ampersand: &
/{