CHAPTER 3 Velocity介紹
Velocity是什么?
Velocity是一種讓WEB設(shè)計(jì)者易于掌握和使用的模板語(yǔ)言,主要目的是簡(jiǎn)化WEB動(dòng)態(tài)頁(yè)面的開(kāi)發(fā)。為了獲取這種語(yǔ)言的支持,你需要JAVA基礎(chǔ)類(lèi)集合,才能在MVC的MODEL模型和VIEW組件之間搭建一座橋梁。Velocity最重要的一個(gè)特性就是它僅僅通過(guò)一組簡(jiǎn)單的語(yǔ)法(WEB設(shè)計(jì)者用于顯示內(nèi)容的語(yǔ)法)就能清晰地把VIEW和其他MVC組件之間區(qū)別開(kāi)了。同時(shí),JAVA編程人員只需集中精力關(guān)注應(yīng)用的后臺(tái)邏輯就行。
Velocity不但可以用于開(kāi)發(fā)WEB頁(yè)面,也可以用于開(kāi)發(fā)獨(dú)立運(yùn)行的應(yīng)用程序。它不僅能夠輸出HTML,也能輸出其他類(lèi)型的內(nèi)容,比如:源代碼、SQL或XML。Velocity的一些主要功能如下:
■包括用于操作頁(yè)面內(nèi)容的LOOP、條件語(yǔ)句的模板語(yǔ)言
■ 訪(fǎng)問(wèn)JAVA對(duì)象方法
■ 直接支持Turbine Web 應(yīng)用框架
■ 利用Anakia轉(zhuǎn)換XML到其他格式的內(nèi)容
■ Texan
■ 直接支持servlets
它是如何工作的?
為了對(duì)Velocity有所了解,讓我們考慮一下這個(gè)應(yīng)用,該應(yīng)用允許用戶(hù)顯示他們的個(gè)人詳細(xì)信息。讓我們假定在這個(gè)示例中,用戶(hù)已經(jīng)登錄到這個(gè)應(yīng)用系統(tǒng),這里,我們需要?jiǎng)?chuàng)建一個(gè)顯示頁(yè)面來(lái)顯示用戶(hù)的登錄信息。
頁(yè)面設(shè)計(jì)
在MVC架構(gòu)里,WEB設(shè)計(jì)者負(fù)責(zé)設(shè)計(jì)界面,WEB開(kāi)發(fā)者負(fù)責(zé)后臺(tái)邏輯,并確保設(shè)計(jì)者所設(shè)計(jì)的頁(yè)面能夠正確顯示所需要的數(shù)據(jù)。第一步就是由WEB設(shè)計(jì)者完成可視化布局設(shè)計(jì),設(shè)計(jì)者使用HTML標(biāo)記創(chuàng)建一個(gè)包含了全部所需圖片和文本的頁(yè)面,對(duì)于動(dòng)態(tài)信息,比如用戶(hù)的account號(hào)和地址等,設(shè)計(jì)者使用占位符進(jìn)行替代(比如:<**user account name**>)。
<HTML>
<HEAD>
<img src="header.jpg">
</HEAD>
<BODY>
Hello, <**user account name**>
</BODY>
</HTML>
Listing 3.1 The designer page example.
第二步,一旦完成頁(yè)面可視化設(shè)計(jì),設(shè)計(jì)者就應(yīng)該和開(kāi)發(fā)者召開(kāi)一次會(huì)議,對(duì)動(dòng)態(tài)內(nèi)容(所使用的變量名稱(chēng))進(jìn)行討論和確定,以保證頁(yè)面能夠正確顯示。
獲到正確的信息
在設(shè)計(jì)者和開(kāi)發(fā)者之間召開(kāi)的會(huì)議必須明確頁(yè)面中需要插入動(dòng)態(tài)內(nèi)容的變量名稱(chēng)。這些變量名稱(chēng)將決定最終頁(yè)面能否正確顯示。
由于我們是使用MVC方式進(jìn)行設(shè)計(jì)的,并且我們已經(jīng)知道把JAVA代碼放入WEB頁(yè)面來(lái)獲得內(nèi)容不是正確的選擇。Velocity為WEB設(shè)計(jì)者提供了一個(gè)腳本級(jí)的工作環(huán)境,它通過(guò)在HTML代碼里放置腳本元素來(lái)產(chǎn)生一個(gè)模板。這些腳本元素由邏輯語(yǔ)句和訪(fǎng)問(wèn)JAVA對(duì)象的語(yǔ)法組成(比如loops和條件語(yǔ)句)。我們不要指望從VIEW組件里直接訪(fǎng)問(wèn)MODEL模型組件,因此Velocity需要一個(gè)可以在MVC各層之間傳遞數(shù)據(jù),并且名叫上下文(Context)的集合。這個(gè)上下文對(duì)象內(nèi)保存著控制器和模型組件,并提供給WEB頁(yè)模板。
Velocity實(shí)現(xiàn)代碼負(fù)責(zé)解析模板,并且用從上下文對(duì)象中獲取的文本內(nèi)容替換所有的Velocity腳本元素。一旦WEB設(shè)計(jì)者使用來(lái)自上下文的對(duì)象,這兒肯定需要一個(gè)設(shè)計(jì)者和開(kāi)發(fā)者都理解的上下文對(duì)象名字約定。任何名字的不一致都將導(dǎo)致錯(cuò)誤,這是因?yàn)?/span>Velocity是通過(guò)引用網(wǎng)頁(yè)模板中的對(duì)象名字來(lái)進(jìn)行數(shù)據(jù)傳遞的。
對(duì)信息進(jìn)行編碼Coding the Information
在設(shè)計(jì)者和開(kāi)發(fā)者進(jìn)行會(huì)議結(jié)束后,雙方都將回去完成WEB開(kāi)發(fā)最后的部分。在這一步中,MVC框架的優(yōu)勢(shì)是很明顯的,因?yàn)樵O(shè)計(jì)者只需在WEB模板中增加腳本元素并加入雙方約定的名稱(chēng),而開(kāi)發(fā)者則將開(kāi)發(fā)焦點(diǎn)集中于如何返回約定名稱(chēng)的內(nèi)容上。
對(duì)于開(kāi)發(fā)者來(lái)講,只有很少的工作需要去做,比如將新的頁(yè)面集成到當(dāng)前框架、確認(rèn)當(dāng)前用戶(hù)的需要的信息(如:account number)是正確可用的,同時(shí)把設(shè)計(jì)者需要的數(shù)據(jù)放入上下文中。要注意的是,我們不能放棄前兩步工作而直接跳到第三步上。
在許多以JAVA為基礎(chǔ)的MVC應(yīng)用中,用戶(hù)實(shí)際瀏覽的頁(yè)面是基于Servlet的。Servlet擔(dān)當(dāng)了MVC中的控制器角色。數(shù)據(jù)實(shí)體一般表現(xiàn)為模型,Session Bean可能考慮為控制器。控制器或Servlet負(fù)責(zé)把數(shù)據(jù)加入到上下文中。
一旦進(jìn)行上下文和當(dāng)前用戶(hù)必須的動(dòng)態(tài)數(shù)據(jù)的組裝時(shí)(populate),開(kāi)發(fā)者需要確定當(dāng)前用戶(hù)所請(qǐng)求使用的模板,然后將上下文中的數(shù)據(jù)并入模板中,最后生成HTML輸出。Listing 3.2 顯示了開(kāi)發(fā)者在編碼中必須要?jiǎng)?chuàng)建的基本語(yǔ)句。
Velocity.init();
VelocityContext context = new VelocityContext();
context.put( "name", new String("Jane Doe") );
Template template = Velocity.getTemplate("account.vm");
StringWriter sw = new StringWriter();
template.merge( context, sw );
Listing 3.2 Developer code for Velocity.
在Listing 3.2里,開(kāi)發(fā)者首先要進(jìn)行Velocity初始化工作,隨后需要?jiǎng)?chuàng)建一個(gè)新的上下文。通過(guò)上下文的put()方法將一個(gè)字符串對(duì)象指派給關(guān)鍵字“name”,并且將字符串值"Jane Doe"粘貼到上下文中(此處的關(guān)鍵字“name”是先前設(shè)計(jì)者和開(kāi)發(fā)者開(kāi)會(huì)是約定的名稱(chēng))。接著,使用getTemplate()方法獲得(設(shè)計(jì)者創(chuàng)建的)模板。然后,用StringWriter來(lái)處理HTML輸出。最后,模板和上下文被merge()方法合并到一起,并將最后的合并結(jié)果傳送到StringWriter對(duì)象中保存,用于最后輸入。
在這個(gè)示例中,許多細(xì)節(jié)被忽略。在下一節(jié)里,我們將用圖例的方式來(lái)說(shuō)明開(kāi)發(fā)者為提供模板所需要的動(dòng)態(tài)信息必須要做的工作。這在個(gè)示例里,我們指派了一個(gè)簡(jiǎn)單的字符串對(duì)象給上下文,同時(shí)也介紹了復(fù)合對(duì)象和如何使用Velocity來(lái)訪(fǎng)問(wèn)對(duì)象的屬性和方法。
顯示信息Displaying the Information
設(shè)計(jì)者或許可以很輕松的對(duì)已經(jīng)設(shè)置好上下文和API的頁(yè)面進(jìn)行處理。使用Velocity模板語(yǔ)言(更廣泛的討論在Chapter 6里),所有的動(dòng)態(tài)信息占位符被Listing 3.3所示的代碼($name)替換。
<HTML>
<HEAD>
<img src="header.jpg">
</HEAD>
<BODY>
Hello, $name
</BODY>
</HTML>
Listing 3.3 Velocity Web頁(yè)示例
在這里,用戶(hù)名占位符被Velocity語(yǔ)句$name替換。當(dāng)這個(gè)模板被上下文合并時(shí),$name將被上下文中的名叫$name的對(duì)象的值替換。
Velocity 特性
在這個(gè)示例里,我們看到了如何使用一個(gè)在Velocity里定義的簡(jiǎn)單腳本元素和上下文來(lái)產(chǎn)生一個(gè)動(dòng)態(tài)WEB頁(yè)面的過(guò)程,這些定義都在MVC框架范圍內(nèi)。Velocity包含了許多別的特性,在這里,我們將通過(guò)以下介紹來(lái)了解其大概情況:
References—Velocity包含了三種類(lèi)型的引用:變量、屬性和方法。
變量以$符號(hào)開(kāi)始,后緊跟英文符號(hào)或數(shù)字來(lái)進(jìn)行定義。變量的值來(lái)自上下文同名的對(duì)象或直接量(Set idrective)。
屬性以$符號(hào)開(kāi)始,后緊跟英文符號(hào)或數(shù)字,而后是一點(diǎn)”.”,最后跟上別的定義。屬性引用自上下文中JAVA對(duì)象的屬性或調(diào)用對(duì)象方法返回的值。方法的定義必須是get<定義>這種格式。
方法以$符號(hào)開(kāi)始,后緊跟英文符號(hào)或數(shù)字,而后是一點(diǎn)”.”,最后跟上別的定義和方法體(比如 (<parameter>))。A call is made to the exact method identifier specified(此句未譯)。
Directives指令—Velocity指令允許WEB設(shè)計(jì)者控制所有引用。腳本元素包括set(為變量名指定值或叫直接量)、loop控制、條件和include指令。
Velocimacros Velocity宏—Velocimacro允許設(shè)計(jì)者構(gòu)建多次重復(fù)使用的HTML和Velocity腳本元素宏。
Logging日志—Velocity利用log4J系統(tǒng)來(lái)產(chǎn)生日志。
Resource loaders資源加載—The resource loaders give you control over the templates used in the production of Web pages(此句未譯).
Anakia—這是一個(gè)示例應(yīng)用,它允許使用Velocity代替XSL (Extensible Stylesheet Language)來(lái)處理XML。
Application servers應(yīng)用服務(wù)器—Velocity支持所有主流的應(yīng)用服務(wù)器和Servlet,比如Resin, Tomcat, 和 BEA WebLogic等。
本章小節(jié)和下章介紹
在這一章里,我們提供了一個(gè)Velocity系統(tǒng)的快速瀏覽,解釋了設(shè)計(jì)者和開(kāi)發(fā)者是如何使用Velocity的。在下一章里,我們將開(kāi)始學(xué)習(xí)Velocity和相關(guān)軟件的安裝。
posted on 2008-10-12 00:23 KINGWEE 閱讀(639) 評(píng)論(1) 編輯 收藏 所屬分類(lèi): Velocity