




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 Velocity基本語法及實(shí)現(xiàn)客戶端和服務(wù)器端模板Velocity 是一種通用的、開放源代碼的模板解決方案,可以在報(bào)告生成 / 數(shù)據(jù)轉(zhuǎn)換應(yīng)用程序中獨(dú)立使用,也可以在 MVC 模型框架中作為視圖組件。本文中,Sing Li 介紹了 Velocity,并說明如何將其模板處理功能集成到客戶端獨(dú)立應(yīng)用程序、服務(wù)器端 Web 應(yīng)用程序或者 Web 服務(wù)中。Sing Li (westmakaha), 作家, Wrox Press2004 年 3 月 13 日· 內(nèi)容在 HTML 或者 XML 這樣的標(biāo)準(zhǔn)表示或交換格式中,文本性數(shù)據(jù)的操作和轉(zhuǎn)換是一種頻繁而且通常非常單調(diào)的活動(dòng),每個(gè)開發(fā)
2、人員都會遇到。模板引擎可以改善這個(gè)過程,它在模板中保留輸出中的靜態(tài)部分,而動(dòng)態(tài)生成和安排變化的部分。Velocity 是一種高度實(shí)用的、開放源代碼的模板引擎,可以方便地集成到其他客戶端或服務(wù)器端應(yīng)用程序中。對于服務(wù)器端應(yīng)用程序,如果與兼容 Servlet 2.3+ 的 Web 層容器集成,Velocity 為 JSP 技術(shù)提供了一種可行的替代方案,可以強(qiáng)制實(shí)施表示邏輯與應(yīng)用程序業(yè)務(wù)邏輯的清晰劃分。事實(shí)上,Velocity 支持的模板語言非常簡單,形成的模板也十分清晰,Web 站點(diǎn)設(shè)計(jì)人員和樣式開發(fā)人員可以學(xué)習(xí)和維護(hù)這些模板。本文中將考察 Velocity 的簡單模板語言、創(chuàng)建一些模板并將其用于
3、獨(dú)立的客戶應(yīng)用程序。然后我們將把這個(gè)模板引擎集成到 Struts MVC 框架中作為視圖組件。基本模板引擎操作基本模板引擎操作非常簡單。首先看一看清單 1 中的模板:清單 1. 基本的 Velocity 模板 <html> <head> <title>A Template Based Page</title> </head> <body> <p>This is a page generated by $generatedBy.</p> <p>The customer's name
4、 is $customerName.</p> </body> </html>這個(gè)模板是一個(gè)完整的 HTML 文件。您可以使用文本編輯器或者喜歡的圖形化可視網(wǎng)頁編輯器創(chuàng)建該文件。創(chuàng)建的簡易性是基于模板的系統(tǒng)的主要好處和要求。當(dāng)模板引擎運(yùn)行時(shí),清單 1 中彩色顯示的部分將被實(shí)際的數(shù)據(jù)替換。獲取數(shù)據(jù)并與模板結(jié)合的過程稱為 合并。看一看清單 2 中的腳本所表示的數(shù)據(jù):清單 2. 為模板合并設(shè)置數(shù)據(jù)值 #set ($generatedBy = "Velocity") #set ($customerName = "John Doe
5、")現(xiàn)在,如果清單 1 中的模板與清單 2 中的數(shù)據(jù)合并,將得到清單 3 所示的結(jié)果:清單 3. 合并到模板中的數(shù)據(jù) <html> <head> <title>A Template Based Page</title> </head> <body> <p>This is a page generated by Velocity.</p> <p>The customer's name is John Doe.</p> </body> </ht
6、ml>您可能發(fā)現(xiàn),這種特性和字處理程序中的郵件合并功能類似。在字處理程序中,信函結(jié)構(gòu)與來自郵件列表的名稱和地址合并。和郵件合并一樣,這種應(yīng)用程序最適用于要合并的數(shù)據(jù)源非常大而且有變化的情況。從這個(gè)單純的意義上講,Velocity 是一個(gè)模板引擎。Velocity 的輸出格式僅受文本模板中所能放置的內(nèi)容的限制。包括現(xiàn)在最流行的格式(HTML、XML、SQL,等等)。使用 Velocity 模板語言創(chuàng)建模板Velocity 模板是文本文件(HTML、XML 等等),其中包括:· 照原樣合并的靜態(tài)部分· 將被要合并的數(shù)據(jù)替代的占位符· 腳本語言中的指示符和指令Ve
7、locity 模板使用的腳本語言稱為 Velocity 模板語言(VTL)。和其他腳本語言相比,VTL 語法相對而言不是很豐富。任何具有編程背景的人都可以非??斓貙W(xué)會 VTL。占位符與引用VTL 中的引用是一個(gè)命名元素,如 $customerName。引用可以在 Velocity 模板中作為占位符。在模板合并過程中,這些占位符將被替換成相應(yīng)的文本值,從而形成最終的輸出。比如,在 清單 1中,我們可以看到使用了兩個(gè) VTL 引用( $generatedBy和 $customerName)已生成最終輸出結(jié)果。變量在 VTL 中是一種引用類型。您可以使用
8、60;#set()指示符為變量賦值。清單 4 給出了一些例子:清單 4. 變量類型的 VTL 引用 #set( $this = "Velocity") #set( $numericBase = 999 ) #set( $booleanCondition = true ) This page is generated using $this. There are ($numericBase + 1) pages in total.變量名必須從一個(gè)字母開始,因此 Velocity 很容易把變量名與模板中的貨幣符號分開(比如, $100不可能是一個(gè)變量名)。合并操作中所
9、有的變量都被轉(zhuǎn)化成字符串,可能造成一些有趣的現(xiàn)象??匆豢辞鍐?4 中用紅色顯示的文本。合并后的輸出如清單 5 所示:清單 5. 合并后的模板中帶有數(shù)字值的變量 This page is generated using Velocity. There are (999 + 1) pages in total.因?yàn)?#160;$numericBase在合并操作中被轉(zhuǎn)化成了字符串,因此不會執(zhí)行算術(shù)操作。因?yàn)?VTL 專門用于模板操作而非通用的計(jì)算語言,所以只需要支持整數(shù)算術(shù)運(yùn)算(盡管可以使用插件工具進(jìn)行擴(kuò)展)。下面的腳本說明了如何利用這種數(shù)學(xué)運(yùn)算能力: #set( $newSum = $numeri
10、cBase + 1) There are $newSum pages in total.該模板合并后相應(yīng)的輸出為: There are 1000 pages in total.到目前我們處理的還只有標(biāo)量。要?jiǎng)?chuàng)建包含多個(gè)元素的 ArrayList變量,可以使用如下的語法: #set( $treeList = "pine", "oak", "maple", "redwood")您可以使用 $treeList.get(1)列表中的第二個(gè)元素。賦值以后, $treeList就是一個(gè)基于
11、0;ArrayList的變量(就像是標(biāo)準(zhǔn) JDK 集合類中那樣)。您可以直接使用符號 $treeList.get(n)訪問它的每個(gè)元素,其中的 n是以 0 為基的 ArrayList索引。比如,像 清單 6種紅色顯示的一行所表明的那樣, $treeList.get(1)用于選擇ArrayList中第二項(xiàng),即 oak。這種調(diào)用 ArrayList類方法的語法也可用于調(diào)用其他變量對象的方法(更多信息請參閱側(cè)欄中的 屬性和方法參考)。屬性和方法參考除了在模板中設(shè)置變量之外,VTL 引用也可以是對象屬性或方法。這些對象是模板可以使用
12、的 Java 類(一般通過上下文,參閱 Velocity 上下文)。 對象屬性通過和 Javabean 類似的符號訪問。比如,可以通過 VTL 引用 $customer.LastName訪問$customer對象的 LastName屬性。在幕后,Velocity 使用對象的訪問器方法獲得屬性值(即調(diào)用對象的getLastName()方法)。 您可以用和屬性訪問類似的符號調(diào)用對象的方法,可以帶參數(shù)列表也可以不帶。比如,可以通過 VTL 引用$customer.getPhone("mobile"),調(diào)用$customer對象的&
13、#160;getPhone()方法獲得移動(dòng)電話號碼。關(guān)于占位符替換的一點(diǎn)說明:Velocity 把任何不能識別的引用作為普通文本打印,如清單 6 中下面突出顯示的兩行(藍(lán)色和紅色)所示:清單 6. 占位符置換 The second item in the list is $treeList.get(1). $notDeclared is an undeclared variable. But $!notDeclared is invisible when not declared.VTL 支持一種靜態(tài)引用符號,以避免呈現(xiàn)不存在的或者 空的引用。如果使用安靜引用符號,比如 $
14、!notDeclared,那么 Velocity 將什么也不輸出,而不是輸出完整的引用名。注意變量名前面的“!”表示這是靜態(tài)引用符號。當(dāng)合并清單 6 中的模板時(shí),兩個(gè)引用都沒有分配任何值,但是藍(lán)色顯示的引用將原樣顯示,而綠色的一個(gè)則看不到: The second item in the list is oak. $notDeclared is an undeclared variable. But is invisible when not declared.選擇性呈現(xiàn)和循環(huán)可以使用指示符 #if. #then. #else.有條件地呈現(xiàn)模板中特定的部分。清單 7 給出了一個(gè)例子:清
15、單 7. 使用 #if、#then 和 #else 有選擇地呈現(xiàn) #if $customer.GoldMember Thank you Mr. $customer.LastName, for flying with us. Your loyal patronage is greatly appreciated. This flight earns you an additional 5000 miles. #else Thank you for flying with us. Please consider joining our frequent flyer program. #endif在
16、清單 7 的模板中,使用 $customer對象的 boolean 屬性 GoldMember確定在最終輸出中出現(xiàn)哪些信息。對于金牌顧客,最終輸出中將呈現(xiàn)藍(lán)色顯示的消息;對于其他顧客,則在最終輸出中呈現(xiàn)綠色顯示的消息。模板中經(jīng)常要使用循環(huán)格式化表格或者列表形式的信息。顯示的數(shù)據(jù)通常保存在一個(gè) ArrayList引用中。在 Velocity 中唯一用于處理重復(fù)循環(huán)的指示符是 #foreach指示符。清單 8 中的模板通過 $treeList ArrayList變量演示了 #foreach指示符的用法。當(dāng)然,也可以使用任何其他可用的集合類
17、型的對象引用,或者返回一個(gè)集合的對象屬性 / 方法引用。清單 8. 使用 #foreach 循環(huán) <table> <tr><td>Tree Name</td></tr> #foreach $name in $treeList <tr><td> $name is a big tree! </td></tr> #end </table>$treeList中包含樹名的列表,清單 8 中的模板合并后的輸出如清單 9 所示:清單 9. #foreach 循環(huán)中合并后的輸出 <ta
18、ble> <tr><td>Tree Name</td></tr> <tr><td> pine is a big tree! </td></tr> <tr><td> oak is a big tree! </td></tr> <tr><td> maple is a big tree! </td></tr> <tr><td> redwood is a big tree! <
19、/td></tr> </table>如果從 HTML 瀏覽器中查看,清單 9 當(dāng)然就是一個(gè)包含樹名的表。注意在 #foreach循環(huán)體內(nèi)有一個(gè)內(nèi)置的計(jì)數(shù)器,可以在 #foreach指示符循環(huán)體內(nèi)通過 $velocityCounter引用訪問它。默認(rèn)情況下,這個(gè)計(jì)數(shù)器從 1 開始,每執(zhí)行一次循環(huán)遞增一次。Velocity 中的宏Velocity 的一個(gè)主要特性是能夠很容易地定義宏,稱為 Velocimacros。宏使您能夠很容易地封裝和重用模板腳本。默認(rèn)情況下,宏保存在VM_global_library.vm文件中。比如,考慮
20、清單 10 中名為 #showTree()的 Velocimacro:清單 10. 定義 Velocimacro #macro (showTree) #if ($treeList ) #foreach ($e in $treeList ) $e #end #end #end您可以調(diào)用 #showTree()Velocimacro 并使用它打印 $treeListArrayList 如果這個(gè)列表已經(jīng)定義的話。調(diào)用的語法很簡單,即#showTree()。參數(shù)化宏也是可能的。比如,我們可以修改 #showTree()宏使其用于任何列表,如清單 11 所示:清單
21、 11. 帶參數(shù)的 Velocimacro #macro (showList $val) #if ($val ) #foreach ($e in $val ) $e #end #end #end要使用清單 11 中的宏調(diào)用 $treeList,我們可以使用 #showList($treeList)。這兩種情況的輸出都一樣,如清單 12 所示:清單 12. Velocimacro 的合并輸出 pine oak maple redwood其他有趣的 VTL 細(xì)節(jié)單行注釋或者行尾注釋從 #開始,多行注釋則放在 #*和 *#之間。在處理字符串?dāng)?shù)據(jù)時(shí),可
22、以使用雙引號或單引號分隔。但是使用雙引號允許在分隔的字符串 內(nèi)部對 Velocity 引用、指示符甚至 Velocimacros 求值?;仨撌譜elocity 上下文您可以把 Velocity 中的上下文看作是導(dǎo)入 Java 對象,以便在 Velocity 模板內(nèi)部訪問的一種方法。這種導(dǎo)入必須在 Java 編碼中明確地完成。和 JSP 代碼或者 JavaScript 不同,不存在“自然的”或“原生方式”使 Velocity 訪問任何 Java 對象。只有明確導(dǎo)入的 Java 對象才能在 Velocity 模板中使用。通過創(chuàng)建 org.apache.velocity.cont
23、ext.Context類的實(shí)例可以獲得 Velocity 上下文。然后可以使用上下文的 put( key, value) 方法,把將要導(dǎo)入供模板使用的對象附加到上下文中。key 是一個(gè)字符串名,將在模板中作為可用的引用出現(xiàn)。在產(chǎn)品環(huán)境中,圖形或者 Web 設(shè)計(jì)人員可能負(fù)責(zé)創(chuàng)建和維護(hù)模板,而 Java 開發(fā)人員提供可以在模板中訪問的對象集。在這種情況下,設(shè)計(jì)人員和開發(fā)人員應(yīng)就對象集合及其可用的屬性達(dá)成一致并互相協(xié)作。在 Velocity 上下文中附加的屬性將作為主要的接口機(jī)制。在模板中訪問上下文屬性看一看一個(gè)獨(dú)立解析器中包含的示例代碼(請參閱 參
24、考資料)??梢栽?#160;codesrc目錄下找到。比如,在com.ibm.dvworks.velocity.VelocityParser類中,我們已經(jīng)創(chuàng)建并向 Velocity 上下文中添加了兩個(gè)屬性,如清單 13 所示:清單 13. 在 VelocityParser 類中創(chuàng)建一個(gè) Velocity 實(shí)例 public static void main(String args) VelocityParser velInstance = new VelocityParser(args0); velInstance.addToContext( "treeFarm", new
25、 String "redwood", "maple", "oak", "pine" ); velInstance.addToContext( "title", "A Tree Farm"); velInstance.addToContext( "date", new java.util.Date(); velInstance.addToContext("fmtr", new org.apache.velocity.app.tools.V
26、elocityFormatter( velInstance.getCurrentContext(); velIcessTemplate(); 屬性 treeFarm是一個(gè)關(guān)于樹名的 ArrayList。 title屬性是一個(gè)標(biāo)量字符串。一旦附加到上下文中并在合并過程中傳遞,這些屬性在 Velocity 模板中立刻就變得沒有用了。清單 14 中的模板使用了這兩個(gè)屬性。您可以在 codeapptreectx.vm中找到這個(gè)例子。清單 14. 使用 $treeFarm 上下文屬性引用 <table> <tr><
27、;td>$title</td></tr> #foreach $name in $treeFarm <tr><td> $name is a big tree! </td></tr> #end </table>合并后的輸出如清單 15 所示:清單 15. 模板的合并輸出 <table> <tr><td>A Tree Farm</td></tr> <tr><td> redwood is a big tree! </td&g
28、t;</tr> <tr><td> maple is a big tree! </td></tr> <tr><td> oak is a big tree! </td></tr> <tr><td> pine is a big tree! </td></tr> </table>要注意,使用 $treeFarm上下文屬性引用的方法和前面分析的 $treeList變量引用一致。初始化模板引擎分析 Veloci
29、tyParser類中列出的 main()方法(參見清單 13)。 VelocityParser構(gòu)造函數(shù)創(chuàng)建解析器并加載模板,然后增加模板引擎要使用的屬性,最后調(diào)用 processTemplate()合并數(shù)據(jù)和模板。我們將按照順序依次分析這些方法。您可以在 org.apache.velocity.app.Velocity類中使用靜態(tài)方法初始化 Velocity 并加載一個(gè)模板文件。要使用的方法分別為 init()和getTemplate()。對 init()方法的調(diào)用出現(xiàn)在 VelocityParser類的構(gòu)造函數(shù)中,如清單
30、16 所示:清單 16. 在 VelocityParser 類的構(gòu)造函數(shù)中初始化模板引擎 public VelocityParser(String templateFile) try Velocity.init("perties"); mainTemplate = Velocity.getTemplate(templateFile); catch( Exception ex ) System.out.println("Error processing template file: " + templateFile ); 在清單 1
31、6 中,對 init()的調(diào)用創(chuàng)建了一個(gè) Velocity 引擎實(shí)例。如果應(yīng)用程序需要?jiǎng)?chuàng)建和管理多個(gè) Velocity 模板引擎實(shí)例,則應(yīng)使用org.apache.velocity.app.VelocityEngine類。上下文鏈只要調(diào)用 org.apache.velocity.VelocityContext類的普通構(gòu)造函數(shù)就可以創(chuàng)建直接可用的 Velocity 上下文。Velocity 上下文可以 進(jìn)行鏈接(包裝在另一個(gè)上下文內(nèi)部)。如果需要在模板中控制特定對象引用的可見性和可用性,這樣做非常有用。Velocity 將在對象引用的所有鏈接上下文中搜索屬性。如果遇
32、到重復(fù)的名稱,則使用最外層的屬性,而內(nèi)部的同名屬性永遠(yuǎn)不會被訪問。為了鏈接 Velocity 上下文,要鏈接的上下文應(yīng)該作為參數(shù)傳遞給一個(gè)新上下文的構(gòu)造函數(shù)。清單 17 中 VelocityParser類的重載方法addToContext()說明了這一點(diǎn):清單 17. 使用 addToContext() 方法增加上下文屬性或者上下文鏈接 public void addToContext(String key, Object value) if (mainContext = null) mainContext = new VelocityContext(); mainContext.p
33、ut(key, value); public void addToContext(VelocityContext chainCtx) mainContext = new VelocityContext(chainCtx); 在 processTemplate()方法中,調(diào)用模板的 merge()方法結(jié)合上下文信息和模板生成輸出流,如清單 18 所示:清單 18. 在 processTemplate() 方法中合并模板 public void processTemplate() try BufferedWriter writer = writer = new Buffered
34、Writer( new OutputStreamWriter(System.out); if ( mainTemplate != null) mainTemplate.merge(mainContext, writer); writer.flush(); writer.close(); catch( Exception ex ) ex.printStackTrace(); 回頁首Velocity 作為獨(dú)立的解析器要編譯上述示例獨(dú)立解析器,請使用安裝目錄下 codeapp中的 compile.bat文件。要試驗(yàn)該解析器,請使用 process.bat批處理文件,其中
35、包括: set VEL_HOME=jdk1.4vel14rc1 java -classpath .classes;%VEL_HOME%velocity-dep-1.4-rc1.jar com.ibm.dvworks.velocity.VelocityParser %1 %2 %3注意,必須同時(shí)在 compile.bat和 process.bat中把環(huán)境變量 VEL_HOME設(shè)置成安裝 Velocity 的目錄。在 Velocity 發(fā)行包中包含兩類不同的 JAR 文件: velocity-dep-?.jar(其中的 -?是版本號信息)和
36、0;velocity-?.jar。 velocity-dep-?.jar文件包括所有的外部依賴(Jakarta common-collections、Avalon Logkit 和 ORO 正則表達(dá)式庫),可以直接使用。如果您的 classpath 中已經(jīng)有一些這樣的庫,您可能希望使用 velocity-?.jar文件來代替。如果這些 JAR 組成都不能滿足您的需要,可以很容易地按照需要的方式重新建立 Velocity。Velocity 發(fā)行包中包括一個(gè) ant 腳本,可以為不同的應(yīng)用場景建立 7 種不同的 JAR 配置。為了便于上手,Velocity 預(yù)設(shè)了一些默認(rèn)配置屬
37、性,對于多數(shù)應(yīng)用而言,這都是合理的和可以接受的。這就避免了開發(fā)人員從一開始就忙于復(fù)雜的配置選項(xiàng),讓他們能馬上體驗(yàn)到這種模板引擎?;仨撌追?wù)器上的 Velocity 與 JSP 技術(shù)在服務(wù)器端可以使用 Velocity 處理模板和生成的動(dòng)態(tài)內(nèi)容(HTML、XML 等)。這和 JSP 技術(shù)的目標(biāo)非常接近。但是,JSP 模型可以毫無阻礙地訪問底層的 Servlet API 和 Java 編程語言。事實(shí)上,為了避免訪問這些固有的特性,您在編碼中必須嚴(yán)格約束(只是使用 EL、標(biāo)簽庫和類似的特性)。它基本上是一種在很大程度上開放的訪問模型。拿 Velocity 與之比較。作為一種完全自包含的模板引擎和腳本
38、解釋器,Velocity 擁有完全封閉的模型。任何針對系統(tǒng)和 / 或 Java 編程語言的訪問都必須明確地啟用。默認(rèn)情況,Velocity 模板中不能訪問 Java 編程語言的任何方面。這種封閉的模型使 Velocity 能夠提供分離的模板表示層,與任何應(yīng)用程序業(yè)務(wù)邏輯或者數(shù)據(jù)管理代碼清晰地劃分開。現(xiàn)在讓我們把這種模板引擎與 Tomcat 5 的最新版本集成在一起,看一看 Velocity 在服務(wù)器端的應(yīng)用?;仨撌着c Tomcat 5 一起部署 VelocityVelocity 發(fā)行包帶有一個(gè) org.apache.velocity.servletVelocityServlet庫類,
39、擴(kuò)展它可以很快地創(chuàng)建一個(gè)模板處理 servlet。作為獨(dú)立的客戶機(jī)應(yīng)用程序測試的任何模板都可以使用 VelocityServlet部署在服務(wù)器上。把獨(dú)立的 Velocity 模板轉(zhuǎn)移到 Web 應(yīng)用程序中相對比較簡單。只需要以下幾個(gè)步驟:Velocity 中的工具工具是在模板中可以通過 Velocity 上下文使用的實(shí)用 Java 對象。雖然可以手工把這些對象附加到上下文中,但 VelocityViewServlet工具箱管理器可通過更加靈活和結(jié)構(gòu)化的方式完成。在模板中一般是通過調(diào)用工具的方法來使用它們。 VelocityViewServlet與VelocityS
40、truts都提供了非常有價(jià)值的經(jīng)過測試的工具,在作為一種視圖技術(shù)部署 Velocity 時(shí)極其有用。1. 從 org.apache.velocity.servlet.VelocityServlet類派生一個(gè) Servlet 類。2. 重寫并實(shí)現(xiàn)其中的一個(gè) handleRequest()方法。3. 在 handleRequest()的實(shí)現(xiàn)中,添加希望在模板中作為上下文屬性使用的數(shù)據(jù)或工具(請參閱側(cè)欄 Velocity 中的工具)。4. 在 handleRequest()的實(shí)現(xiàn)中,從文件或資源(如 JAR 文件)中取得模板并返回它。在示例代碼包中,
41、 com.ibm.dvworks.velocity.VelTestServlet就是按照上述步驟創(chuàng)建的一個(gè) servlet。您可以查看 webappsvservletWEB-INFsrc目錄下的代碼。如果改變了這些代碼,一定要使用 compile.bat 批處理文件重新編譯它。部署描述符(web.xml 文件)定義了該 servlet 并把它映射到 /vServletURL 模式中,如清單 19 所示:清單 19. 自定義基于 Velocity 的 servlet 的 Tomcat 部署描述符 <?xml version="1.0" en
42、coding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-/Sun Microsystems, Inc./DTD Web Application 2.3/EN" " <web-app> <servlet> <servlet-name>vServlet</servlet-name> <servlet-class>com.ibm.dvworks.velocity.VelTestServlet</servlet-class> &
43、lt;/servlet> <servlet-mapping> <servlet-name>vServlet</servlet-name> <url-pattern>/vServlet</url-pattern> </servlet-mapping> </web-app>加載并處理的模板放在 webappsvServlet目錄中。在這個(gè)例子中,模板文件稱為 variables.vm。測試之前一定要保證 velocity-dep-?.jar文件已經(jīng)放在 webappsv
44、ServletWEB-INFlib目錄下,然后啟動(dòng) Tomcat 5 并訪問http:/localhost:8080/vservlet/ServletURL。部署 VelocityViewServlet要把模板功能擴(kuò)展到 Web 應(yīng)用程序中,應(yīng)該使用 Velocity 工具集中的 VelocityViewServlet。Velocity 工具是 Velocity 的一個(gè)子項(xiàng)目(請參閱參考資料找到這個(gè) URL 并下載最新的版本)。該 Servlet 為 Velocity 用作一種視圖層技術(shù)提供了更復(fù)雜的支持,既可以與 JSP 技術(shù)聯(lián)合使用也可以代替后者。使用 Velocity
45、ViewServlet可以減少許多冗余代碼,因?yàn)樗峁┝耍?#183; 對請求對象和屬性、會話對象和屬性以及 servlet 上下文和屬性的直接模板訪問· 正式的、可外部配置的“工具箱”,可以增加在模板中使用的自定義工具(這里講的工具只是具有公共方法的已編譯的類)· 一個(gè)通用的、經(jīng)過測試的、隨時(shí)可用的工具庫要把 VelocityViewServlet集成到 Web 應(yīng)用程序中,可以看一看示例 velview Web 應(yīng)用程序(在 webappsvelview目錄中)。該應(yīng)用程序包括本文中所討論的那些模板。此外,它還顯示了請求、會話以及 servlet 上
46、下文對象的屬性。集成的步驟如下:首先要保證 velocity-tools-view.jar文件在應(yīng)用程序的 lib目錄中。當(dāng)然,這個(gè) velocity JAR 文件也應(yīng)該在那兒。在部署描述符 web.xml 文件中,包括 VelocityViewServlet。初始化參數(shù)是一個(gè)工具箱描述 XML 文件。該 servlet 映射為處理所有擴(kuò)展名為 .vm 的文件,如清單 20 所示:清單 20. VelocityViewServlet 的 Tomcat 部署描述符(web.xml)<?xml version="1.0" encoding=&
47、quot;ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-/Sun Microsystems, Inc./DTD Web Application 2.3/EN" " <web-app> <servlet> <servlet-name>velocityView</servlet-name> <servlet-class> org.apache.velocity.tools.view.servlet.VelocityViewServlet </se
48、rvlet-class> <init-param> <param-name>org.apache.velocity.toolbox</param-name> <param-value>/WEB-INF/toolbox.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>velocityView</servlet-name> <url-pattern>*.vm&l
49、t;/url-pattern> </servlet-mapping> </web-app>該例子的工具箱描述符(toolbox.xml)文件中,包含了兩個(gè)來自 Velocity 工具庫的通用工具可以在模板 DateTool和 MathTool中訪問。這兩個(gè)工具使我們能夠格式化日期和時(shí)間信息,并在模板中執(zhí)行浮點(diǎn)運(yùn)算,如清單 21 所示:清單 21. 包括 DateTool 和 MathTool 的工具箱描述符 <?xml version="1.0"?> <toolbox> <tool> &l
50、t;key>date</key> <scope>application</scope> <class>org.apache.velocity.tools.generic.DateTool</class> </tool> <tool> <key>math</key> <scope>application</scope> <class>org.apache.velocity.tools.generic.MathTool</class> &
51、lt;/tool> .在 VelocityViewServlet中有一組常用的標(biāo)準(zhǔn)工具,如表 1 所示:表 1. VelocityViewServlet 中的標(biāo)準(zhǔn)工具工具名描述LinkTool處理 URI。該工具經(jīng)常會用到,如果在模板中創(chuàng)建可點(diǎn)擊的鏈接就要用到該工具,可以生成依賴于上下文的 URI 部分。CookieTool使模板能夠創(chuàng)建或訪問瀏覽器緩沖的 cookie。ParameterParser簡化后面收到的請求參數(shù)的解析。還有兩個(gè)高度專門化的、不那么常用的工具,如表 2 所示:表 2. 專門的 VelocityViewServlet 工具工具名描述ViewRenderT
52、ool使模板能夠解析包含 VTL 的字符串。AbstractSearchTool提供了一種骨架工具(必須使用自定義的 Java 代碼來擴(kuò)展),以便實(shí)現(xiàn)在線搜索和搜索結(jié)果分頁。您可以使用 http:/localhost:8080/velview/variables.vmURL 測試 velview 應(yīng)用程序。您應(yīng)該打開模板源代碼看一看所用的 Velocity 引擎、 LinkTool和 CookieTool?;仨撌着c Struts 框架的互操作Struts 是一種構(gòu)造基于 MVC 模型的框架的流行 Web 應(yīng)用程序。Struts 默認(rèn)的視圖組件技術(shù)是 JSP 技術(shù)。
53、但是,可以很容易把 Velocity 集成進(jìn)來作為視圖組件。圖 1 說明了 Velocity 的這種具體應(yīng)用:圖 1. Velocity 與 Struts MVC 框架集成重要的是要看到,在這種結(jié)合中 Velocity 并沒有代替 JSP 技術(shù)。相反,JSP 技術(shù)和 Velocity 模板可以協(xié)同工作。集成 Velocity 需要配置VelocityViewServlet以便處理 .vm 模板,就像 部署 VelocityViewServlet 部分所講的那樣。這意味著 .jsp 文件將繼續(xù)由容器(即 Tomcat 5 中的 Jasper)處理,而任何 .vm 模板則傳遞給
54、 Velocity。Velocity Tools 子項(xiàng)目中的 VelocityStruts組件(請參閱 參考資料)包含集成 Velocity 與 Struts 的所有功能。 VelocityStruts提供了一組專用的 Velocity 工具,用于訪問 Struts 專有的資源和 Velocity 模板中的信息。表 3 列出了最常用的工具:表 3. 用于 VelocityStruts 集成的工具工具名描述StrutsLinkTool針對 Struts 的 LinkTool 專用版本,提供了 setAction()和 setForward()訪問
55、預(yù)先配置的活動(dòng)映射。FormTool訪問 Struts 的表單 beans。ErrorsTool處理 Struts 錯(cuò)誤消息,包括對國際化的支持。MessageTool提供對 Struts 國際化支持的訪問,尤為特別的是依賴于語言的消息資源。還有一組工具專用于 Struts 1.1 中的新特性,如表 4 所示:表 4. 專用的 Struts 1.1 訪問工具工具名描述SecureLinkTool用于 Struts 1.1 的安全鏈接(SSL)擴(kuò)展。ActionMessagesTool提供對 Struts 1.1 新對象 ActionMessages的訪問。TilesTool提供對 S
56、truts 1.1 Tiles 擴(kuò)展支持的訪問。ValidatorTool提供對 Struts 1.1 Validator 擴(kuò)展的訪問,生成代碼驗(yàn)證表單輸入字段。在 webappsstruts-example目錄中可以找到一個(gè)例子,使用 Struts 而非 JSP 技術(shù)創(chuàng)建 Struts 頁面。本例中我們使用 Struts 取代了實(shí)例 Web 應(yīng)用程序所發(fā)布的第一個(gè)標(biāo)題頁,您可以試著改變其他的頁面。下面列出了操作的步驟。1. 把 Velocity 庫復(fù)制到 Struts 示例應(yīng)用程序下的 WEB-INFlib目錄中。要使用 Tomcat 5(5.0.16 是撰寫本文時(shí)的最新
57、版本)和 Struts 1.1,需要把以下 JAR 文件復(fù)制到 webappsstruts-exampleWEB-INFlib目錄中:o velocity-tools-1.1-beta1.jaro velocity-1.4-rc1.jar2. 然后在 Struts 配置文件( WEB-INFstruts-config.xml),把 Struts 動(dòng)作映射設(shè)置為轉(zhuǎn)向 index.vm 文件而不是 index.jsp 文件,如清單 22 所示: 清單 22. 把 Struts 動(dòng)作轉(zhuǎn)向 index.vm3. <action path="/logoff&
58、quot;4. type="org.apache.struts.webapp.example.LogoffAction"> 5. <forward name="success" path="/index.vm"/> </action>6. 在部署描述符 WEB-INFweb.xml文件中配置 VelocityViewServlet 處理 .vm文件。同樣把歡迎文件設(shè)為 index.vm 而非 index.jsp,如清單 23 所示: 清單 23. 改變 s
59、truts 示例 Web 應(yīng)用程序的部署描述符7. <!- Action Servlet Configuration -> 8. <servlet> 9. <servlet-name>action</servlet-name> 10. <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> 11. <init-param> 12. <param-name>config</param-name> 13. &
60、lt;param-value>/WEB-INF/struts-config.xml, 14. /WEB-INF/struts-config-registration.xml</param-value> 15. </init-param> 16. <load-on-startup>1</load-on-startup> 17. </servlet> 18. <servlet> 19. <servlet-name>velocity</servlet-name> 20. <servlet-cl
61、ass>org.apache.velocity.tools.view.servlet.VelocityViewServlet 21. </servlet-class> 22. <init-param> 23. <param-name>org.apache.velocity.toolbox</param-name> 24. <param-value>/WEB-INF/toolbox.xml</param-value> 25. </init-param> 26. <init-param> 27. <param-name>perties</param-name> 28. <param-value>/WEB-INF/perties</param-value> 29. </init-param> 30. </servlet> 31. <!- Action Servlet Mapping -&
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 剪紙課題立項(xiàng)申報(bào)書
- 事故車交易合同范本
- 上海嘉善房屋出租合同范本
- 高中課題申報(bào)書
- 課題申報(bào)書亮點(diǎn)
- 臨時(shí)用工勞務(wù)合同范本 三
- 勞務(wù)拆遷采購合同范本
- 合同范本 材料價(jià)差調(diào)整
- 勞務(wù)公司包工合同范本
- 與中介簽買房合同范本
- 2025年高考時(shí)政考題及參考答案(100題)
- DeepSeek人工智能語言模型探索AI世界科普課件
- 《青春期心理健康指導(dǎo)》課件
- 第18講 等腰三角形 課件中考數(shù)學(xué)復(fù)習(xí)
- 社會階層與教育選擇行為分析-深度研究
- 2025年內(nèi)蒙古呼和浩特市屬國企業(yè)紀(jì)檢監(jiān)察機(jī)構(gòu)招聘工作人員80人高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 社會工作行政(第三版)課件匯 時(shí)立榮 第6-11章 項(xiàng)目管理- 社會工作行政的挑戰(zhàn)、變革與數(shù)字化發(fā)展
- 全過程工程咨詢文件管理標(biāo)準(zhǔn)
- 模特?cái)z影及肖像使用合同協(xié)議范本
- 2025年湘潭醫(yī)衛(wèi)職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試近5年??及鎱⒖碱}庫含答案解析
- 《預(yù)制高強(qiáng)混凝土風(fēng)電塔筒生產(chǎn)技術(shù)規(guī)程》文本附編制說明
評論
0/150
提交評論