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

下載本文檔

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

文檔簡介

FreeMarkerFreeMarkerJava編寫FreeMarkerHTMLWebMVC模式的應(yīng)用程序雖然FreeMarker具有一些編程的力氣,但通常由Java程序預(yù)備要顯示的數(shù)據(jù),由FreeMarker生成頁面,通過模板顯示預(yù)備的數(shù)據(jù)〔如以以下圖〕FreeMarkerWeb應(yīng)用框架,而適合作為Web應(yīng)用框架一個組件 FreeMarkerServlet;FreeMarker同樣可以應(yīng)Web應(yīng)用程序環(huán)境FreeMarkerModel2框架〔Struts〕的視圖組件,你也可以在模板中使JSP標記庫FreeMarker是免費的1、通用目標能夠生成各種文本:HTML、XML、RTF、Java源代碼等等易于嵌入到你的產(chǎn)品中:輕量級;不需要Servlet環(huán)境插件式模板載入器:可以從任何源載入模板,如本地文件、數(shù)據(jù)庫等等 你可以按你所需生成文本:保存到本地文件;作為Email發(fā)送;從Web應(yīng)用程序發(fā)送它返回給Web掃瞄器2、強大的模板語言全部常用的指令:include、if/elseif/else、循環(huán)構(gòu)造在模板中創(chuàng)立和轉(zhuǎn)變變量幾乎在任何地方都可以使用簡潔表達式來指定值命名的宏,可以具有位置參數(shù)和嵌套內(nèi)容 名字空間有助于建立和維護可重用的宏庫,或者將一個大工程分成模塊,而不必擔憂名字沖突輸出轉(zhuǎn)換塊:在嵌套模板片段生成輸出時,轉(zhuǎn)換HTML轉(zhuǎn)義、壓縮、語法高亮等等;你可以定義自己的轉(zhuǎn)換3、通用數(shù)據(jù)模型FreeMarker不是直接反射到Java對象,Java對象通過插件式對象封裝,以變量方式在模板中顯示 〔接口JavaBeaXMLSQL查詢結(jié)果集等等告知模板開發(fā)者使用方法,使其不受技術(shù)細節(jié)的打攪4Web預(yù)備在模板語言中內(nèi)建處理典型Web相關(guān)任務(wù)〔如HTML轉(zhuǎn)義〕的構(gòu)造能夠集成到Model2Web應(yīng)用框架中作為JSP的替代支持JSP標記庫為MVC模式設(shè)計:分別可視化設(shè)計和應(yīng)用程序規(guī)律;分別頁面設(shè)計員和程序員5、智能的國際化和本地化字符集智能化〔內(nèi)部使用UNICODE〕數(shù)字格式本地化敏感日期和時間格式本地化敏感非US字符集可以用作標識〔如變量名〕多種不同語言的一樣模板6XML處理力氣<#recurse>和<#visit>指令〔2.3版本〕用于遞歸遍歷XML樹在模板中清楚和直覺的訪問XML對象模型FreeMarker設(shè)計指南(1)1、快速入門〔1〕模板+數(shù)據(jù)模型=輸出FreeMarker基于設(shè)計者和程序員是具有不同專業(yè)技能的不同個體的觀念 他們是分工勞動的:設(shè)計者專注于表示——創(chuàng)立HTML文件、圖片、Web頁面的其它可視化方面;程序員創(chuàng)立系統(tǒng),生成設(shè)計頁面要顯示的數(shù)據(jù)常常會遇到的問題是:在Web頁面〔或其它類型的文檔〕中顯示的信息在設(shè)計頁面時是無效的,是基于動態(tài)數(shù)據(jù)的HTML〔或其它要輸出的文本中參與一些特定指令,F(xiàn)reeMarker會在輸出頁面給最終用戶時,用適當?shù)臄?shù)據(jù)替代這些代碼下面是一個例子:<html><html><head><title>Welcome!</title></head></head><body><h1>Welcome${user}!</h1><p>Ourlatestproduct:<ahref=“${latestProduct.url}“>${latestP}</a>!</body></html> 這個例子是在簡潔的HTML中參與了一些由${…}包圍的特定代碼,這些特定代碼FreeMarker的指令,而包含F(xiàn)reeMarker的指令的文件就稱為模板〔Template〕至于user、latestProduct.urllatestP來自于數(shù)據(jù)模型〔datamodel〕 數(shù)據(jù)模型由程序員編程來創(chuàng)立,向模板供給變化的信息,這些信息來自于數(shù)據(jù)庫、文件,甚至于在程序中直接生成模板設(shè)計者不關(guān)心數(shù)據(jù)從那兒來,只知道使用已經(jīng)建立的數(shù)據(jù)模型下面是一個可能的數(shù)據(jù)模型:(root)(root)|+-user=“BigJoe“|+-latestProduct|+-url=“products/greenmouse.html“|+-name=“greenmouse“ 數(shù)據(jù)模型類似于計算機的文件系統(tǒng),latestProduct可以看作是名目,而user、url和name看作是文件,urlnamelatestProduct名目中〔這只是一個比方,實際并不存在〕FreeMarker將上面的數(shù)據(jù)模型合并到模板中,就創(chuàng)立了下面的輸出:<html><html><head><title>Welcome!</title></head><body><h1>WelcomeBigJoe!</h1><p>Our<p>Ourlatestproduct:<ahref=“products/greenmouse.html“>greenmouse</a>!</body></html>數(shù)據(jù)模型典型的數(shù)據(jù)模型是樹型構(gòu)造,可以任意簡潔和深層次,如下面的例子:(root)(root)|+-animals|||+-mouse|||||+-size=“small“|||||+-price=50|||+-elephant|||||+-size=“l(fā)arge“|||||+-price=5000|||+-python|||+-size=“medium“|||+-price=4999|+-test=“Itisatest“|+-+-whatnot|+-because=“don”tknow“類似于名目的變量稱為hashes,包含保存下級變量的唯一的查詢名字類似于文件的變量稱為scalars,保存單值 scalars保存的值有兩種類型:字符串〔用引號括起,可以是單引號或雙引號〕和數(shù)字〔不要用引號將數(shù)字括起,這會作為字符串處理〕scalars的訪問從root開頭,各局部用“.”分隔,如animals.mouse.price 另外一種變量是sequences,和hashes類似,只是不使用變量名字,而使用數(shù)字索引,如下面的例子:(root)(root)|+-animals|||+-(1st)|||||+-name=“mouse“|||||+-size=“small“|||||+-price=50|||+-(2nd)|||||+-name=“elephant“|||||+-size=“l(fā)arge“|||||+-price=5000|||+-(3rd)||||+-name=“python“|||+-size=“medium“|||+-price=4999|+-whatnot|+-fruits|+-(1st)=“orange“|+-(2nd)=“banana“scalars的訪問使用索引,如animals[0].name模板FreeMarker模板中可以包括下面三種特定局部:${…}:稱為interpolations,F(xiàn)reeMarker會在輸出時用實際值進展替代FTL標記〔FreeMarker模板語言標記:類似于HTML標記,為了與HTML標記區(qū)分,用#開頭〔有些以@開頭,在后面表達〕注釋:包含在<#--和-->〔而不是<!--和-->〕之間下面是一些使用指令的例子:if指令<#if<#ifanimals.python.price<animals.elephant.price>Pythonsarecheaperthanelephantstoday.<#else>Pythonsarenotcheaperthanelephantstoday.</#if>list指令<p>We<p>Wehavetheseanimals:<tableborder=1><tr><th>Name<th>Price<#listanimalsasbeing><tr><td>${}<td>${being.price}Euros</#list></#list></table>輸出為:<p>We<p>Wehavetheseanimals:<tableborder=1><tr><th>Name<th>Price<tr><td>mouse<td>50Euros<tr><td>elephant<td>5000Euros<tr><td>python<td>4999Euros</table>include指令<html><html><head><title>Test</title></head><body><h1>Test</h1><p>Blahblah...<#include“/copyright_footer.html“></body></html>一起使用指令<p>We<p>Wehavetheseanimals:<tableborder=1><tr><th>Name<th>Price<#listanimalsasbeing><tr><td><#ifbeing.size=“l(fā)arge“><b></#if>${}<#if<#ifbeing.size=“l(fā)arge“></b></#if><td>${being.price}Euros</#list></table>FreeMarkerFreeMarker設(shè)計指南(3)3、模板整體構(gòu)造模板使用FTL〔FreeMarker模板語言〕編寫,是下面各局部的一個組合:文本:直接輸出Interpolation:由${和},或#{和}來限定,計算值替代輸出 FTL標記:FreeMarkerHTML標記類似,名字前加#予以區(qū)分,不會輸出注釋:由<#--和-->限定,不會輸出下面是以一個具體模板例子:<html><html>[BR]<head>[BR]<title>Welcome!</title>[BR]</head>[BR]<body>[BR]<#--Greettheuserwithhis/hername-->[BR]<h1>Welcome${user}!</h1>[BR]<p>Wehavetheseanimals:[BR]<ul>[BR]<#listanimalsasbeing>[BR]<li>${}for${being.price}Euros[BR]</#list>[BR]</ul></ul>[BR]</body>[BR]</html>[BR]是用于換行的特別字符序列留意事項:FTLlist是正確的FTLList${name和${NAME}是不同的Interpolation只能在文本中使用FTL標記不能位于另一個FTL標記內(nèi)部,例如:<#if<#if<#include”foo”>=”bar”>...</if>注釋可以位于FTL標記和Interpolation內(nèi)部,如下面的例子:<h1>Welcome<h1>Welcome${user<#--Thenameofuser-->}!</h1>[BR]<p>Wehavetheseanimals:[BR]<ul>[BR]<#list<#--somecomment...-->animalsas<#--again...-->being>[BR]...多余的空白字符會在模板輸出時移除指令在FreeMarker中,使用FTL標記引用指令有三種FTL標記,這和HTML標記是類似的:開頭標記:<#directivenameparameters>完畢標記:</#directivename>空內(nèi)容指令標記:<#directivenameparameters/>有兩種類型的指令:預(yù)定義指令和用戶定義指令 用戶定義指令要使用@替換#,如<@mydirective>...</@mydirective>〔會在后面表達〕FTL標記不能夠穿插,而應(yīng)當正確的嵌套,如下面的代碼是錯誤的:<ul><ul><#listanimalsasbeing><li>${}for${being.price}Euros<#ifuse=“BigJoe“>(exceptforyou)</#list></#if><#--WRONG!--></ul>假設(shè)使用不存在的指令,F(xiàn)reeMarker不會使用模板輸出,而是產(chǎn)生一個錯誤消息FreeMarker會無視FTL標記中的空白字符,如下面的例子:<#list[BR]<#list[BR]animalsas[BR]being[BR]>[BR]${}for${being.price}Euros[BR]</#list>但是,<、</和指令之間不允許有空白字符表達式直接指定值字符串使用單引號或雙引號限定假設(shè)包含特別字符需要轉(zhuǎn)義,如下面的例子:${“It”s${“It”s\“quoted\“andthisisabackslash:\\“}${”It\”s“quoted“andthisisabackslash:\\”}輸出結(jié)果是:It”sIt”s“quoted“andthisisabackslash:\It”s“quoted“andthisisabackslash:\下面是支持的轉(zhuǎn)義序列:轉(zhuǎn)義序列含義\“ 雙引號(u0022)\” 單引號(u0027)\\ 反斜杠(u005C)\n 換行(u000A)\r Return(u000D)\t Tab(u0009)\b\f\l\g\a\{\xCode

Backspace(u0008)Formfeed(u000C)<>&{416進制Unicode代碼 有一類特別的字符串稱為raw\和{等不具有特別含義,該類字符串在引號前面加r,下面是一個例子:${${r“${foo}“}${r“C:\foo\bar“}輸出的結(jié)果是:${foo}${foo}C:\foo\bar數(shù)字直接輸入,不需要引號精度數(shù)字使用“.”分隔,不能使用分組符號目前版本不支持科學(xué)計數(shù)法,所以“1E3”是錯誤的不能省略小數(shù)點前面的0,所以“.5”是錯誤的8、+8、088.00都是一樣的布爾值truefalse,不使用引號序列由逗號分隔的子變量列表,由方括號限定,下面是一個例子:<#list<#list[“winter“,“spring“,“summer“,“autumn“]asx>${x}</#list>輸出的結(jié)果是:winterwinterspringsummerautumn列表的工程是表達式,所以可以有下面的例子:[2[2+2,[1,2,3,4],“whatnot“]2..5等同于[2,3,4,5],但是更有效率,留意數(shù)字范圍沒有方括號可以定義反遞增的數(shù)字范圍,如5..2散列〔hash〕{“name“:“greenmouse“,“price“:150}{“name“:“greenmouse“,“price“:150}鍵和值都是表達式,但是鍵必需是字符串獵取變量 頂層變量:${variable},變量名只能是字母、數(shù)字、下劃線、$、@和#的組合,且不能以數(shù)字開頭從散列中獵取數(shù)據(jù)可以使用點語法或方括號語法,假設(shè)有下面的數(shù)據(jù)模型:(root)(root)|+-book|||+-title=“Breedinggreenmouses“|||+-author|||+-name=“JuliaSmith“|||+-info=“Biologist,1923-1985,Canada“|+-test=“title“下面都是等價的:book[“author“].namebook.author.[“name“]book[“author“][“name“] 由于名字是任意表達式的結(jié)果須是數(shù)字;留意:第一個工程的索引是0序列片斷:使用[startIndex..endIndex]語法,從序列中獲得序列片斷〔也是序列;startIndex和endIndex是結(jié)果為數(shù)字的表達式特別變量:FreeMarker內(nèi)定義變量,使用.variablename語法訪問字符串操作Interpolation〔或連接操作〕可以使用${..}〔或#{..}〕在文本局部插入表達式的值,例如:${“Hello${“Hello${user}!“}${“${user}${user}${user}${user}“}可以使用+操作符獲得同樣的結(jié)果${“Hello${“Hello“+user+“!“}${user+user+user+user}${..}只能用于文本局部,下面的代碼是錯誤的:<#if<#if${isBig}>Wow!</#if><#if“${isBig}“>Wow!</#if>應(yīng)當寫成:<#if<#ifisBig>Wow!</#if>子串例子〔假設(shè)user的值為“BigJoe”〕:${user[0]}${user[4]}${user[0]}${user[4]}${user[1..4]}結(jié)果是〔0〕:BJBJigJ序列操作連接操作:和字符串一樣,使用+,下面是一個例子:<#list<#list[“Joe“,“Fred“]+[“Julia“,“Kate“]asuser>-${user}</#list>輸出結(jié)果是:JoeJoeFredJuliaKate散列操作連接操作:和字符串一樣,使用+,假設(shè)具有一樣的key,右邊的值替代左邊的值,例如:<#assign<#assignages={“Joe“:23,“Fred“:25}+{“Joe“:30,“Julia“:18}>Joeis${ages.Joe}Fredis${ages.Fred}Juliais${ages.Julia}輸出結(jié)果是:JoeJoeis30Fredis25Juliais18算術(shù)運算+、-、×、/、%,下面是一個例子:${x${x*x-100}${x/2}${12%10}輸出結(jié)果是〔x5〕:-75-752.52操作符兩邊必需是數(shù)字,因此下面的代碼是錯誤的:${3${3*“5“}<#--WRONG!-->使用+操作符時,假設(shè)一邊是數(shù)字,一邊是字符串,就會自動將數(shù)字轉(zhuǎn)換為字符串,例如:${3${3+“5“}輸出結(jié)果是:3535int〔后面表達〕獲得整數(shù)局部,例如:${(x/2)?int}${(x/2)?int}${1.1?int}${1.999?int}${-1.1?int}${-1.999?int}輸出結(jié)果是〔x5〕:22111-1-1比較操作符使用=〔或==,完全相等〕測試兩個值是否相等,使用!=測試兩個值是否不相等 =和!=兩邊必需是一樣類型的值,否則會產(chǎn)生錯誤,例如<#if1=“1“>會引起錯誤是準確比較,所以對“x“、“x “和“X“是不相等的對數(shù)字和日期可以使用<、<=、>和>=,但不能用于字符串 FTL>和>=可以使用括號來避開這種狀況,例如<#if(x>y)>另一種替代的方法是,使用lt、lte、gt和gte來替代<、<=、>和>=規(guī)律操作符&&〔and〕、||〔or〕、!〔not〕,只能用于布爾值,否則會產(chǎn)生錯誤例子:<#if<#ifx<12&&color=“green“>Wehavelessthan12things,andtheyaregreen.</#if><#if!hot><#--herehotmustbeaboolean-->It”snothot.</#if>內(nèi)建函數(shù) ?”替代“.函數(shù)字符串使用的:html:對字符串進展HTML編碼cap_first:使字符串第一個字母大寫lower_case:將字符串轉(zhuǎn)換成小寫upper_case:將字符串轉(zhuǎn)換成大寫trim:去掉字符串前后的空白字符序列使用的:size:獲得序列中元素的數(shù)目數(shù)字使用的:〔如-1.9?int的結(jié)果是-1〕例子〔test保存字符串“Tom&Jerry“〕:${test?html}${test?html}${test?upper_case?html}輸出結(jié)果是:TomTom&JerryTOMTOM&JERRY操作符優(yōu)先挨次操作符組操作符后綴 [subvarName][subStringRange].(methodParams)一元 +expr、-expr、!內(nèi)建 ?乘法 *、/、%加法 +、-關(guān)系 <、>、<=、>=〔lt、lte、gt、gte〕相等 ==〔=〕、!=規(guī)律and 規(guī)律or ||數(shù)字范圍..InterpolationInterpolation有兩種類型:Interpolation:#{expr}或#{expr;format}只能用于文本局部通用Interpolation插入字符串值:直接輸出表達式結(jié)果<#settingnumber_format=“currency“/><#assignanswer=42/>${answer}${answer?string}<#--the<#settingnumber_format=“currency“/><#assignanswer=42/>${answer}${answer?string}<#--thesameas${answer}-->${answer?string.number}${answer?string.currency}${answer?string.percent}輸出結(jié)果是:$42.00$42.00$42.0042$42.00$42.004,200%${lastUpdated?string(“yyyy-MM-ddHH:mm:sszzzz“)}${lastUpdated?string(“EEE,MMMd,””yy“)}${lastUpdated?string(“yyyy-MM-ddHH:mm:sszzzz“)}${lastUpdated?string(“EEE,MMMd,””yy“)}${lastUpdated?string(“EEEE,MMMMdd,yyyy,hh:mm:ssa”(”zzz”)”“)}輸出的結(jié)果類似下面的格式:2023-04-082023-04-0821:24:44PacificDaylightTimeTue,Apr8,”03Tuesday,April08,2023,09:24:44PM(PDT) 指令設(shè)置〕將表達式結(jié)果轉(zhuǎn)換成文本輸出;可以string格式化單個Interpolation,下面是一個例子:<#assign<#assignfoo=true/>${foo?string(“yes“,“no“)}輸出結(jié)果是:yesyes數(shù)字Interpolation的#{expr;format}形式可以用來格式化數(shù)字,format可以是:mX:小數(shù)局部最小X位MX:小數(shù)局部最大X位例子:<#--<#--IfthelanguageisUSEnglishtheoutputis:--><#assignx=2.582/><#assigny=4/>#{x;M2}<#--2.58-->#{y;M2}<#--4-->#{x;m1}<#--2.6-->#{y;m1}<#--4.0-->#{x;m1M2}<#--2.58-->#{y;m1M2}<#--4.0-->FreeMarkerFreeMarker設(shè)計指南(4)4、雜項用戶定義指令macro指令定義,而變換器是在模板外由程序定義,這里只介紹宏根本用法<#macrogreet><#macrogreet><fontsize=“+2“>HelloJoe!</font></#macro>作為用戶定義指令使用宏變量時,使用@替代FTL標記中的#<@greet></@greet><@greet></@greet>假設(shè)沒有體內(nèi)容,也可以使用:<@greet/><@greet/>參數(shù)macro指令中可以在宏變量之后定義參數(shù),如:<#macro<#macrogreetperson><fontsize=“+2“>Hello${person}!</font></#macro>可以這樣使用這個宏變量:<@greet<@greetperson=“Fred“/>and<@greetperson=“Batman“/>輸出結(jié)果是:<font<fontsize=“+2“>HelloFred!</font>and<fontsize=“+2“>HelloBatman!</font>宏的參數(shù)是FTL表達式,所以下面的代碼具有不同的意思:<@greet<@greetperson=Fred/> Fred變量的值傳給person參數(shù),該值不僅是字符串,還可以是其它類型,甚至是簡潔的表達式宏可以有多參數(shù),下面是一個例子:<#macro<#macrogreetpersoncolor><fontsize=“+2“color=“${color}“>Hello${person}!</font></#macro></#macro>可以這樣使用該宏變量:<@greet<@greetperson=“Fred“color=“black“/>其中參數(shù)的次序是無關(guān)的,因此下面是等價的:<@greet<@greetcolor=“black“person=“Fred“/>只能使用在macro指令中定義的參數(shù),并且對全部參數(shù)賦值,所以下面的代碼是錯誤的:<@greet<@greetperson=“Fred“color=“black“background=“green“/><@greetperson=“Fred“/>可以在定義參數(shù)時指定缺省值,如:<#macro<#macrogreetpersoncolor=“black“><fontsize=“+2“color=“${color}“>Hello${person}!</font></#macro>這樣<@greetperson=“Fred“/>就正確了宏的參數(shù)是局部變量,只能在宏定義中有效嵌套內(nèi)容 <#nested>指令執(zhí)行指令開頭和完畢標記之間的模板片斷例子:<#macro<#macroborder><tableborder=4cellspacing=0cellpadding=4><tr><td><#nested></tr></td></table></#macro>這樣使用該宏變量:<@border><@border>Theborderedtext</@border>輸出結(jié)果:<table<tableborder=4cellspacing=0cellpadding=4><tr><td>Theborderedtext</tr></td></table><#nested>指令可以被屢次調(diào)用,例如:<#macro<#macrodo_thrice><#nested><#nested><#nested><#nested></#macro><@do_thrice>Anything.</@do_thrice>輸出結(jié)果:Anything.Anything.Anything.Anything.FTL,下面是一個有些簡潔的例子:<@border><@border><ul><@do_thrice><li><@greetperson=“Joe“/></@do_thrice></ul></@border>輸出結(jié)果:<table<tableborder=4cellspacing=0cellpadding=4><tr><td><ul><li><fontsize=“+2“>HelloJoe!</font><li><fontsize=“+2“>HelloJoe!</font><li><fontsize=“+2“>HelloJoe!</font></ul></tr></td></table>宏定義中的局部變量對嵌套內(nèi)容是不行見的,例如:<#macro<#macrorepeatcount><#localy=“test“><#list1..countasx>${y}${count}/${x}:<#nested></#list></#macro><@repeatcount=3>${y?default(“?“)}${x?default(“?“)}${count?default(“?“)}</@repeat>輸出結(jié)果:testtest3/1:???test3/2:???test3/3:???在宏定義中使用循環(huán)變量 nested指令的參數(shù)傳遞循環(huán)變量的實際值,而在調(diào)用用戶定義指令時,在<@…>開頭標記的參數(shù)后面指定循環(huán)變量的名字例子:<#macro<#macrorepeatcount><#list1..countasx><#nestedx,x/2,x==count></#list></#macro><@repeatcount=4;c,halfc,last>${c}.${halfc}<#iflast>Last!</#if></@repeat>輸出結(jié)果:4.2Last!指定的循環(huán)變量的數(shù)目和用戶定義指令開頭標記指定的不同不會有問題調(diào)用時少指定循環(huán)變量,則多指定的值不行見調(diào)用時多指定循環(huán)變量,多余的循環(huán)變量不會被創(chuàng)立在模板中定義變量在模板中定義的變量有三種類型: plain變量:可以在模板的任何地方訪問,包括使用include指令插入的模板,assign指令創(chuàng)立和替換局部變量:在宏定義體中有效,使用local指令創(chuàng)立和替換 循環(huán)變量:只能存在于指令的嵌套內(nèi)容,由指令〔如list〕自動創(chuàng)立;宏的參數(shù)是局部變量,而不是循環(huán)變量局部變量隱蔽〔而不是掩蓋〕同名的plain變量;循環(huán)變量隱蔽同名的局部變量和plain變量,下面是一個例子:<#assign<#assignx=“plain“>1.${x}<#--weseetheplainvar.here--><@test/>${x}<#--thevalueofplainvar.wasnotchanged--><#list[“l(fā)oop“]asx>${x}<#--nowtheloopvar.hidestheplainvar.--><#assignx=“plain2“><#--replacetheplainvar,hidingdoesnotmaterhere-->${x}<#--itstillhidestheplainvar.--></#list>${x}<#--thenewvalueofplainvar.--><#macrotest>${x}<#--westillseetheplainvar.here--><#localx=“l(fā)ocal“>${x}<#--nowthelocalvar.hidesit--><#list[“l(fā)oop“]asx>${x}<#--nowtheloopvar.hidesthelocalvar.--></#list>${x}<#--nowweseethelocalvar.again--></#macro>輸出結(jié)果:1.1.plainplainplainlocallooplocalplainlooploopplain2內(nèi)部循環(huán)變量隱蔽同名的外部循環(huán)變量,如:<#list<#list[“l(fā)oop1“]asx>${x}<#list[“l(fā)oop2“]asx>${x}<#list[“l(fā)oop3“]asx>${x}</#list>${x}</#list>${x}</#list>輸出結(jié)果:looploop1loop2loop3loop2loop1 〔而不是掩蓋globaluser的值是BigJoe:<#assign<#assignuser=“JoeHider“>${user}${user}<#--prints:JoeHider-->${.globals.user}<#--prints:BigJoe-->名字空間通常狀況,只使用一個名字空間,稱為主名字空間 為了創(chuàng)立可重用的宏、變換器或其它變量的集合〔通常稱庫間,其目的是防止同名沖突創(chuàng)立庫下面是一個創(chuàng)立庫的例子〔假設(shè)保存在lib/my_test.ftl中:<#macro<#macrocopyrightdate><p>Copyright(C)${date}JuliaSmith.Allrightsreserved.<br>Email:${mail}</p></#macro><#assignmail=“mailto:jsmith@acme““jsmith@acme“> Freemarker會為導(dǎo)入的庫創(chuàng)立的名字空間,并可以通過import指令中指定的散列變量訪問庫中的變量:<#import<#import“/lib/my_test.ftl“asmy><#assign“mailto:fred@acme“mail=“fred@acme“><@my.copyrightdate=“1999-2023“/>${my.mail}${mail}輸出結(jié)果:<p>Copyright<p>Copyright(C)1999-2023JuliaSmith.Allrightsreserved.<br>Email:“mailto:jsmith@acme“jsmith@acme</p>“mailto:jsmith@acme“jsmith@acme“mailto:fred@acme“fred@acme可以看到例子中使用的兩個同名變量并沒有沖突,由于它們位于不同的名字空間可以使用assign指令在導(dǎo)入的名字空間中創(chuàng)立或替代變量,下面是一個例子:<#import<#import“/lib/my_test.ftl“asmy>${my.mail}<#assign“mailto:jsmith@other“mail=“jsmith@other“inmy>${my.mail}輸出結(jié)果:“mailto:js

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論