freemarker中文手冊(cè)_第1頁(yè)
freemarker中文手冊(cè)_第2頁(yè)
freemarker中文手冊(cè)_第3頁(yè)
freemarker中文手冊(cè)_第4頁(yè)
freemarker中文手冊(cè)_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 FreeMarker概述l         FreeMarker是一個(gè)模板引擎,一個(gè)基于模板生成文本輸出的通用工具,使用純Java編寫 l         FreeMarker被設(shè)計(jì)用來生成HTML Web頁(yè)面,特別是基于MVC模式的應(yīng)用程序 l         雖+然FreeMarker具有一些編程的能力,但通常由Java程序準(zhǔn)備要顯示的數(shù)據(jù),

2、由FreeMarker生成頁(yè)面,通過模板顯示準(zhǔn)備的數(shù)據(jù)(如下圖)l         FreeMarker不是一個(gè)Web應(yīng)用框架,而適合作為Web應(yīng)用框架一個(gè)組件 l         FreeMarker與容器無關(guān),因?yàn)樗⒉恢繦TTP或Servlet;FreeMarker同樣可以應(yīng)用于非Web應(yīng)用程序環(huán)境 l         FreeMarker更適合作為

3、Model2框架(如Struts)的視圖組件,你也可以在模板中使用JSP標(biāo)記庫(kù) l         FreeMarker是免費(fèi)的     1、通用目標(biāo) l         能夠生成各種文本:HTML、XML、RTF、Java源代碼等等 l         易于嵌入到你的產(chǎn)品中:輕量級(jí);不需要Servlet環(huán)境 l  &

4、#160;      插件式模板載入器:可以從任何源載入模板,如本地文件、數(shù)據(jù)庫(kù)等等 l         你可以按你所需生成文本:保存到本地文件;作為Email發(fā)送;從Web應(yīng)用程序發(fā)送它返回給Web瀏覽器   2、強(qiáng)大的模板語(yǔ)言 l         所有常用的指令:include、if/elseif/else、循環(huán)結(jié)構(gòu) l    

5、60;    在模板中創(chuàng)建和改變變量 l         幾乎在任何地方都可以使用復(fù)雜表達(dá)式來指定值 l         命名的宏,可以具有位置參數(shù)和嵌套內(nèi)容 l         名字空間有助于建立和維護(hù)可重用的宏庫(kù),或者將一個(gè)大工程分成模塊,而不必?fù)?dān)心名字沖突 l     &#

6、160;   輸出轉(zhuǎn)換塊:在嵌套模板片段生成輸出時(shí),轉(zhuǎn)換HTML轉(zhuǎn)義、壓縮、語(yǔ)法高亮等等;你可以定義自己的轉(zhuǎn)換   3、通用數(shù)據(jù)模型 l         FreeMarker不是直接反射到Java對(duì)象,Java對(duì)象通過插件式對(duì)象封裝,以變量方式在模板中顯示 l         你可以使用抽象(接口)方式表示對(duì)象(JavaBean、XML文檔、SQL查詢結(jié)果集等等),告訴模板開發(fā)者使用方法,使其不受技術(shù)細(xì)節(jié)的

7、打擾   4、為Web準(zhǔn)備 l         在模板語(yǔ)言中內(nèi)建處理典型Web相關(guān)任務(wù)(如HTML轉(zhuǎn)義)的結(jié)構(gòu) l         能夠集成到Model2 Web應(yīng)用框架中作為JSP的替代 l         支持JSP標(biāo)記庫(kù) l         為MVC模式設(shè)計(jì):分離

8、可視化設(shè)計(jì)和應(yīng)用程序邏輯;分離頁(yè)面設(shè)計(jì)員和程序員   5、智能的國(guó)際化和本地化 l         字符集智能化(內(nèi)部使用UNICODE) l         數(shù)字格式本地化敏感 l         日期和時(shí)間格式本地化敏感 l         非US字符集可以用作標(biāo)識(shí)

9、(如變量名) l         多種不同語(yǔ)言的相同模板   6、強(qiáng)大的XML處理能力 l         <#recurse> 和<#visit>指令(2.3版本)用于遞歸遍歷XML樹 l         在模板中清楚和直覺的訪問XML對(duì)象模型   FreeMarker設(shè)計(jì)指南(1)  

10、60;1、快速入門(1)模板 + 數(shù)據(jù)模型 = 輸出l         FreeMarker基于設(shè)計(jì)者和程序員是具有不同專業(yè)技能的不同個(gè)體的觀念l         他們是分工勞動(dòng)的:設(shè)計(jì)者專注于表示創(chuàng)建HTML文件、圖片、Web頁(yè)面的其它可視化方面;程序員創(chuàng)建系統(tǒng),生成設(shè)計(jì)頁(yè)面要顯示的數(shù)據(jù)l         經(jīng)常會(huì)遇到的問題是:在Web頁(yè)面(或其它類型的文檔

11、)中顯示的信息在設(shè)計(jì)頁(yè)面時(shí)是無效的,是基于動(dòng)態(tài)數(shù)據(jù)的l         在這里,你可以在HTML(或其它要輸出的文本)中加入一些特定指令,F(xiàn)reeMarker會(huì)在輸出頁(yè)面給最終用戶時(shí),用適當(dāng)?shù)臄?shù)據(jù)替代這些代碼l         下面是一個(gè)例子:<html><head> <title>Welcome!</title></head><body> <h1>We

12、lcome $user!</h1> <p>Our latest product: <a href="$latestProduct.url">$latestP</a>!</body></html>  l         這個(gè)例子是在簡(jiǎn)單的HTML中加入了一些由$包圍的特定代碼,這些特定代碼是FreeMarker的指令,而包含F(xiàn)reeMarker的指令的文件就稱為模板(Template)l

13、0;        至于user、latestProduct.url和latestP來自于數(shù)據(jù)模型(data model)l         數(shù)據(jù)模型由程序員編程來創(chuàng)建,向模板提供變化的信息,這些信息來自于數(shù)據(jù)庫(kù)、文件,甚至于在程序中直接生成l         模板設(shè)計(jì)者不關(guān)心數(shù)據(jù)從那兒來,只知道使用已經(jīng)建立的數(shù)據(jù)模型l  &

14、#160;      下面是一個(gè)可能的數(shù)據(jù)模型:(root) | +- user = "Big Joe" | +- latestProduct | +- url = "products/greenmouse.html" | +- name = "green mouse"l         數(shù)據(jù)模型類似于計(jì)算機(jī)的文件系統(tǒng),latestProduct可以看作是目錄,而user、url和name看作是文件,url

15、和name文件位于latestProduct目錄中(這只是一個(gè)比喻,實(shí)際并不存在)l         當(dāng)FreeMarker將上面的數(shù)據(jù)模型合并到模板中,就創(chuàng)建了下面的輸出:<html><head> <title>Welcome!</title></head><body> <h1>Welcome Big Joe!</h1> <p>Our latest product: <a href="pro

16、ducts/greenmouse.html">green mouse</a>!</body></html>  (2)數(shù)據(jù)模型l         典型的數(shù)據(jù)模型是樹型結(jié)構(gòu),可以任意復(fù)雜和深層次,如下面的例子:(root) | +- animals | | | +- mouse | | | | | +- size = "small" | | | | | +- price = 50 | | | +- elephant | | | | | +

17、- size = "large" | | | | | +- price = 5000 | | | +- python | | | +- size = "medium" | | | +- price = 4999 | +- test = "It is a test" | +- whatnot | +- because = "don't know"l         類似于目錄的變量稱為hashes,包含保存下級(jí)變量的唯一的查詢名字

18、l         類似于文件的變量稱為scalars,保存單值l         scalars保存的值有兩種類型:字符串(用引號(hào)括起,可以是單引號(hào)或雙引號(hào))和數(shù)字(不要用引號(hào)將數(shù)字括起,這會(huì)作為字符串處理)l         對(duì)scalars的訪問從root開始,各部分用“.”分隔,如l     

19、0;   另外一種變量是sequences,和hashes類似,只是不使用變量名字,而使用數(shù)字索引,如下面的例子:(root) | +- animals | | | +- (1st) | | | | | +- name = "mouse" | | | | | +- size = "small" | | | | | +- price = 50 | | | +- (2nd) | | | | | +- name = "elephant" | | | | | +- size = "large" | |

20、| | | +- price = 5000 | | | +- (3rd) | | | +- name = "python" | | | +- size = "medium" | | | +- price = 4999 | +- whatnot | +- fruits | +- (1st) = "orange" | +- (2nd) = "banana"l         這種對(duì)scalars的訪問使用索引,如(

21、3)模板l         在FreeMarker模板中可以包括下面三種特定部分:Ø         $:稱為interpolations,F(xiàn)reeMarker會(huì)在輸出時(shí)用實(shí)際值進(jìn)行替代Ø         FTL標(biāo)記(FreeMarker模板語(yǔ)言標(biāo)記):類似于HTML標(biāo)記,為了與HTML標(biāo)記區(qū)分,用#開始(有些以開始,在后面敘述)

22、6;         注釋:包含在<#-和->(而不是<!-和->)之間l         下面是一些使用指令的例子:Ø         if指令<#if animals.python.price < animals.elephant.price> Pythons are cheaper than elep

23、hants today.<#else> Pythons are not cheaper than elephants today.</#if>  Ø         list指令<p>We have these animals:<table border=1> <tr><th>Name<th>Price <#list animals as being> <tr><td>$bei

24、<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>49

25、99 Euros</table>  Ø         include指令<html><head> <title>Test page</title></head><body> <h1>Test page</h1> <p>Blah blah.<#include "/copyright_footer.html"></body></h

26、tml>  Ø         一起使用指令<p>We have these animals:<table border=1> <tr><th>Name<th>Price <#list animals as being> <tr> <td> <#if being.size = "large"><b></#if> $ &l

27、t;#if being.size = "large"></b></#if> <td>$being.price Euros </#list></table>  FreeMarker設(shè)計(jì)指南(3)   3、模板(1)整體結(jié)構(gòu)l         模板使用FTL(FreeMarker模板語(yǔ)言)編寫,是下面各部分的一個(gè)組合:Ø     

28、60;   文本:直接輸出Ø         Interpolation:由$和,或#和來限定,計(jì)算值替代輸出Ø         FTL標(biāo)記:FreeMarker指令,和HTML標(biāo)記類似,名字前加#予以區(qū)分,不會(huì)輸出Ø         注釋:由<#-和->限定,不會(huì)輸出l  &

29、#160;      下面是以一個(gè)具體模板例子:<html>BR<head>BR  <title>Welcome!</title>BR</head>BR<body>BR  <#- Greet the user with his/her name ->BR  <h1>Welcome $user!</h1>

30、;BR  <p>We have these animals:BR  <ul>BR  <#list animals as being>BR    <li>$ for $being.price EurosBR  </#list>BR  </ul>BR</body>BR</h

31、tml>  l         BR是用于換行的特殊字符序列l(wèi)         注意事項(xiàng):Ø         FTL區(qū)分大小寫,所以list是正確的FTL指令,而List不是;$name和$NAME是不同的Ø         Interpola

32、tion只能在文本中使用Ø         FTL標(biāo)記不能位于另一個(gè)FTL標(biāo)記內(nèi)部,例如:<#if <#include 'foo'>='bar'>.</if>Ø         注釋可以位于FTL標(biāo)記和Interpolation內(nèi)部,如下面的例子:<h1>Welcome $user <#- The name of user

33、 ->!</h1>BR<p>We have these animals:BR<ul>BR<#list <#- some comment. -> animals as <#- again. -> being>BR.  Ø         多余的空白字符會(huì)在模板輸出時(shí)移除(2)指令l       

34、0; 在FreeMarker中,使用FTL標(biāo)記引用指令l         有三種FTL標(biāo)記,這和HTML標(biāo)記是類似的:Ø         開始標(biāo)記:<#directivename parameters>Ø         結(jié)束標(biāo)記:</#directivename>Ø   &

35、#160;     空內(nèi)容指令標(biāo)記:<#directivename parameters/>l         有兩種類型的指令:預(yù)定義指令和用戶定義指令l         用戶定義指令要使用替換#,如<mydirective>.</mydirective>(會(huì)在后面講述)l       &#

36、160; FTL標(biāo)記不能夠交叉,而應(yīng)該正確的嵌套,如下面的代碼是錯(cuò)誤的:<ul><#list animals as being> <li>$ for $being.price Euros <#if use = "Big Joe"> (except for you)</#list></#if> <#- WRONG! -></ul>  l         如果使用不存在的指令

37、,F(xiàn)reeMarker不會(huì)使用模板輸出,而是產(chǎn)生一個(gè)錯(cuò)誤消息l         FreeMarker會(huì)忽略FTL標(biāo)記中的空白字符,如下面的例子:<#listBR  animals       asBR     beingBR>BR$ for $being.price EurosBR</#list &#

38、160;  >  l         但是,<、</和指令之間不允許有空白字符(3)表達(dá)式l         直接指定值Ø         字符串n         使用單引號(hào)或雙引號(hào)限定n  

39、0;      如果包含特殊字符需要轉(zhuǎn)義,如下面的例子:$"It's "quoted" andthis is a backslash: " $'It's "quoted" andthis is a backslash: ' 輸出結(jié)果是:It's "quoted" andthis is a backslash:  It's "quoted" andthis is a ba

40、ckslash:  n         下面是支持的轉(zhuǎn)義序列:轉(zhuǎn)義序列含義"雙引號(hào)(u0022)'單引號(hào)(u0027)反斜杠(u005C)n換行(u000A)rReturn (u000D)tTab (u0009)bBackspace (u0008)fForm feed (u000C)l<g>a&xCode4位16進(jìn)制Unicode代碼n         有一類特殊的字符串稱為raw字符串,

41、被認(rèn)為是純文本,其中的和等不具有特殊含義,該類字符串在引號(hào)前面加r,下面是一個(gè)例子:$r"$foo"$r"C:foobar"  輸出的結(jié)果是:$fooC:foobar  Ø         數(shù)字n         直接輸入,不需要引號(hào)n         精度數(shù)字使用“.”分隔,不能使用分組

42、符號(hào)n         目前版本不支持科學(xué)計(jì)數(shù)法,所以“1E3”是錯(cuò)誤的n         不能省略小數(shù)點(diǎn)前面的0,所以“.5”是錯(cuò)誤的n         數(shù)字8、+8、08和8.00都是相同的Ø         布爾值n    

43、     true和false,不使用引號(hào)Ø         序列n         由逗號(hào)分隔的子變量列表,由方括號(hào)限定,下面是一個(gè)例子:<#list "winter", "spring", "summer", "autumn" as x>$x</#list> 輸出的結(jié)果是

44、:winterspringsummerautumnn         列表的項(xiàng)目是表達(dá)式,所以可以有下面的例子:2 + 2, 1, 2, 3, 4, "whatnot"n         可以使用數(shù)字范圍定義數(shù)字序列,例如2.5等同于2, 3, 4, 5,但是更有效率,注意數(shù)字范圍沒有方括號(hào)n         可以定義反遞增的數(shù)字范圍,如

45、5.2Ø         散列(hash)n         由逗號(hào)分隔的鍵/值列表,由大括號(hào)限定,鍵和值之間用冒號(hào)分隔,下面是一個(gè)例子:"name":"green mouse", "price":150n         鍵和值都是表達(dá)式,但是鍵必須是字符串l 

46、60;       獲取變量Ø         頂層變量: $variable,變量名只能是字母、數(shù)字、下劃線、$、和#的組合,且不能以數(shù)字開頭Ø         從散列中獲取數(shù)據(jù)n         可以使用點(diǎn)語(yǔ)法或方括號(hào)語(yǔ)法,假設(shè)有下面的數(shù)據(jù)模型:(root) | +- boo

47、k | | | +- title = "Breeding green mouses" | | | +- author | | | +- name = "Julia Smith" | | | +- info = "Biologist, 1923-1985, Canada" | +- test = "title" 下面都是等價(jià)的:book"author".namebook.author."name"book"author""name&quo

48、t;n         使用點(diǎn)語(yǔ)法,變量名字有頂層變量一樣的限制,但方括號(hào)語(yǔ)法沒有該限制,因?yàn)槊质侨我獗磉_(dá)式的結(jié)果Ø         從序列獲得數(shù)據(jù):和散列的方括號(hào)語(yǔ)法語(yǔ)法一樣,只是方括號(hào)中的表達(dá)式值必須是數(shù)字;注意:第一個(gè)項(xiàng)目的索引是0Ø         序列片斷:使用startIndex.endIndex語(yǔ)法,從序列中獲得序列片斷(

49、也是序列);startIndex和endIndex是結(jié)果為數(shù)字的表達(dá)式Ø         特殊變量:FreeMarker內(nèi)定義變量,使用.variablename語(yǔ)法訪問l         字符串操作Ø         Interpolation(或連接操作)n      

50、60;  可以使用$.(或#.)在文本部分插入表達(dá)式的值,例如:$"Hello $user!"$"$user$user$user$user"  n         可以使用+操作符獲得同樣的結(jié)果$"Hello " + user + "!"$user + user + user + usern         $.只能用于文本部分,下面的代

51、碼是錯(cuò)誤的:<#if $isBig>Wow!</#if><#if "$isBig">Wow!</#if>應(yīng)該寫成:<#if isBig>Wow!</#if>Ø         子串n         例子(假設(shè)user的值為“Big Joe”):$user0$user4$user1.4結(jié)果是(注意第一個(gè)字符的索引是0):BJig J&#

52、160;l         序列操作Ø         連接操作:和字符串一樣,使用+,下面是一個(gè)例子:<#list "Joe", "Fred" + "Julia", "Kate" as user>- $user</#list>輸出結(jié)果是:- Joe- Fred- Julia- Katel   

53、      散列操作Ø         連接操作:和字符串一樣,使用+,如果具有相同的key,右邊的值替代左邊的值,例如:<#assign ages = "Joe":23, "Fred":25 + "Joe":30, "Julia":18>- Joe is $ages.Joe- Fred is $ages.Fred- Julia is $ages.Julia

54、0; 輸出結(jié)果是:- Joe is 30- Fred is 25- Julia is 18  l         算術(shù)運(yùn)算Ø         、×、,下面是一個(gè)例子:$x * x - 100$x / 2$12 % 10輸出結(jié)果是(假設(shè)x為5):-752.52  Ø         操作符兩邊必須是數(shù)字,因此下

55、面的代碼是錯(cuò)誤的:$3 * "5" <#- WRONG! ->  Ø         使用+操作符時(shí),如果一邊是數(shù)字,一邊是字符串,就會(huì)自動(dòng)將數(shù)字轉(zhuǎn)換為字符串,例如:$3 + "5"  輸出結(jié)果是:35Ø         使用內(nèi)建的int(后面講述)獲得整數(shù)部分,例如:$(x/2)?int$1.1?int$1.999?int$-1.1?int$-

56、1.999?int輸出結(jié)果是(假設(shè)x為5):211-1-1l         比較操作符Ø         使用=(或=,完全相等)測(cè)試兩個(gè)值是否相等,使用!= 測(cè)試兩個(gè)值是否不相等Ø         =和!=兩邊必須是相同類型的值,否則會(huì)產(chǎn)生錯(cuò)誤,例如<#if 1 = "1">會(huì)引起錯(cuò)誤Ø

57、60;        Freemarker是精確比較,所以對(duì)"x"、"x "和"X"是不相等的Ø         對(duì)數(shù)字和日期可以使用<、<=、>和>=,但不能用于字符串Ø         由于Freemarker會(huì)將>解釋成FTL標(biāo)記的結(jié)束字符,所以對(duì)于&g

58、t;和>=可以使用括號(hào)來避免這種情況,例如<#if (x > y)>Ø         另一種替代的方法是,使用lt、lte、gt和gte來替代<、<=、>和>=l         邏輯操作符Ø         &&(and)、|(or)、!(not),只能用于布爾值,否則會(huì)

59、產(chǎn)生錯(cuò)誤Ø         例子:<#if x < 12 && color = "green"> We have less than 12 things, and they are green.</#if><#if !hot> <#- here hot must be a boolean -> It's not hot.</#if>  l    &

60、#160;    內(nèi)建函數(shù)Ø         內(nèi)建函數(shù)的用法類似訪問散列的子變量,只是使用“?”替代“.”,下面列出常用的一些函數(shù)Ø         字符串使用的:n         html:對(duì)字符串進(jìn)行HTML編碼n       

61、60; cap_first:使字符串第一個(gè)字母大寫n         lower_case:將字符串轉(zhuǎn)換成小寫n         upper_case:將字符串轉(zhuǎn)換成大寫n         trim:去掉字符串前后的空白字符Ø         序列使用的:n 

62、        size:獲得序列中元素的數(shù)目Ø         數(shù)字使用的:n         int:取得數(shù)字的整數(shù)部分(如-1.9?int的結(jié)果是-1)Ø         例子(假設(shè)test保存字符串"Tom & Jerry"):$te

63、st?html$test?upper_case?html輸出結(jié)果是:Tom &amp; JerryTOM &amp; JERRY  l         操作符優(yōu)先順序操作符組操作符后綴subvarName subStringRange . (methodParams)一元+expr、-expr、!內(nèi)建?乘法*、 / 、%加法+、-關(guān)系<、>、<=、>=(lt、lte、gt、gte)相等=(=)、!=邏輯and&&邏輯or|數(shù)字范圍.(4)Interp

64、olationl         Interpolation有兩種類型:Ø         通用Interpolation:$exprØ         數(shù)字Interpolation:#expr或#expr; formatl         注意:Inter

65、polation只能用于文本部分l         通用InterpolationØ         插入字符串值:直接輸出表達(dá)式結(jié)果Ø         插入數(shù)字值:根據(jù)缺省格式(由#setting指令設(shè)置)將表達(dá)式結(jié)果轉(zhuǎn)換成文本輸出;可以使用內(nèi)建函數(shù)string格式化單個(gè)Interpolation,下面是一個(gè)例子:<#settin

66、g number_format="currency"/><#assign answer=42/>$answer$answer?string <#- the same as $answer ->$answer?string.number$answer?string.currency$answer?string.percent 輸出結(jié)果是:$42.00$42.0042$42.004,200%Ø         插入日期值:根據(jù)缺省格式(由#setti

67、ng指令設(shè)置)將表達(dá)式結(jié)果轉(zhuǎn)換成文本輸出;可以使用內(nèi)建函數(shù)string格式化單個(gè)Interpolation,下面是一個(gè)使用格式模式的例子:$lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")$lastUpdated?string("EEE, MMM d, ''yy")$lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")  輸出的結(jié)果類似下面的格式:2003-04

68、-08 21:24:44 Pacific Daylight TimeTue, Apr 8, '03Tuesday, April 08, 2003, 09:24:44 PM (PDT)Ø         插入布爾值:根據(jù)缺省格式(由#setting指令設(shè)置)將表達(dá)式結(jié)果轉(zhuǎn)換成文本輸出;可以使用內(nèi)建函數(shù)string格式化單個(gè)Interpolation,下面是一個(gè)例子:<#assign foo=true/>$foo?string("yes", "no"

69、)輸出結(jié)果是:yesl         數(shù)字Interpolation的#expr; format形式可以用來格式化數(shù)字,format可以是:Ø         mX:小數(shù)部分最小X位Ø         MX:小數(shù)部分最大X位Ø         例子

70、: <#- If the language is US English the output is: -><#assign x=2.582/><#assign y=4/>#x; M2 <#- 2.58 ->#y; M2 <#- 4 ->#x; m1 <#- 2.6 ->#y; m1 <#- 4.0 ->#x; m1M2 <#- 2.58 ->#y; m1M2 <#- 4.0 -> FreeMarker設(shè)計(jì)指南(4)   4、雜項(xiàng)(1)用戶定義指令l

71、         宏和變換器變量是兩種不同類型的用戶定義指令,它們之間的區(qū)別是宏是在模板中使用macro指令定義,而變換器是在模板外由程序定義,這里只介紹宏l         基本用法Ø         宏是和某個(gè)變量關(guān)聯(lián)的模板片斷,以便在模板中通過用戶定義指令使用該變量,下面是一個(gè)例子:<#macro greet> <font

72、size="+2">Hello Joe!</font></#macro>  Ø         作為用戶定義指令使用宏變量時(shí),使用替代FTL標(biāo)記中的#<greet></greet>Ø         如果沒有體內(nèi)容,也可以使用:<greet/>l      

73、60;  參數(shù)Ø         在macro指令中可以在宏變量之后定義參數(shù),如:<#macro greet person> <font size="+2">Hello $person!</font></#macro> Ø         可以這樣使用這個(gè)宏變量:<greet person="Fred"/

74、> and <greet person="Batman"/> 輸出結(jié)果是: <font size="+2">Hello Fred!</font> and <font size="+2">Hello Batman!</font>   Ø         宏的參數(shù)是FTL表達(dá)式,所以下面的代碼具有不同的意思:<greet person=Fred/>

75、16;         這意味著將Fred變量的值傳給person參數(shù),該值不僅是字符串,還可以是其它類型,甚至是復(fù)雜的表達(dá)式Ø         宏可以有多參數(shù),下面是一個(gè)例子:<#macro greet person color> <font size="+2" color="$color">Hello $person!</font></#ma

76、cro> Ø         可以這樣使用該宏變量:<greet person="Fred" color="black"/> Ø         其中參數(shù)的次序是無關(guān)的,因此下面是等價(jià)的:<greet color="black" person="Fred"/>Ø 

77、60;       只能使用在macro指令中定義的參數(shù),并且對(duì)所有參數(shù)賦值,所以下面的代碼是錯(cuò)誤的:<greet person="Fred" color="black" background="green"/><greet person="Fred"/>Ø         可以在定義參數(shù)時(shí)指定缺省值,如:<#macro greet pe

78、rson color="black"> <font size="+2" color="$color">Hello $person!</font></#macro>  Ø         這樣<greet person="Fred"/>就正確了Ø         宏的參數(shù)是局部

79、變量,只能在宏定義中有效l         嵌套內(nèi)容Ø         用戶定義指令可以有嵌套內(nèi)容,使用<#nested>指令執(zhí)行指令開始和結(jié)束標(biāo)記之間的模板片斷Ø         例子:<#macro border> <table border=4 cellspacing=0 cellpadding=4&g

80、t;<tr><td> <#nested> </tr></td></table></#macro>  這樣使用該宏變量:<border>The bordered text</border>輸出結(jié)果: <table border=4 cellspacing=0 cellpadding=4><tr><td> The bordered text </tr></td></table>  Ø

81、0;        <#nested>指令可以被多次調(diào)用,例如:<#macro do_thrice> <#nested> <#nested> <#nested></#macro><do_thrice> Anything.</do_thrice>  輸出結(jié)果: Anything. Anything. Anything. Ø       

82、;  嵌套內(nèi)容可以是有效的FTL,下面是一個(gè)有些復(fù)雜的例子:<border> <ul> <do_thrice> <li><greet person="Joe"/> </do_thrice> </ul></border>輸出結(jié)果: <table border=4 cellspacing=0 cellpadding=4><tr><td> <ul> <li><font size="+2"&g

83、t;Hello Joe!</font>  <li><font size="+2">Hello Joe!</font>  <li><font size="+2">Hello Joe!</font>  </ul>  </tr></td></table>  Ø         宏定義中的局部變

84、量對(duì)嵌套內(nèi)容是不可見的,例如:<#macro repeat count> <#local y = "test"> <#list 1.count as x> $y $count/$x: <#nested> </#list></#macro><repeat count=3>$y?default("?") $x?default("?") $count?default("?")</repeat>輸出結(jié)果: test 3/1: ?

85、 ? ? test 3/2: ? ? ? test 3/3: ? ? ?Ø          l         在宏定義中使用循環(huán)變量Ø         用戶定義指令可以有循環(huán)變量,通常用于重復(fù)嵌套內(nèi)容,基本用法是:作為nested指令的參數(shù)傳遞循環(huán)變量的實(shí)際值,而在調(diào)用用戶定義指令時(shí),在<>開始標(biāo)記的參數(shù)后面指定

86、循環(huán)變量的名字Ø         例子:<#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>  輸出結(jié)果: 1. 0.5

87、2. 1 3. 1.5 4. 2 Last!  Ø         指定的循環(huán)變量的數(shù)目和用戶定義指令開始標(biāo)記指定的不同不會(huì)有問題n         調(diào)用時(shí)少指定循環(huán)變量,則多指定的值不可見n         調(diào)用時(shí)多指定循環(huán)變量,多余的循環(huán)變量不會(huì)被創(chuàng)建(2)在模板中定義變量l     

88、    在模板中定義的變量有三種類型:Ø         plain變量:可以在模板的任何地方訪問,包括使用include指令插入的模板,使用assign指令創(chuàng)建和替換Ø         局部變量:在宏定義體中有效,使用local指令創(chuàng)建和替換Ø         循環(huán)變量:只能存在于指令的嵌套內(nèi)容,

89、由指令(如list)自動(dòng)創(chuàng)建;宏的參數(shù)是局部變量,而不是循環(huán)變量l         局部變量隱藏(而不是覆蓋)同名的plain變量;循環(huán)變量隱藏同名的局部變量和plain變量,下面是一個(gè)例子:<#assign x = "plain">1. $x <#- we see the plain var. here -><test/>6. $x <#- the value of plain var. was not changed -><#list &

90、quot;loop" as x> 7. $x <#- now the loop var. hides the plain var. -> <#assign x = "plain2"> <#- replace the plain var, hiding does not mater here -> 8. $x <#- it still hides the plain var. -></#list>9. $x <#- the new value of plain var. -> &

91、lt;#macro test> 2. $x <#- we still see the plain var. here -> <#local x = "local"> 3. $x <#- now the local var. hides it -> <#list "loop" as x> 4. $x <#- now the loop var. hides the local var. -> </#list> 5. $x <#- now we see the local var. again -></#macro>  輸出結(jié)果:1. plain 2.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論