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