




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Velocity中文手冊
1關(guān)于
Velocity用戶指南旨在幫助頁面設(shè)計者和內(nèi)容供應(yīng)者了解
Velocity和其簡潔而又強大的腳本語言(VelocityTemplateLanguage
(VTL))o本指南中有許多示例展示了用Velocity來講動態(tài)內(nèi)容嵌入
到網(wǎng)站之中,但是全部的VTLexamples都同演示用于全部的頁面和
模版。
感謝選擇Velocity!
2什么是Velocity?
Velocity是一個基于Java的模版引擎。它允許web頁面設(shè)計者
引用JAVA代碼預(yù)定義的方法。Web設(shè)計者可以依據(jù)MVC模式和
JAVA程序員并行工作,這意味著Web設(shè)計者可以單獨專注于設(shè)計良
好的站點,而程序員貝J可單獨專注于編寫底層代碼。Velocity將
Java代碼從web頁面中分別出來,使站點在長時間運行后仍舊具有
很好的可維護(hù)性,并供應(yīng)了一個除JSP和PHP之外的可行的被選方
案。
Velocity可用來從模板產(chǎn)生web頁面,SQL,PostScript以及其他輸出。
他也可用于一個獨立的程序以產(chǎn)生源代碼和報告,或者作為其它系統(tǒng)
的一個集成組件。這個項目完成后,Velocity將為Turbineweb應(yīng)用
程序框架供應(yīng)模板服務(wù)。Velocity+Turbine方案供應(yīng)的模板服務(wù)將允
許web應(yīng)用按真正的mvc模式進(jìn)行開發(fā)。
3Velocity可以做什么?
MudStore示例
假設(shè)你是一個特地銷售泥漿(MUD)的在線商店的頁面設(shè)計者。
我們稱他為“TheOnlineMudStore”。生意很好。客戶訂購各種各樣
的類型和數(shù)量的泥漿。他們運用他們的用戶名和密碼登陸到商店中來,
就可以閱讀他們的訂貨和購買其他東西。現(xiàn)在,赤土陶泥正在促銷,
這是一種很常用的泥巴。一少部分顧客很有規(guī)律的購買一種亮紅土
BrightRedMud,這也是促銷產(chǎn)品,但是不太常用,因此被移到頁面
的邊緣。全部顧客的信息都在數(shù)據(jù)庫中被跟蹤,因此有一天問題出現(xiàn)
了:為什么不運用Velocity來定位目標(biāo)客戶,這些客戶對某種類型的
產(chǎn)品特殊感愛好?
Velocity使針對訪問者特性的WEB頁面客戶化(特性化)特別
簡潔。作為一個在線泥巴商店的站點設(shè)計者,以想在客戶以登陸進(jìn)展
點后就看到它們想看的頁面。
你遇到你公司的軟件工程師,每個人都認(rèn)為$custome「將保持當(dāng)前登
陸進(jìn)入的客戶信息,而$mudsOnSpecial將士當(dāng)前全部促銷的泥巴。
$flogger對象包含有助于促銷的方法。對于當(dāng)前的任務(wù),讓我們僅關(guān)
注這三個問題。記住,你不須要擔(dān)憂軟件工程師如何從數(shù)據(jù)庫中取得
顧客信息,但你必需知道他們可以。這樣可以使你專注于你的工作而
軟件工程師則忙于他們自己的工作。
你可以在你的頁面中嵌入如下的VTL語句:
<HTML>
<BODY>
Hello$customer.Name!
<table>
#foreach($mudin$mudsOnSpecial)
#if($customer.hasPurchased($mud))
<tr>
<td>
$flogger.getPromo($mud)
</td>
</tr>
#end
#end
</table>
foreach語句的細(xì)微環(huán)節(jié)將進(jìn)一步細(xì)說,但重要的是這個短小的腳本
盡然可以在你的站點上運行。當(dāng)有一個傾向于亮紅土的顧客登陸進(jìn)來
時丁亮紅土正在促銷,這就是這個顧客所看到的,并且促銷顯示特別
顯著。假如另外一個長期購買赤陶土的顧客登陪進(jìn)來,赤陶土促銷的
提示信息則應(yīng)當(dāng)在前面中間位置。Velocity是特別敏捷的,受限的只
是你的創(chuàng)建力。
寫在VTL參考文檔中的是其他Velocity元素,他們一起給你很強大的
實力和敏捷性以創(chuàng)建很好的站點。待你更加了解這些元素,就可以起
先釋放Velocity的強大動力。
4Velocity模板語言(VTL):介紹
Velocity模板語言(VTL)旨在為Web頁面結(jié)合動態(tài)內(nèi)容供應(yīng)最簡
潔、簡潔和簡潔的方法。即使有一點或者沒有編程閱歷的頁面設(shè)計者
也可以很快能為頁面供應(yīng)動態(tài)內(nèi)容。
VTL運用引用(references)來將動態(tài)內(nèi)容嵌入web頁面,每個
變量就是某一個類型的引用。變量事實上是一個可以調(diào)用定義在java
代碼中的內(nèi)容的引用,或者它可以從頁面內(nèi)的VTL語句得出自身的
值。下面是一個例子,說明可以嵌入到HTML文檔中的VTL語句。
#set($a="Velocity")
這個VTL語句,就像全部的VTL語句一樣,以#字符起先,并
跟著一個指令set。當(dāng)一個在線訪問這懇求頁面時,Velocity模伴引
擎在頁面內(nèi)搜尋全部#字符,然后確定是哪一個標(biāo)記了VTL語句的起
先,哪個標(biāo)記不須要VTL做什么動作。
#字符后面緊跟一個指令set.。set指令運用一個括在括號內(nèi)的
表達(dá)式一一個等式將一個值指派給一個變量。變量在等號的左邊而值
在等號的右邊。
在上面的示例中,變量是$a值是Velocity。這個變量就象其他
引用一樣,以一個$字符起先。值通常在引號之中,對Velocity來說
一?般沒有類型沖突的問題,因為只有字符串(基于文本的信息)可以傳
遞給變量。
下面的主要規(guī)則可能有助于理解Velocity是如何工作的:引用以
$開頭用于取得什么東西,而指令以#起先用于做什么事情。
在上面的例子中,#set用于將一個值指派給一個變量。而變量細(xì)則
可以用來在模板中輸出“Velocity”。
5HelloVelocityWorld!
一旦一個值被賦紿一個變量,便可以在HTML中隨處引用它。在
下面的示例中,先給變量$幻。賦值然后引用它。
<html>
<body>
#set($foo="Velocity")
Hello$fooWorld!
</body>
<html>
這個頁面的結(jié)果是輸出“HelloVelocityWorld!%
為了使包含VTL指令的語句具有可讀性,我們激勵每個VTL語
句在一個新行起先,雖然并不肯定要這樣做。set將隨后深化說明。
6注釋
可以用注釋加入描述性文本,他們并不在模板引擎中輸出。注釋
可以有助于你的記憶或者想其他人說明你的VTL語句正在做什么。
##Thisisasinglelinecomment.
單行注釋以##起先,并在本行結(jié)束。假如須要加入多行注釋,
并不須要加入許多的單行注釋。多行注釋,以#*起先并以*#結(jié)束可
以處理這種狀況。
Thisistextthatisoutsidethemulti-linecomment.
Onlinevisitorscanseeit.
#*
Thusbeginsamulti-linecomment.Onlinevisitorswon't
seethistextbecausetheVelocityTemplatingEnginewill
ignoreit.
*#
Hereistextoutsidethemulti-linecomment;itisvisible.
下面事一些例子說明單行注釋和多行注釋如何工作。
Thistextisvisible.##Thistextisnot.
Thistextisvisible.
Thistextisvisible.#*Thistext,aspartofamulti-linecomment,
isnotvisible.Thistextisnotvisible;itisalsopartofthe
multi-linecomment.Thistextstillnotvisible.*#Thistextisoutside
thecomment,soitisvisible.
##Thistextisnotvisible.
還有第三種注釋,UTL注釋塊,可以用來存儲諸如文檔作者、
版本信息等。
#**
ThisisaVTLcommentblockand
maybeusedtostoresuchinformation
asthedocumentauthorandversioning
information:
@author
?version5
*#
7引用
VTL中有三種類型的引用:變量,屬性和方法。作為運用VTL的設(shè)計
者,你和你的工程師必需在引用的命名上取得一樣,以便在你的模板
中正確的運用他們。
有關(guān)引用的全部參數(shù)都處理為字符串對象。Everythingcomingtoand
fromareferenceistreatedasaStringobject.假如有——個對象表示
$foo(比如說是整型對象),Velocity將調(diào)用其toString()方法來將此
對象轉(zhuǎn)換為一個字符串。
7.1變量Variables
變量的簡略標(biāo)記是有一個前導(dǎo)V字符后跟一個VTL標(biāo)識符
(Identifier.)組成。一個VTL標(biāo)識符必需以一個字母起先(a.?z或A..
Z)o剩下的字符將由以下類型的字符組成:
字母(a..zzA..Z)
數(shù)字(0?.9)
連字符("」)
下劃線
下面是一些有效的變量引用:
$foo
$mudSlinger
$mud-slinger
$mud_slinger
$mudSlingerl
當(dāng)VTL引用一個變量時,比如$foo,變量可以從模板的set指令
取得值,也可以從Java代碼中取得。例如,假如Java變量$foo在
模板被懇求的時候具有值bar,則bar將替換頁面中的全部$foo的實
例。或者,假如包含下面的語句:
#set($foo="barH)
緊跟指令后的全部$foo的實例的輸出將會一樣值。
7.2屬性
VTL引用的其次種元素是屬性,而屬性具有獨特的格式。屬性的
簡略標(biāo)記識前導(dǎo)符$后跟一個VTL標(biāo)識符,在后跟一個點號
最終乂是一個VTL標(biāo)識符。這是一些有效的示例:
$customer.Address
$purchase.Total
請看第一個例子,$customer.Address.o他有兩種意思。它可以
意味著,查詢由customer標(biāo)是的哈希表并按關(guān)鍵字Address返回值。
但是$customer.Address也可能引用一個方法(下述,
$customer.Address可能是$customer.getAddress().的縮寫。當(dāng)一個
頁面被懇求時,Velocity將確定這兩種可能究竟是哪一個,然后返回
相應(yīng)的值。
7.3方法
方法在JAVA代碼中定義,并作一些有用的事情,比如運行一個
計算器或者作出一個確定。方法是事實上也是引用,由前導(dǎo)符”$“后
跟一個VTL標(biāo)識符,后跟一個VTL方法體(MethodBody)。VTL方
法體由一個VTL標(biāo)識符后跟一個左括號,再跟可選的參數(shù)列表,最
終是右括號。下面是一些有效的方法示例:
$customer.getAddress()
$purchase.getTotal()
$page.setTitle("MyHomePage")
$person.setAttributes(["Strange","Weird","Excited"])
前面兩個例子
-$customer.getAddress()和$purchase.getTotal()-看起來有點象
上面屬性一節(jié)中所用的樣
子,$customer.Address和$purchase.Total.o假如你想這些例子在
某些方面相關(guān),那你就對了。
VTL屬性可以為VTL方法用作簡略標(biāo)記。屬性
$customer.Address具有和方法$customer.getAddress()完全一樣
的效果。屬性和方法的主要不同點是方法中可以添加參數(shù)列表。
簡略標(biāo)記可以用在下面的方法中:
sun.getPlanets()
$annelid.getDirt()
$album.getPhoto()
我們或許希望方法可以為我們放回屬于太陽系的行星的名字,喂
養(yǎng)我們的蚯蚓,或者從相冊中返回一張照片。下面只有長的那個標(biāo)記
是可以工作的方法:
$sun.getPlanet(["Earth","Mars","Neptune"])
##不能將參數(shù)列表傳遞
$sisyphus.pushRock()
##Velocity假定我意思是$sisyphus.getRock()
$book.setTitle("HomagetoCatalonia")
##不能傳遞一個參數(shù)列表
7.4形式引用符FormalReferenceNotation
引用的簡略符號如上所述,但是另外還有一種引用的形式符號,
示例如下:
${mudSlinger}
${customer.Address}
${purchase.getTotal()}
在大多數(shù)狀況下,我們將運用引用的簡略符號,但在一些狀況下,
也須要擁護(hù)形式引用符以便正確處理。
假定你正在紙片上構(gòu)件一個句子,將運用$vice作為句子中名詞
的詞根。我們的目標(biāo)是允許人們選擇詞根,然后產(chǎn)生以下兩種結(jié)果之
"Jackisapyromaniac."或者"Jackisakleptomaniac."0
在這種狀況下,運用簡略符號是不太充分的。考慮到下面的例
子:
Jackisa$vicemaniac.
這里有個不確定性,Velocity假定$vicemaniac,(而不是$vice)
是一個你想要運用的標(biāo)識符。找不到$vicemaniac的值,他將返回
$vicemaniaco運用形式符號便可解決這個問題:
Jackisa${vice}maniac
現(xiàn)在Velocity知道$vice(而不是$vicemaniac)是一個引用。
形式符號常用在飲用咋模板中和文本干脆鄰近的地方。
7.5寧靜引用符QuietReferenceNotation
當(dāng)Velocity遇到一個位定義的引用時,其通常行為是輸出這個引
用的映像。比如,假設(shè)下面的引用出現(xiàn)在模板中的一部分:
<inputtype="text"name="email”value="$email7>
當(dāng)表單初次裝入時,變量引用$61713口沒有任何值,你寧愿是一
個空白域而不是具有值aemail'運用寧靜引用符可以繞過Velocity
的常規(guī)行為,在VTL中不用$email而是用$!email符號。所以,上面
的例子將會看起來像下面的樣子:
<inputtype="text"name="email"value="$!email7>
現(xiàn)在,當(dāng)表單初次裝入時,$email仍舊沒有值,但是將輸出空
字符串而不是為email”。
形式和寧靜引用符可以一起運用,如下所示:
<inputtype二"text”name="email"value="$!<email}"/>
8取得語義Gettingliteral
VTL特殊的字符,比如$和#,來做這個工作,因此在模板中運
用這些自負(fù)的時候必需特別當(dāng)心。本節(jié)講解并描述$的轉(zhuǎn)義。
8.1貨幣
我們寫下句子"Iboughta4lb.sackofpotatoesatthefarmer's
marketforonly$2,50!",這并沒有什么問題。但如前所述,VTL標(biāo)
識符總是以大寫或是小寫字母起先,所以$2.50在引用中將不會出錯。
8.2轉(zhuǎn)義有效的VTL引用
問題將會出現(xiàn),區(qū)為Velocity將有一個潛在的沖突。轉(zhuǎn)義特殊字
符是處理VTL模板種特殊字符的最好的方法,者可以用一個反斜線
來進(jìn)行。
foo
\foo
假如Velocity在VTL模板中遇到一j$email引用,他將在上下
文中查找相應(yīng)的值。這里,輸出將是foo,因為$email是定義了的。
假如$email未定義,輸出將是$60^1。
假設(shè)$email是定義了的(比如,具有值f。。),但是你想輸
出$emaiL可以有幾種方法來做這個事情,不是最簡潔的是運用轉(zhuǎn)
義符。
##Thefollowinglinedefines$emailinthistemplate:
#set($email="foo")
將輸出是
foo
\foo
留意:\綁定在$的左邊。從做綁定原則使\\\$email被說明為
\\$emailo和上面例子比較下面的例子,這里$email未定義。
輸出
留意,Velocity處理定義和未定義的引用是不同的。下面一個set指
令將$foo設(shè)為值gibbous.。
#set($foo="gibbous")
$moon=$foo
輸出將是$1110011=gibbous
一這里$moon作為字面輸出,因為他并沒有定義。而gibbous將在
$foo的位置輸出。
我們也可以轉(zhuǎn)義VTL指令,這將在指令一節(jié)祥述。
9CaseSubstitution
現(xiàn)在你大致了解了引用,可以在模板中運用它們了。Velocity采納了
許多JAVA原理的優(yōu)點,模板設(shè)計人員會發(fā)覺特別簡潔運用。例如:
$foo
$foo.getBar()
##isthesameas
$foo.Bar
$data.getUser(Hjon")
##isthesameas
$data.User("jon")
$data.getRequest().getServerName()
##isthesameas
##isthesameas
${data.Request.ServerName)
這個例子顯示了引用的一些其他用法。Velocity借鑒了Java的
自省和組件bean特征,來解決引用名在上下文中作為對象和對象方
法的問題。可以在你的模板的任何地方插入引用和求值。
Velocity,建模在SunMicrosystems定義的BEAN規(guī)范之上,是
大小寫敏感的;開發(fā)者努力捕獲和訂正可能出現(xiàn)的用戶錯誤。當(dāng)方法
getFoo()在模板中通過$bar.foo引用時,Velocity首先嘗試$getfoo。
假如失敗,他會再嘗試$getFoo。類似地,當(dāng)一個模板引用
到$bar.Foo,Velocity將嘗試$getFoo()先,然后嘗試getfoo()0
留意:模板中引用示例變量的問題仍舊沒有解決。只有引用等價
于JavaBean的getter/setter方法解決了。(比如$foo.Name解決了
到類Foo的getName()示例方法的引用,但不能引用Foo的一個公
共實例變量Name)o
10指令
因為指令(運用腳原來有效操控JAVA代碼的輸出)允許頁面設(shè)計員
真正專注于咱點的外觀和內(nèi)容設(shè)計,引用允許模板設(shè)計員為Web頁
面產(chǎn)生動態(tài)內(nèi)容。
10.1#set
#set指令用來為引用設(shè)置相應(yīng)的值。值可以被值派給變量引用或者
是屬性引用,而且賦值要在括號里括起來。
#set($primate="monkey")
#set($customer.Behavior=$pnmate)
賦值的左邊必需是一個變量應(yīng)用或者是屬性引用。右邊可以是下面的
類型之一:
變量引用
字面字符串
屬性引用
方法引用
字面數(shù)字
數(shù)組列表
這些例子演示了上述的每種類型:
#set($monkey=$bill)##variablereference
#set($monkey.Friend="monica")##stringliteral
#set($monkey.Blame=$whitehouse.Leak)##propertyreference
#set($monkey,Plan=$spindoctor.weave($web))##method
reference
#set($monkey.Number=123)##numberliteral
#set($monkey.Say=["Not",$myz"fault"])##ArrayList
留意:最終一個例子中,在方括號[.?]中定義的項目可以被
ArrayList類定義的方法訪問。比如,你可以運用$monkey.Say.get(0)
訪問上述的第一個元素。
右邊也可以是一個簡潔的算術(shù)表達(dá)式:
#set($value=$foo+1)
#set($value=$bar-1)
#set($value=$foo*$bar)
#set($value=$foo/$bar)
假如右邊是一個屬性或方法引用,取值是NULL,他將不會賦值給左
邊。通過這種機制將一個存在的引用從上下文中刪除是不行能的。這
對Velocity的新手可能會混淆。例如:
#set($result=$query.criteria("name"))
Theresultofthefirstqueryis$result
#set($result=$query.criteria("address"))
Theresultofthesecondqueryis$result
假如,$query.criteria(”name")放回字符串“bill”,而
$query.criteria("address")返回null,上述VTL將說明為:
Theresultofthefirstqueryisbill
Theresultofthesecondqueryisbill
這往往會給那些想構(gòu)建#幻伯3所循環(huán)來試圖通過屬性和方法引用來
設(shè)置一個引用的新手帶來困惑,下面立刻通過#if指令測試一下。例
如:
#set($criteria=["name","address"])
#foreach($criterionin$criteria)
#set($result=$query.criteria($criterion))
#if($result)
Querywassuccessful
#end
#end
在上面的例子中,依靠$result的去值來確定查詢是否勝利唯恐不是
英明的做法。當(dāng)$團(tuán)531被#561設(shè)置后(添加到二下文中),他就不能
再被設(shè)值為null(從上下文中刪除)。
我們對此的解決方法是預(yù)設(shè)$result為falseo然后假
如$query.criteria()調(diào)用失敗,你就可以檢查之。
#set($criteria=["name","address"])
#foreach($criterionin$criteria)
#set($result=false)
#set($result=$query.criteria($criterion))
#if($result)
Querywassuccessful
#end
#end
不象其他Velocity指令,#set指令沒有#6團(tuán)語句。
10.2字面字符串
當(dāng)運用#set指令時,括在雙引號中的字面字符串將解析和重新說明,
如下所示:
#set($directoryRoot="www")
#set($templateName="index.vm")
#set($template="$directoryRoot/$templateName")
$template
輸出將會是:
然而,當(dāng)字面字符串括在單引號中時,他將不被解析:
#set($foo="bar")
$foo
#set($blargh=3foo')
$blargh
輸出是:
Bar
$foo
默認(rèn)狀況下,運用單引號來渲染未解析文本在Velocity是有效的。這
種特征可以通過編輯perties中
的erpolate-false來變更。
10.3條件
10.3.1If/elself/else
Velocity中的#if指令允許在頁面生成時,在IF條件為真的狀況下包
含文本。例如:
#if($foo)
<strong>Velocity!</strong>
#end
變量$foo先求值,以確定是否為真。在這兩種狀況下為真:⑴
$foo是一個邏輯變量并具有真的值,或者(ii)值非空。要記住
Velocity上下文僅包括對象,所以當(dāng)我們說''布爾〃'boolean'時,他會
被表示為''布爾類〃(Booleanclass)o這對即使是返回布爾類型的方法
也是真的一自省架構(gòu)將返回一個具有相同邏輯值的布爾類。
假如求值為真時,#if和#end語句之間的內(nèi)容將輸出。在這種狀況
下,假如$foo為真,輸出將是“Velocity!”。相反,假如$foo具有一
個null值,或者邏輯假,語句求值為假,則沒有輸出。
一個#elseif或者#else項可以用在#if語句中°請留意,Velocity模
板引擎將在第一個為真的表達(dá)式時停止。下面的例子中,假設(shè)$f。。具
有值15而$bar等于6。
#if($foo<10)
<strong>GoNorth</strong>
#elseif($foo==10)
<strong>GoEast</strong>
#elseif($bar==6)
<strong>GoSouth</strong>
#else
<strong>GoWest</strong>
#end
在這個例子中,$foo大于10,所以前面兩個比較失敗。接下來比較
$bar和6,結(jié)果為真,所以輸出為GoSouth。
請留意在現(xiàn)在,Velocity的數(shù)值比較約束為整型一其他類型都將求值
為false。僅有一個例外是等于=='這時Velocity要求等號兩邊的對
象具有相同的類型。
10.3.2關(guān)系和邏輯操作符
Velocity運用等式操作符來確定兩個變量間的關(guān)系。這里是一個簡潔
的例子演示如何運用等式操作符:
#set($foo="deoxyribonucleicacid")
#set($bar="ribonucleicacid")
#if($foo==$bar)
Inthiscaseit'scleartheyaren'tequivalent.So...
#else
Theyarenotequivalentandthiswillbetheoutput.
#end
Velocity也具有邏輯AND,or和NOT操作符。更進(jìn)一步的信息,請
看VTL參考手冊VTLReferenceGuide。下面是一些演示如何運用邏
輯操作符的例子:
##logicalAND
#if($foo&&$bar)
<strong>ThisANDthat</strong>
#end
例子中#if()指令僅在$砧。和$bar斗為真的時候才為真。假如
$foo為假,則表達(dá)式也為假;并且$bar將不被求值。假如$f。。為
真,Velocity模板引擎將接著檢查$bar;的值,假如$bar為真,則整
個表達(dá)式為真。并且輸出ThisANDthat。假如$bar為假,將沒有
輸出因為整個表達(dá)式為假。
邏輯OR的工作方式相同,唯一的例外是其中一個表達(dá)式要被求值,
以便確定整個表達(dá)式是否為真。請看下面的例子:
##logicalor
#if($foo||$bar)
<strong>ThisorThat</strong>
#end
假如$foo為真,Velocity模板引擎就不須要去察看$bar的值,不
管$bar是否為真,真?zhèn)€表達(dá)式都為真,因此輸出ThisorThat。假
如$foo為假,$bar就必需檢查其值了。在這種狀況下,假如$bar也
是為假,表達(dá)式將為假,沒有任何輸出。當(dāng)然,假如$bar為真,則
真?zhèn)€表達(dá)式為真,輸出ThisorThato
對于邏輯NOT操作符,只有一個操作數(shù):
##logicalNOT
#if(!$foo)
<strong>NOTthat</strong>
#end
這里,假如$foo為真,!$fo。求值為假,沒有輸出。假如$foo為
假,!$foo求值為真,輸出NOTthat。請當(dāng)心,不要和寧靜引用quiet
reference$!foo混淆它們是完全不同的。
11語法
11.1循環(huán)
#foreach元素允許進(jìn)行循環(huán),例如:
<ul>
#foreach($productin$allProducts)
<li>$product</li>
#end
</ul>
這個#foreach循環(huán)將導(dǎo)致$allP「oducts列表(雙象)為查詢?nèi)康漠a(chǎn)
品$products(目標(biāo))遍歷一遍。每次經(jīng)過循環(huán),從軸“Products取得的
值將置于$product變量之中。
$allProducts變量的內(nèi)容是一個矢量,一個哈希表或者數(shù)組。賦給
$product變量的值是一個Java對象并且可以從一個類似的變量引用。
例如,假如$product真是一個Java的產(chǎn)品類,其名稱可以通過引用
$product.Name方法來檢索(即:$Product.getName())。
我們假定$allProducts是一個哈希表。假如你想檢索關(guān)鍵字的值或者
在哈希表中的對象,你可以運用以下的代碼:
<ul>
#foreach($keyin$allProducts.keySet())
<li>Key:$key->Value:$allProducts.get($key)</li>
#end
</ul>
Velocity供應(yīng)一個更簡潔的方式或的循環(huán)計數(shù),以便你可以做下面類
似的工作:
<table>
#foreach($customerin$customerList)
<trxtd>$velocityCount</td><td>$customer.Name</td></tr
>
#end
</table>
循環(huán)計數(shù)變量的缺省名稱是$velocityCount,在perties配
置文件中標(biāo)明。默認(rèn)狀況下,該變量從1起先計數(shù),但是可以在
perties文件中設(shè)為從0或者1起先。下面是
perties文件中循環(huán)變量設(shè)置一節(jié):
#Defaultnameoftheloopcounter
#variablereference.
=velocityCount
#Defaultstartingvalueoftheloop
#countervariablereference.
directive.foreach.counter.initial.value=1
11.2包含
#include腳本元素允許模板設(shè)計人員包含(導(dǎo)入)本地文件,這個文
件將插入到#include指令被定義的地方。文件的內(nèi)容并不通過模板引
擎來渲染。處于平安的緣由,被包含的文件只可以放在
TEMPLATE_ROOT下。
#include("one.txt")
#include指令引用的文件在雙引號內(nèi)。假如超過一個文件,其間用
逗號隔開。
#include("one.gif"z"two.txt"z"three.htm")
被包含的文件并不是肯定要用文件名來引用,事實上,最好的方法是
運用變量而不是文件名。這在依據(jù)規(guī)則確定何時提交頁面時,確定目
標(biāo)輸出是很有用的。
H
#include("greetings.txtz$seasonalstock)
113解析
#parse腳本元素允許頁面設(shè)計員導(dǎo)入包含VTL的本地文
件。Velocity將解析和渲染指定的模板。
#parse("me.vm")
就象#include指令,#parse可以運用變量而不是一個實在的模板文
件。#parse引用的模板文件必需包含的TEMPLATE_ROOT指定的書
目之下。和#include指令不一樣,#parse只有一個參數(shù)。
VTL模板templatescanhave#parsestatementsreferringto
templatesthatinturnhave#parsestatements.Bydefaultsetto10,
theparse_directive.maxdepthlineofthepertiesallows
userstocustomizemaximumnumberof#parsereferralsthatcan
occurfromasingletemplate.(Note:Ifthe
parse_directive.maxdepthpropertyisabsentfromthe
pertiesfile,Velocitywillsetthisdefaultto10.)Recursion
ispermitted,forexample,ifthetemplatedofoo.vmcontainsthe
followinglines:
Countdown.
#set($count=8)
#parse("parsefoo.vm")
Alldonewithdofoo.vm!
Itwouldreferencethetemplateparsefoo.vm,whichmightcontain
thefollowingVTL:
$count
#set($count=$count-1)
#if($count>0)
#parse("parsefoo.vm")
#else
Alldonewithparsefoo.vm!
#end
After"Countdown."isdisplayed,Velocitypassesthrough
parsefoo.vm,countingdownfrom8.Whenthecountreaches0,it
willdisplaythe"Alldonewithparsefoo.vm!"message.Atthispoint,
Velocitywillreturntodofoo.vmandoutputthe"Alldonewith
dofoo.vm!"message.
11.4停止
#stop腳本允許模板設(shè)計員停止模板引擎的執(zhí)行,并返回。這通常
用作調(diào)試。
#stop
12宏
#macro腳本元素允許模板設(shè)計者在VTL模板中定義重復(fù)的
段。Velocimacros不管是在困難還是簡潔的場合都特別有用。下面
這個Velocimacr。,僅用來節(jié)約擊鍵和削減排版錯誤,介紹了一些
Velocity宏的概念。
#macro(d)
<trxtd></td></tr>
#end
在例子中,Velocimacro定義為d,它可以象調(diào)用其他VTL指令一樣
的形式來進(jìn)行調(diào)用:
#d()
當(dāng)這個模板被調(diào)用時,Velocity將#d()替換為一個單行的空表格。
Velocimacro可以帶一些參數(shù),也可以不帶參數(shù)(如上例所示)。但
在他被調(diào)用時,所帶的參數(shù)必需和其定義時的參數(shù)一樣。許多
Velocimacros定義為不止一個參數(shù)。下面這個宏帶有兩個參數(shù),一個
顏色,一個數(shù)組。
#macro(tablerows$color$somelist)
#foreach($somethingin$somelist)
<trxtdbgcolor=$color>$something</tdx/tr>
#end
#end
在這個例子中定義的Velocimacro,名為tablerows,要求兩個參數(shù)。
第一個參數(shù)代替$color,其次個代替$somelist。
可以寫進(jìn)VTL模板中的東西都可以寫進(jìn)Velocimacro的主體部分。
tablerows宏其實是一個foreach語句。在#13匕厄「0\/75宏的定義中有
兩個#end語句,第一個屬于#foreach,其次個結(jié)束宏定義。
#set($greatlakes=
rSuperior”,“Michigan”,“Huron“JErie”,“Ontario”])
#set($color="blue")
<table>
#tablerows($color$greatlakes)
</table>
請留意$greatiakes替換了$somelist。這樣,當(dāng)#13比「。775宏被調(diào)用
時,將產(chǎn)生以下輸出:
<table>
<trxtdbgcolor=nblue">Superior</tdx/tr>
<trxtdbgcolor="blue">Michigan</tdx/tr>
<trxtdbgcolor=nblue">Huron</tdx/tr>
<trxtdbgcolor="blue">Erie</tdx/tr>
<trxtdbgcolor=nblue">Ontario</tdx/tr>
</table>
Velocimacros在Velocity模板語句內(nèi)定義,這意味著它在同一站點內(nèi)
的其他Velocity模板中并不有效。定義一個宏,并使其及其他模板共
享很具有明顯的優(yōu)點:他削減了在大量的模板內(nèi)重復(fù)定義宏的工作,
并削減了出錯的機會,并確保對其他宏的變更對其他全部模板有效。
但假如#tablerows($color$list)宏是在一個Velocimacros模板庫內(nèi)
定義的,它就可以被其他常規(guī)模板所用。當(dāng)然,它可以用于各種目的,
也可重用多次。在表示全部真菌類(fungi)的mushroom.vm模板中,
#tablerows宏可以被用來列出典型的蘑菇。
,,,n,',,
#set($parts=[volva'zstipe''z'annulus''/gills";pileus"])
#set($cellbgcol="#CC00FF")
<table>
#tablerows($cellbgcol$parts)
</table>
我們對mushroom.vm執(zhí)行懇求,Velocity將在模板庫內(nèi)找到
#tablerows宏(在perties文件中定義)并產(chǎn)生以下輸出:
<table>
<trxtdbgcolor=n#CCOOFF">volva</tdx/tr>
<trxtdbgcolor="#CCOOFF">stipe</tdx/tr>
<trxtdbgcolor=n#CCOOFF">annulus</tdx/tr>
<trxtdbgcolor=n#CCOOFF">gills</td></tr>
<trxtdbgcolor="#CCOOFF">pileus</tdx/tr>
</table>
Velocimacro參數(shù)
Velocimacros的參數(shù)可以是以下的VTL元素:
引用(Reference):以$打頭的元素
字面字符串(Stringliteral):比如"$fo。"或'hello'
字面數(shù)字:1,2
整數(shù)范圍:或[$foo..$bar]
n
對象數(shù)組:[a'\"b"z"c"]
布爾真
布爾假
當(dāng)把引用作為參數(shù)傳遞給Velocimacros時,請留意引用是按''名字〃
傳遞的。這意味著他們的值在每次運用他們的Velocimacro中產(chǎn)生。
這個特性允許你在方法調(diào)用是傳遞引用,并在每次運用時進(jìn)行方法調(diào)
用。例如,F(xiàn)o,當(dāng)調(diào)用卜面的Velocimacro時,
#macro(callme$a)
$a$a$a
#end
#callme($foo.bar())
結(jié)果是,在方法bar()中,引用$fo。被調(diào)用了3次。
咋看時,這個特征讓人驚訝,當(dāng)當(dāng)你考慮一下Velocimacros的原本
動機-在VTL模板中避開許多''剪切復(fù)制〃操作一你就會明白。它允許
你將無狀態(tài)對象,比如在一個顏色表格行內(nèi)重復(fù)產(chǎn)生一些顏色次序的
對象,傳遞給Velocimacro。
假如你須要運用這個特征,你通常可以從方法內(nèi)取得一個值,作為一
個新的引用傳遞給宏:
#set($myval=$foo.bar())
#callme($myval)
Velocimacro屬性
在perties文件中有數(shù)行定義可以莊來敏捷實現(xiàn)
VelocimacroSo具體狀況請參見開發(fā)指南(DeveloperGuide)。
velocimacro.library-是一個逗號分隔的全部Velocimacro模板庫的
列表。默認(rèn)狀況下,Velocity搜尋一個單一的庫
VM_globalJibrary.vm.0預(yù)先配置的模板路徑用來查找
Velocimacro庫。
velocimacro.permissions.allow.inline-這個屬性確定
Velocimacros是否可以在常規(guī)模板內(nèi)定義,取值為邏輯True或者
False。默認(rèn)狀況下,設(shè)置為true,允許設(shè)計者在產(chǎn)規(guī)模板內(nèi)定義宏。
velocimacro.permissions.allow.inline.to.replace.global-邏輯
true或者false,允許標(biāo)明是否允許在常規(guī)模板內(nèi)定義的
Velocimacro代替在模板庫中定義并通過velocimacro.library屬性在
啟動時裝入的全局宏。默認(rèn)設(shè)置為false。
velocimacro.permissions.allow.inline.local.scope-邏輯true或者
false,默認(rèn)值為false。限制是否在模板內(nèi)定義的Velocimacros僅在
定義它的模板內(nèi)可見。換句話說,假如設(shè)置為true,一個模板可以定
義僅能被他所用的宏。你可以用它來做一些美麗的宏,假如一個全局
調(diào)用另一個全局宏,在局部(inline)范圍內(nèi),當(dāng)被一個模板調(diào)用時,
該模板可以定義一個被第一個全局宏調(diào)用的其次個全局宏的私有實
現(xiàn)。其他全部模板都不受影響。
velocimacro.context.localscope-邏輯值true或者false,缺省值為
faIseo但設(shè)置為true時,全部在Velocimacro內(nèi)通過#set()進(jìn)行的
修改都將被視為Velocimacro的本地行為,不會影響到其上下文。
velocimacro.library.autoreload-此屬性限制Velocimacro庫的自動
載入。缺省值為false。假如設(shè)置為true,被調(diào)用的Velocimacro得源
庫將被檢查是否變更,并在必要是重新載入。這將使你可以變更和測
試Velocimacro庫,而不必重新啟動應(yīng)用服務(wù)器或者servlet容器,
就象你工作在常規(guī)模板一樣。這個模時僅在資源載入器的緩存模時被
關(guān)閉的狀況下有效(如=false)o此特征為開發(fā)時設(shè)計,不要在生
產(chǎn)模式時運用。
VelocimacroTrivia
當(dāng)前,Velocimacros在其首次在模版中運用前必需首先定義它。這
意味著,#macro()宣稱應(yīng)當(dāng)在運用Velocimacros之前。
假如你想#parse()一個包含#171沈「。()指令的模板,記住這個特別重
要。因為#pdrse()在運行時發(fā)生,解析器在解析時要確定是否模版
中一個看起來像VM的元素真是VM,所以解析一系列VM宣稱可能
并不能如愿地工作的很好。為避開如此,可以簡潔地運用
velocimacro.library的方法,使Velocity在啟動時載入VM。
13轉(zhuǎn)義VTL指令
VTL可以通過反斜杠("\")來進(jìn)行轉(zhuǎn)義,directivescanbeescaped
withthebackslashcharacterinamannersimilartovalidVTL
references.
###include("a.txt")rendersas<contentsofa.txt>
#include("a.txt")
##\#include("a.txt")rendersas\#include("a.txt")
\#include("a.txt")
##\\#include("a.txt")rendersas\<contentsofa.txt>
\\#include("a.txt")
在轉(zhuǎn)義在一個單一指令內(nèi)包含多個腳本元素(比如f-else-end語句)
的指令時應(yīng)多加當(dāng)心。下面是一個典型的VILif語句;
#if($jazz)
VyacheslavGanelin
#end
假如$jazz為true,輸出是
VyacheslavGanelin
假如$jazz為false,將沒有輸出。轉(zhuǎn)義腳本元素將變更輸出。考慮下
面的狀況;
\#if($jazz)
VyacheslavGanelin
\#end
不管$jazz是真或假,輸出都是
#if($jazz)
VyacheslavGanelin
#end
事實上,因為全部腳本元素都被轉(zhuǎn)義了,$jazz恒久不會被求值。將
設(shè)反斜杠在被合法轉(zhuǎn)義的腳本元素之前
\\#if($jazz)
VyacheslavGanelin
\\#end
這時,假如$jazz為真,輸出是
\VyacheslavGanelin
為理解這個狀況,請留意在一個新行結(jié)束是將在輸出中忽視新的一行。
因此,經(jīng)過#if()前的7加工后,#if()塊緊跟第個‘\'。最終個'位
于新的一行,因為在'Ganelin'后又一個新行,所以,最終的那個位于
#end之前的\\是語句塊的一部分。
假如$jdzz為由Ise,這里將沒有輸出。留意,在起先破壞了if語句
的狀況將不能被正確轉(zhuǎn)義:
\\\#if($jazz)
VyacheslaveGanelin
\\#end
這里,#if被轉(zhuǎn)義,但有一j#end被保留了;所以有多個結(jié)束語句
將導(dǎo)致解析錯誤。
14VTL;格式化
雖然在本指南中的VTL常常顯示在新行中或者有空格,但是下面的
VTL
H
#set($imperial=["Munetaka"z"Koreyasuz"Hisakira","Morikune"])
#foreach($shogunin$imperial)
$shogun
#end
和下面的寫法同樣有效。
Sendme#set($foo=["$10and"/'acake"])#foreach($ain$foo)$a
#endplease.
Velocity的行為并不受空格的影響,前述的指令也可以寫成:
Sendme
#set($foo=["$10and","acake"])
#foreach($ain$foo)
$a
#end
please.
或者
Sendme
#set($foo=["$10and"/'acake"])
#foreach($ain$foo)$a
#endplease.
上面每種寫法結(jié)果都一樣。
15其它特征和雜項
15.1數(shù)學(xué)特征
Velocity有一些內(nèi)建的數(shù)學(xué)功能,可以運用set指令用在模版中。下
面的共識分別演示了加減乘除運算:
#set($foo=$bar+3)
#set($foo=$bar-4)
#set($foo=$bar*6)
#set($foo=$bar/2)
當(dāng)進(jìn)行除法運算時,結(jié)果將會是整數(shù)。Whenadivisionoperationis
performed,theresultwillbeaninteger,余數(shù)則可以通過模(%)運算
獲得。
#set($foo=$bar%5)
在Velocity中,只有整數(shù)可以進(jìn)行數(shù)學(xué)運算;假如執(zhí)行非整數(shù)的數(shù)學(xué)
運算,將被記錄下來,并返回nullo
15.2范圍操作符
范圍操作符可以和#set和#£0鵬33語句一起運用。有助于產(chǎn)生一個
整數(shù)的目標(biāo)數(shù)組,范圍操作符有以下的結(jié)構(gòu):
[n..m]
n和m都必需是整數(shù)或者可以產(chǎn)生整數(shù)。不管m大于或者小于n都
沒關(guān)系;在m小于n這種狀況下,范圍可以向下計數(shù)。下面是運用
范圍操作符的例子:
第一個例子
#foreach($fooin[1..5])
$foo
#end
其次個例子
#foreach($barin[2..-2])
$bar
#end
第三個例子
#set($arr=[0..1])
#foreach($iin$arr)
$i
#end
第四個例子
[1..3]
他們分別產(chǎn)生一下輸出
12345
210-1-2
01
[1.3]
范圍操作符和#561和#m生3所指令一起運用時,只是產(chǎn)生數(shù)組。
頁面設(shè)計人員在設(shè)計具有相同尺寸的表格
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 虛擬現(xiàn)實藝術(shù)治療在創(chuàng)傷后應(yīng)激中的應(yīng)用-洞察闡釋
- 輪軌界面振動傳遞路徑分析-洞察闡釋
- 社交媒體與編輯互動-洞察闡釋
- 高價值貨物運輸全險合同保險單
- 倉儲物流保險合同范本
- 菜鳥驛站快遞業(yè)務(wù)分部轉(zhuǎn)讓合同模板
- 數(shù)字領(lǐng)導(dǎo)力與組織適應(yīng)性-洞察闡釋
- 車輛運輸合同附帶貨物損失鑒定與賠償規(guī)范協(xié)議
- 信托產(chǎn)品財產(chǎn)保全及擔(dān)保服務(wù)協(xié)議
- 上市公司財務(wù)數(shù)據(jù)保密及員工保密協(xié)議
- 人保農(nóng)險理賠試題
- Machine-Cmk-設(shè)備能力指數(shù)Cmk分析表
- 心理健康教育特色學(xué)校建設(shè)路徑
- 2025年全國保密教育線上培訓(xùn)考試試題庫【完整版】附帶答案詳解
- (二模)2025年5月濟南市高三高考針對性訓(xùn)練英語試卷(含答案解析)
- 修腳師勞動合同(新標(biāo)準(zhǔn)版)6篇
- TCHSA-012-2023-兒童口腔疾病治療中靜脈鎮(zhèn)靜技術(shù)規(guī)范
- 福建農(nóng)信招聘筆試真題2024
- 三方合伙開店協(xié)議合同
- 2025年新疆中考第一次模擬化學(xué)試題(含答案)
- ISO27001:2022信息安全管理體系全套文件+表單
評論
0/150
提交評論