版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 freemarker概述l freemarker是一個模板引擎,一個基于模板生成文本輸出的通用工具,使用純java編寫 l freemarker被設(shè)計(jì)用來生成html web頁面,特別是基于mvc模式的應(yīng)用程序 l 雖然freemarker具有一些編程的能力,但通常由java程序準(zhǔn)備要顯示的數(shù)據(jù),由
2、freemarker生成頁面,通過模板顯示準(zhǔn)備的數(shù)據(jù)(如下圖)l freemarker不是一個web應(yīng)用框架,而適合作為web應(yīng)用框架一個組件 l freemarker與容器無關(guān),因?yàn)樗⒉恢纇ttp或servlet;freemarker同樣可以應(yīng)用于非web應(yīng)用程序環(huán)境 l freemarker更適合作為m
3、odel2框架(如struts)的視圖組件,你也可以在模板中使用jsp標(biāo)記庫 l freemarker是免費(fèi)的 1、通用目標(biāo) l 能夠生成各種文本:html、xml、rtf、java源代碼等等 l 易于嵌入到你的產(chǎn)品中:輕量級;不需要servlet環(huán)境 l
4、160; 插件式模板載入器:可以從任何源載入模板,如本地文件、數(shù)據(jù)庫等等 l 你可以按你所需生成文本:保存到本地文件;作為email發(fā)送;從web應(yīng)用程序發(fā)送它返回給web瀏覽器 2、強(qiáng)大的模板語言 l 所有常用的指令:include、if/elseif/else、循環(huán)結(jié)構(gòu) l
5、0; 在模板中創(chuàng)建和改變變量 l 幾乎在任何地方都可以使用復(fù)雜表達(dá)式來指定值 l 命名的宏,可以具有位置參數(shù)和嵌套內(nèi)容 l 名字空間有助于建立和維護(hù)可重用的宏庫,或者將一個大工程分成模塊,而不必?fù)?dān)心名字沖突 l
6、60; 輸出轉(zhuǎn)換塊:在嵌套模板片段生成輸出時,轉(zhuǎn)換html轉(zhuǎn)義、壓縮、語法高亮等等;你可以定義自己的轉(zhuǎn)換 3、通用數(shù)據(jù)模型 l freemarker不是直接反射到j(luò)ava對象,java對象通過插件式對象封裝,以變量方式在模板中顯示 l 你可以使用抽象(接口)方式表示對象(javabean、xml文檔、sql查詢結(jié)果集等等),告訴模板開發(fā)者使用方法,使其不受技術(shù)細(xì)節(jié)的打
7、擾 4、為web準(zhǔn)備 l 在模板語言中內(nèi)建處理典型web相關(guān)任務(wù)(如html轉(zhuǎn)義)的結(jié)構(gòu) l 能夠集成到model2 web應(yīng)用框架中作為jsp的替代 l 支持jsp標(biāo)記庫 l 為mvc模式設(shè)計(jì):分離可
8、視化設(shè)計(jì)和應(yīng)用程序邏輯;分離頁面設(shè)計(jì)員和程序員 5、智能的國際化和本地化 l 字符集智能化(內(nèi)部使用unicode) l 數(shù)字格式本地化敏感 l 日期和時間格式本地化敏感 l 非us字符集可以用作標(biāo)識(
9、如變量名) l 多種不同語言的相同模板 6、強(qiáng)大的xml處理能力 l <#recurse> 和<#visit>指令(2.3版本)用于遞歸遍歷xml樹 l 在模板中清楚和直覺的訪問xml對象模型 freemarker設(shè)計(jì)指南(1)
10、0;1、快速入門(1)模板 + 數(shù)據(jù)模型 = 輸出l freemarker基于設(shè)計(jì)者和程序員是具有不同專業(yè)技能的不同個體的觀念l 他們是分工勞動的:設(shè)計(jì)者專注于表示創(chuàng)建html文件、圖片、web頁面的其它可視化方面;程序員創(chuàng)建系統(tǒng),生成設(shè)計(jì)頁面要顯示的數(shù)據(jù)l 經(jīng)常會遇到的問題是:在web頁面(或其它類型的文檔)
11、中顯示的信息在設(shè)計(jì)頁面時是無效的,是基于動態(tài)數(shù)據(jù)的l 在這里,你可以在html(或其它要輸出的文本)中加入一些特定指令,freemarker會在輸出頁面給最終用戶時,用適當(dāng)?shù)臄?shù)據(jù)替代這些代碼l 下面是一個例子:<html><head> <title>welcome!</title></head><body> <h1>wel
12、come $user!</h1> <p>our latest product: <a href="$latestproduct.url">$latestp</a>!</body></html> l 這個例子是在簡單的html中加入了一些由$包圍的特定代碼,這些特定代碼是freemarker的指令,而包含freemarker的指令的文件就稱為模板(template)l
13、; 至于user、latestproduct.url和latestp來自于數(shù)據(jù)模型(data model)l 數(shù)據(jù)模型由程序員編程來創(chuàng)建,向模板提供變化的信息,這些信息來自于數(shù)據(jù)庫、文件,甚至于在程序中直接生成l 模板設(shè)計(jì)者不關(guān)心數(shù)據(jù)從那兒來,只知道使用已經(jīng)建立的數(shù)據(jù)模型l
14、160; 下面是一個可能的數(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目錄中(這只是一個比喻,實(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="prod
16、ucts/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,包含保存下級變量的唯一的查詢名字l
18、 類似于文件的變量稱為scalars,保存單值l scalars保存的值有兩種類型:字符串(用引號括起,可以是單引號或雙引號)和數(shù)字(不要用引號將數(shù)字括起,這會作為字符串處理)l 對scalars的訪問從root開始,各部分用“.”分隔,如animals.mouse.pricel
19、0; 另外一種變量是sequences,和hashes類似,只是不使用變量名字,而使用數(shù)字索引,如下面的例子:(root) | +- animals | | | +- (1st) | | | | | +- name = "mouse" | | | | | +- size = "small" | | | | | +- price = 50 | | | +- (2nd) | | | | | +- name = "elephant" | | | | | +- size = &quo
20、t;large" | | | | | +- price = 5000 | | | +- (3rd) | | | +- name = "python" | | | +- size = "medium" | | | +- price = 4999 | +- whatnot | +- fruits | +- (1st) = "orange" | +- (2nd) = "banana"l 這種對scalars的訪問使用
21、索引,如(3)模板l 在freemarker模板中可以包括下面三種特定部分:Ø $:稱為interpolations,freemarker會在輸出時用實(shí)際值進(jìn)行替代Ø ftl標(biāo)記(freemarker模板語言標(biāo)記):類似于html標(biāo)記,為了與html標(biāo)記區(qū)分,用#開
22、始(有些以開始,在后面敘述)Ø 注釋:包含在<#-和->(而不是<!-和->)之間l 下面是一些使用指令的例子:Ø if指令<#if animals.python.price < animals.elephant.price> pythons are
23、 cheaper than elephants 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
24、><td>$<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>
25、python<td>4999 euros</table> Ø include指令<html><head> <title>test page</title></head><body> <h1>test page</h1> <p>blah blah.<#include "/copyright_footer.html">&
26、lt;/body></html> Ø 一起使用指令<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&
27、gt; $ <#if being.size = "large"></b></#if> <td>$being.price euros </#list></table> freemarker設(shè)計(jì)指南(3) 3、模板(1)整體結(jié)構(gòu)l 模板使用ftl(freemarker模板語言)編寫,是下面各部分的一個組合:Ø
28、60; 文本:直接輸出Ø interpolation:由$和,或#和來限定,計(jì)算值替代輸出Ø ftl標(biāo)記:freemarker指令,和html標(biāo)記類似,名字前加#予以區(qū)分,不會輸出Ø 注釋:由<#-和->限定,
29、不會輸出l 下面是以一個具體模板例子:<html>br<head>br <title>welcome!</title>br</head>br<body>br <#- greet the user with his/her name ->br <h1>welcome
30、0;$user!</h1>br <p>we have these animals:br <ul>br <#list animals as being>br <li>$ for $being.price eurosbr </#list>br </ul>br<
31、;/body>br</html> l br是用于換行的特殊字符序列l(wèi) 注意事項(xiàng):Ø ftl區(qū)分大小寫,所以list是正確的ftl指令,而list不是;$name和$name是不同的Ø
32、0; interpolation只能在文本中使用Ø ftl標(biāo)記不能位于另一個ftl標(biāo)記內(nèi)部,例如:<#if <#include 'foo'>='bar'>.</if>Ø 注釋可以位于ftl標(biāo)記和interpolation內(nèi)部,如下面的例子:<h1>welcome $user <#
33、- the name of user ->!</h1>br<p>we have these animals:br<ul>br<#list <#- some comment. -> animals as <#- again. -> being>br. Ø 多余的空白字符會在模板輸出時移除(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>(會在后面講述)l
36、160; ftl標(biāo)記不能夠交叉,而應(yīng)該正確的嵌套,如下面的代碼是錯誤的:<ul><#list animals as being> <li>$ for $being.price euros <#if use = "big joe"> (except for you)</#list></#if> <#- wrong! -></ul> l
37、; 如果使用不存在的指令,freemarker不會使用模板輸出,而是產(chǎn)生一個錯誤消息l freemarker會忽略ftl標(biāo)記中的空白字符,如下面的例子:<#listbr animals asbr beingbr>br$ for $being.price eurosbr
38、</#list > l 但是,<、</和指令之間不允許有空白字符(3)表達(dá)式l 直接指定值Ø 字符串n 使用單引號或雙引號限
39、定n 如果包含特殊字符需要轉(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&quo
40、t; andthis is a backslash: n 下面是支持的轉(zhuǎn)義序列:轉(zhuǎn)義序列含義"雙引號(u0022)'單引號(u0027)反斜杠(u005c)n換行(u000a)rreturn (u000d)ttab (u0009)bbackspace (u0008)fform feed (u000c)l<g>a&xcode4位16進(jìn)制unicode代碼n
41、有一類特殊的字符串稱為raw字符串,被認(rèn)為是純文本,其中的和等不具有特殊含義,該類字符串在引號前面加r,下面是一個例子:$r"$foo"$r"c:foobar" 輸出的結(jié)果是:$fooc:foobar Ø 數(shù)字n 直接輸入,不需要引號n
42、精度數(shù)字使用“.”分隔,不能使用分組符號n 目前版本不支持科學(xué)計(jì)數(shù)法,所以“1e3”是錯誤的n 不能省略小數(shù)點(diǎn)前面的0,所以“.5”是錯誤的n 數(shù)字8、+8、08和8.00都是相同的Ø 布爾值n
43、 true和false,不使用引號Ø 序列n 由逗號分隔的子變量列表,由方括號限定,下面是一個例子:<#list "winter", "spring", "summer", "autumn" as x>$x</#li
44、st> 輸出的結(jié)果是:winterspringsummerautumnn 列表的項(xiàng)目是表達(dá)式,所以可以有下面的例子:2 + 2, 1, 2, 3, 4, "whatnot"n 可以使用數(shù)字范圍定義數(shù)字序列,例如2.5等同于2, 3, 4, 5,但是更有效率,注意數(shù)字范圍沒有方括號n
45、60; 可以定義反遞增的數(shù)字范圍,如5.2Ø 散列(hash)n 由逗號分隔的鍵/值列表,由大括號限定,鍵和值之間用冒號分隔,下面是一個例子:"name":"green mouse", "price":150n 鍵和值都是表達(dá)式,但
46、是鍵必須是字符串l 獲取變量Ø 頂層變量: $variable,變量名只能是字母、數(shù)字、下劃線、$、和#的組合,且不能以數(shù)字開頭Ø 從散列中獲取數(shù)據(jù)n 可以使用點(diǎn)語法或方括號語法,假設(shè)有下面的數(shù)據(jù)
47、模型:(root) | +- book | | | +- title = "breeding green mouses" | | | +- author | | | +- name = "julia smith" | | | +- info = "biologist, 1923-1985, canada" | +- test = "title" 下面都是等價的:book"author".namebook.author."name"bo
48、ok"author""name"n 使用點(diǎn)語法,變量名字有頂層變量一樣的限制,但方括號語法沒有該限制,因?yàn)槊质侨我獗磉_(dá)式的結(jié)果Ø 從序列獲得數(shù)據(jù):和散列的方括號語法語法一樣,只是方括號中的表達(dá)式值必須是數(shù)字;注意:第一個項(xiàng)目的索引是0Ø 序列片斷:使
49、用startindex.endindex語法,從序列中獲得序列片斷(也是序列);startindex和endindex是結(jié)果為數(shù)字的表達(dá)式Ø 特殊變量:freemarker內(nèi)定義變量,使用.variablename語法訪問l 字符串操作Ø interpolation(或連接操作)n
50、; 可以使用$.(或#.)在文本部分插入表達(dá)式的值,例如:$"hello $user!"$"$user$user$user$user" n 可以使用+操作符獲得同樣的結(jié)果$"hello " + user + "!"$user + user + user + usern
51、 $.只能用于文本部分,下面的代碼是錯誤的:<#if $isbig>wow!</#if><#if "$isbig">wow!</#if>應(yīng)該寫成:<#if isbig>wow!</#if>Ø 子串n 例子(假設(shè)user的值為“big joe”):$user0$user4
52、$user1.4結(jié)果是(注意第一個字符的索引是0):bjig j l 序列操作Ø 連接操作:和字符串一樣,使用+,下面是一個例子:<#list "joe", "fred" + "julia", "kate" as user>- $user</#list>輸出結(jié)果是:- joe- fr
53、ed- julia- katel 散列操作Ø 連接操作:和字符串一樣,使用+,如果具有相同的key,右邊的值替代左邊的值,例如:<#assign ages = "joe":23, "fred":25 + "joe":30, "julia":18>- joe is $ages.joe- fred is $a
54、ges.fred- julia is $ages.julia 輸出結(jié)果是:- joe is 30- fred is 25- julia is 18 l 算術(shù)運(yùn)算Ø 、×、,下面是一個例子:$x * x - 100$x / 2$12 % 10輸出結(jié)果是(假設(shè)x為5):-752.52 Ø
55、; 操作符兩邊必須是數(shù)字,因此下面的代碼是錯誤的:$3 * "5" <#- wrong! -> Ø 使用+操作符時,如果一邊是數(shù)字,一邊是字符串,就會自動將數(shù)字轉(zhuǎn)換為字符串,例如:$3 + "5" 輸出結(jié)果是:35Ø 使用內(nèi)建的int(后面講述)獲得整數(shù)部分,例如:$(x/2
56、)?int$1.1?int$1.999?int$-1.1?int$-1.999?int輸出結(jié)果是(假設(shè)x為5):211-1-1l 比較操作符Ø 使用=(或=,完全相等)測試兩個值是否相等,使用!= 測試兩個值是否不相等Ø =和!=兩邊必須是相同類型的值,否則會產(chǎn)生錯誤,例如<#if 1
57、 = "1">會引起錯誤Ø freemarker是精確比較,所以對"x"、"x "和"x"是不相等的Ø 對數(shù)字和日期可以使用<、<=、>和>=,但不能用于字符串Ø 由于fr
58、eemarker會將>解釋成ftl標(biāo)記的結(jié)束字符,所以對于>和>=可以使用括號來避免這種情況,例如<#if (x > y)>Ø 另一種替代的方法是,使用lt、lte、gt和gte來替代<、<=、>和>=l 邏輯操作符Ø &&
59、amp;(and)、|(or)、!(not),只能用于布爾值,否則會產(chǎn)生錯誤Ø 例子:<#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>
60、; l 內(nèi)建函數(shù)Ø 內(nèi)建函數(shù)的用法類似訪問散列的子變量,只是使用“?”替代“.”,下面列出常用的一些函數(shù)Ø 字符串使用的:n html:對字符串進(jìn)行html編碼n
61、; cap_first:使字符串第一個字母大寫n lower_case:將字符串轉(zhuǎn)換成小寫n upper_case:將字符串轉(zhuǎn)換成大寫n trim:去掉字符串前后的空白字符Ø
62、0; 序列使用的:n size:獲得序列中元素的數(shù)目Ø 數(shù)字使用的:n int:取得數(shù)字的整數(shù)部分(如-1.9?int的結(jié)果是-1)Ø 例子(假設(shè)test保存字
63、符串"tom & jerry"):$test?html$test?upper_case?html輸出結(jié)果是:tom & jerrytom & jerry l 操作符優(yōu)先順序操作符組操作符后綴subvarname substringrange . (methodparams)一元+expr、-expr、!內(nèi)建?乘法*、 / 、%加法+、-關(guān)系<、>、<=、>=(lt、lte、gt、gte)相等=(=)、!=
64、邏輯and&&邏輯or|數(shù)字范圍.(4)interpolationl interpolation有兩種類型:Ø 通用interpolation:$exprØ 數(shù)字interpolation:#expr或#expr; formatl
65、; 注意:interpolation只能用于文本部分l 通用interpolationØ 插入字符串值:直接輸出表達(dá)式結(jié)果Ø 插入數(shù)字值:根據(jù)缺省格式(由#setting指令設(shè)置)將表達(dá)式結(jié)果轉(zhuǎn)換成文本輸出;可以使用內(nèi)建函數(shù)string格式化單
66、個interpolation,下面是一個例子:<#setting 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%Ø
67、; 插入日期值:根據(jù)缺省格式(由#setting指令設(shè)置)將表達(dá)式結(jié)果轉(zhuǎn)換成文本輸出;可以使用內(nèi)建函數(shù)string格式化單個interpolation,下面是一個使用格式模式的例子:$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')'
68、") 輸出的結(jié)果類似下面的格式:2003-04-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格式化單個interpolation,下面是一個例子:<#assign foo=true/>$foo?stri
69、ng("yes", "no")輸出結(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ì)指南(
71、4) 4、雜項(xiàng)(1)用戶定義指令l 宏和變換器變量是兩種不同類型的用戶定義指令,它們之間的區(qū)別是宏是在模板中使用macro指令定義,而變換器是在模板外由程序定義,這里只介紹宏l 基本用法Ø 宏是和某個變量關(guān)聯(lián)的模板片斷,以便在模板中通過用戶定義指令使用該變量,下面是一
72、個例子:<#macro greet> <font size="+2">hello joe!</font></#macro> Ø 作為用戶定義指令使用宏變量時,使用替代ftl標(biāo)記中的#<greet></greet>Ø 如果沒有體內(nèi)容,也可以使用:<greet/>l
73、; 參數(shù)Ø 在macro指令中可以在宏變量之后定義參數(shù),如:<#macro greet person> <font size="+2">hello $person!</font></#macro> Ø 可以這樣使用這個宏變量:
74、<greet person="fred"/> and <greet person="batman"/> 輸出結(jié)果是: <font size="+2">hello fred!</font> and <font size="+2">hello batman!</font> Ø 宏的參數(shù)是ftl表達(dá)式,所以下面的代碼具有不
75、同的意思:<greet person=fred/>Ø 這意味著將fred變量的值傳給person參數(shù),該值不僅是字符串,還可以是其它類型,甚至是復(fù)雜的表達(dá)式Ø 宏可以有多參數(shù),下面是一個例子:<#macro greet person color> <font size="+2" color="$color">h
76、ello $person!</font></#macro> Ø 可以這樣使用該宏變量:<greet person="fred" color="black"/> Ø 其中參數(shù)的次序是無關(guān)的,因此下面是等價的:<greet color="black" person=&q
77、uot;fred"/>Ø 只能使用在macro指令中定義的參數(shù),并且對所有參數(shù)賦值,所以下面的代碼是錯誤的:<greet person="fred" color="black" background="green"/><greet person="fred"/>Ø 可
78、以在定義參數(shù)時指定缺省值,如:<#macro greet person color="black"> <font size="+2" color="$color">hello $person!</font></#macro> Ø 這樣<greet person="fred"/>就正確了Ø
79、0; 宏的參數(shù)是局部變量,只能在宏定義中有效l 嵌套內(nèi)容Ø 用戶定義指令可以有嵌套內(nèi)容,使用<#nested>指令執(zhí)行指令開始和結(jié)束標(biāo)記之間的模板片斷Ø 例子:<#macro border> <table bord
80、er=4 cellspacing=0 cellpadding=4><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&
81、gt;</table> Ø <#nested>指令可以被多次調(diào)用,例如:<#macro do_thrice> <#nested> <#nested> <#nested></#macro><do_thrice> anything.</do_thrice> 輸出結(jié)果: anything. anything. anything. Ø &
82、#160; 嵌套內(nèi)容可以是有效的ftl,下面是一個有些復(fù)雜的例子:<border> <ul> <do_thrice> <li><greet person="joe"/> </do_thrice> </ul></border> 輸出結(jié)果: <table border=4 cellspacing=0 cellpadding=4><tr><td> <ul>
83、<li><font size="+2">hello joe!</font> <li><font size="+2">hello joe!</font> <li><font size="+2">hello joe!</font> </ul> </tr></td></table> Ø
84、; 宏定義中的局部變量對嵌套內(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("
85、?")</repeat>輸出結(jié)果: test 3/1: ? ? ? test 3/2: ? ? ? test 3/3: ? ? ?Ø l 在宏定義中使用循環(huán)變量Ø 用戶定義指令可以有循環(huán)變量,通常用于重復(fù)嵌套內(nèi)容,基本用法是:作為nested指令的參數(shù)傳遞循
86、環(huán)變量的實(shí)際值,而在調(diào)用用戶定義指令時,在<>開始標(biāo)記的參數(shù)后面指定循環(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!</#i
87、f></repeat> 輸出結(jié)果: 1. 0.5 2. 1 3. 1.5 4. 2 last! Ø 指定的循環(huán)變量的數(shù)目和用戶定義指令開始標(biāo)記指定的不同不會有問題n 調(diào)用時少指定循環(huán)變量,則多指定的值不可見n 調(diào)用時多指定循環(huán)變量,多余的循環(huán)變量不會被創(chuàng)建(2
88、)在模板中定義變量l 在模板中定義的變量有三種類型:Ø plain變量:可以在模板的任何地方訪問,包括使用include指令插入的模板,使用assign指令創(chuàng)建和替換Ø 局部變量:在宏定義體中有效,使用local指令創(chuàng)建和替換Ø
89、60; 循環(huán)變量:只能存在于指令的嵌套內(nèi)容,由指令(如list)自動創(chuàng)建;宏的參數(shù)是局部變量,而不是循環(huán)變量l 局部變量隱藏(而不是覆蓋)同名的plain變量;循環(huán)變量隱藏同名的局部變量和plain變量,下面是一個例子:<#assign x = "plain">1. $x <#- we see the plain var. here -><test/>6. $x <#- the value of pla
90、in var. was not changed -><#list "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 <#-
91、the new value of plain var. -> <#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
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度年福建省高校教師資格證之高等教育法規(guī)真題練習(xí)試卷B卷附答案
- 2024年光學(xué)纖維面板系列項(xiàng)目資金需求報告代可行性研究報告
- 第七章 面談?wù)n件
- “雙減”背景下小學(xué)數(shù)學(xué)作業(yè)設(shè)計(jì)的策略研究實(shí)施方案范文
- 2024年適用職工勞動協(xié)議格式文件
- 2024年專業(yè)期貨交易中介服務(wù)協(xié)議
- 揚(yáng)州大學(xué)封志明老師預(yù)測《導(dǎo)游基礎(chǔ)知識》模擬試題參考答案
- 設(shè)備設(shè)施運(yùn)行維護(hù)管理方案5篇
- 2024年化工業(yè)品買賣協(xié)議
- 2024閣樓房屋銷售協(xié)議模板
- 2024-2030年中國?;沸袠I(yè)發(fā)展趨勢與投資前景展望報告
- 中國企業(yè)投資緬甸光伏發(fā)電市場機(jī)會分析及戰(zhàn)略規(guī)劃報告2024-2030年
- 2024年廣東省深圳市中考?xì)v史試題
- 化工(危險化學(xué)品)企業(yè)主要負(fù)責(zé)人、安管員安全生產(chǎn)管理專項(xiàng)培訓(xùn)考核試卷(附參考答案)
- 2024年人教版小學(xué)三年級語文(上冊)期中考卷及答案
- 《信息化項(xiàng)目驗(yàn)收工作規(guī)范》
- 2024年全國軟件水平考試之高級網(wǎng)絡(luò)規(guī)劃設(shè)計(jì)師考試重點(diǎn)黑金模擬題(詳細(xì)參考解析)
- 經(jīng)濟(jì)學(xué)題庫(200道)
- 2024年巴西私人安保服務(wù)市場機(jī)會及渠道調(diào)研報告
- 課《聞王昌齡左遷龍標(biāo)遙有此寄》跨學(xué)科公開課一等獎創(chuàng)新教學(xué)設(shè)計(jì)
- 2024年江蘇省連云港市中考英語真題(含解析)
評論
0/150
提交評論