<# ... > 中存放所有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)?? |