<# ... > 中存放所有freemaker的內容,之外的內容全部原樣輸出。
<@ ... /> 是函數(shù)調用
兩個定界符內的內容中,第一個符號表示指令或者函數(shù)名,其后的跟隨參數(shù)。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> 宏,無返回參數(shù)
<#function name param1 param2><#return val></#function>函數(shù),有返回參數(shù)
var?member_function(...) 用函數(shù)對var進行轉換,freemaker稱為build-ins。實際內部實現(xiàn)類似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 ... /> 調用函數(shù)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本身及其子節(jié)點
<#recurse xmlnode> 調用macro匹配xmlnode的子節(jié)點
<#if
condition
>
</#if>
<#list
SequenceVar
as
variable
>
repeatThis
</#list>
<#include "/copyright_footer.html">
一個ftl標記不能放在另外一個ftl標記里面,但是注釋標記能夠放在ftl標記里面。
系統(tǒng)預定義指令采用<#...></#>
用戶自定義指令采用<@...></@>
hash片段可以采用:
products[10..19] or products[5..] 的格式。
序列也可以做加法計算:passwords + {"joe":"secret42"}
缺省值: name!"unknown"?或者 (user.name)!"unknown"?或者 name!?或者 (user.name)!
null值檢查: name?? or (user.name)??
轉義列表:
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: & |
\{ | Curly bracket: { |
\xCode | Character given with its hexadecimal Unicode code (UCS code) |
如果想打印${,則需要將{轉義,可以寫成"$\{user}",或者可以用生字符(r指令):$(r "${xx}"}
序列構成:<#list ["winter", "spring", "summer", "autumn"] as x>${x}</#list>
不同的對象可以存放在一個序列里面,比如:[2 + 2, [1, 2, 3, 4], "whatnot"]. 第一個是數(shù)字,第二個是序列,第三個是字符串。
可用采用start..end的方式來定義一個數(shù)字序列,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> 但要注意串聯(lián)之后的讀取速度變慢。
???子序列:seq[1..4]
序列和hash的串聯(lián)都只能用于兩個相加,不能有多個相加的模式,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)!
缺省值可以是任何類型,不一定是數(shù)字,比如: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)??
判斷變量是否是無值。
普通變量插入方式: ${expression},${3+5);
數(shù)字變量插入方式: #{expression} or #{expression; format}:過期。
變量只能用于文本區(qū)或者是字符串里面,比如:<h1>Hello ${name}!</h1>以及 <#include "/footer/${company}.html">
數(shù)字值的插入:根據(jù)缺省的number_format輸出,以及可以通過setting來達到設置數(shù)字格式的目的,也可以通過內置函數(shù)string來改變輸出格式。
日期類型的格式設置:date_format, time_format?和 datetime_format
定義宏:
???不帶參數(shù):<#macro 宏名>...</#macro>,引用<@宏名 />
???帶參數(shù):<#macro 宏名 參數(shù)...>...</#macro>,引用<@宏名 參數(shù)1=值1.../>,帶有參數(shù)的宏,調用是參數(shù)的值必須和參數(shù)的個數(shù)相同。當然也可以在宏定義時給參數(shù)一些默認值。比如:<#macro greet person color="black">
宏里面的嵌套內容:
<#macro border>
? <table border=4 cellspacing=0 cellpadding=4><tr><td>
??? <#nested>
? </tr></td></table>
</#macro>?
在宏的定義body中加入<#nested>指令。嵌套的內容可以是任何正確的ftl塊。
宏的本地變量在嵌套內容中是不可見的。
宏定義時,<#nest>指令相當于調用定義的內容,而使用宏時,nest body相當于定義。
<#macro repeat count>
<#list 1..count as x>
<#nested x, x/2, x==count>
</#list>
</#macro>
<@repeat count=4 ; c, halfc, last>
${c}. ${halfc}<#if last> Last!</#if>
</@repeat>?
定義變量:
???在模板中定義的變量將會隱藏(不是更改)數(shù)據(jù)模型根下面的同名的變量。
模板中的3種類型變量:
???1:plain variables,能夠在模板中的任何地方訪問,一個模板include另外一個模板,也可以訪問被包含模板的變量。可以通過assign或者macro指令產生或替換變量。
???如果要訪問數(shù)據(jù)模型中的變量,則可以通過.global來訪問:
???<#assign user = "Joe Hider">
???${user}????????? <#-- prints: Joe Hider -->
???${.globals.user} <#-- prints: Big Joe-->?
???2:Local variables,宏定義body中用local指令創(chuàng)建或者替換。
???3:Loop variables:由list指令產生。
namespaces:
<#import "/lib/my_test.ftl" as my> <#-- the hash called "my" will be the "gate" -->
<@my.copyright date="1999-2002"/>
${my.mail}?
設置命名空間里面的變量:<#assign mail="jsmith@other.com" in my>
命名空間與數(shù)據(jù)模型:命名空間的ftl可以訪問數(shù)據(jù)模型的變量。同樣命名空間的變量也會隱藏數(shù)據(jù)模型中同名的變量。
空白問題:
1:White-space stripping,默認為enabled,清除ftl標記帶來的空白以及縮進。處理模板的空白。
2:t, rt, lt指令。
3:ftl的參數(shù)strip_text.
用compress directive或者transform來處理輸出。
<#compress>...</#compress>:消除空白行。
<@compress single_line=true>.../@compress將輸出壓縮為一行。
可替換語法:
freemarker可用"["代替"<".在模板的文件開頭加上[#ftl].
posted on 2007-03-27 01:03
不做浮躁的人 閱讀(2891)
評論(2) 編輯 收藏 所屬分類:
freemarker