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

下載本文檔

版權(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

$email

\foo

\$email

假如Velocity在VTL模板中遇到一j$email引用,他將在上下

文中查找相應(yīng)的值。這里,輸出將是foo,因為$email是定義了的。

假如$email未定義,輸出將是$60^1。

假設(shè)$email是定義了的(比如,具有值f。。),但是你想輸

出$emaiL可以有幾種方法來做這個事情,不是最簡潔的是運用轉(zhuǎn)

義符。

##Thefollowinglinedefines$emailinthistemplate:

#set($email="foo")

$email

\$email

\\$email

\\\$email

將輸出是

foo

$email

\foo

\$email

留意:\綁定在$的左邊。從做綁定原則使\\\$email被說明為

\\$emailo和上面例子比較下面的例子,這里$email未定義。

$email

\$email

\\$email

\\\$email

輸出

$email

\$email

\\$email

\\\$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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論