在服務(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 與之比較。作為一種完全自包含的模板引擎和腳本解釋器,Velocity 擁有完全封閉的模型。任何針對(duì)系統(tǒng)和/或 Java 編程語言的訪問都必須明確地啟用。默認(rèn)情況,Velocity 模板中不能訪問 Java 編程語言的任何方面。這種封閉的模型使 Velocity 能夠提供分離的模板表示層,與任何應(yīng)用程序業(yè)務(wù)邏輯或者數(shù)據(jù)管理代碼清晰地劃分開。
現(xiàn)在讓我們把這種模板引擎與 Tomcat 5 的最新版本集成在一起,看一看 Velocity 在服務(wù)器端的應(yīng)用。
回頁首Velocity 發(fā)行包帶有一個(gè) org.apache.velocity.servletVelocityServlet 庫類,擴(kuò)展它可以很快地創(chuàng)建一個(gè)模板處理 servlet。作為獨(dú)立的客戶機(jī)應(yīng)用程序測(cè)試的任何模板都可以使用 VelocityServlet 部署在服務(wù)器上。把獨(dú)立的 Velocity 模板轉(zhuǎn)移到 Web 應(yīng)用程序中相對(duì)比較簡(jiǎn)單。只需要以下幾個(gè)步驟:
工具是在模板中可以通過 Velocity 上下文使用的實(shí)用 Java 對(duì)象。雖然可以手工把這些對(duì)象附加到上下文中,但 VelocityViewServlet 工具箱管理器可通過更加靈活和結(jié)構(gòu)化的方式完成。在模板中一般是通過調(diào)用工具的方法來使用它們。 VelocityViewServlet 與 VelocityStruts 都提供了非常有價(jià)值的經(jīng)過測(cè)試的工具,在作為一種視圖技術(shù)部署 Velocity 時(shí)極其有用。
從 org.apache.velocity.servlet.VelocityServlet 類派生一個(gè) Servlet 類。 重寫并實(shí)現(xiàn)其中的一個(gè) handleRequest() 方法。 在 handleRequest() 的實(shí)現(xiàn)中,添加希望在模板中作為上下文屬性使用的數(shù)據(jù)或工具(請(qǐng)參閱側(cè)欄
Velocity 中的工具)。 在 handleRequest() 的實(shí)現(xiàn)中,從文件或資源(如 JAR 文件)中取得模板并返回它。
在示例代碼包中, com.ibm.dvworks.velocity.VelTestServlet 就是按照上述步驟創(chuàng)建的一個(gè) servlet。您可以查看 webapps\vservlet\WEB-INF\src 目錄下的代碼。如果改變了這些代碼,一定要使用 compile.bat 批處理文件重新編譯它。
部署描述符(web.xml 文件)定義了該 servlet 并把它映射到 /vServlet URL 模式中,如清單 19 所示:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>vServlet</servlet-name> <servlet-class>com.ibm.dvworks.velocity.VelTestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>vServlet</servlet-name> <url-pattern>/vServlet</url-pattern> </servlet-mapping> </web-app>
加載并處理的模板放在 webapps\vServlet 目錄中。在這個(gè)例子中,模板文件稱為 variables.vm 。測(cè)試之前一定要保證 velocity-dep---?.jar 文件已經(jīng)放在 webapps\vServlet\WEB-INF\lib 目錄下,然后啟動(dòng) Tomcat 5 并訪問 http://localhost:8080/vservlet/Servlet URL。
要把模板功能擴(kuò)展到 Web 應(yīng)用程序中,應(yīng)該使用 Velocity 工具集中的 VelocityViewServlet 。Velocity 工具是 Velocity 的一個(gè)子項(xiàng)目(請(qǐng)參閱
參考資料 找到這個(gè) URL 并下載最新的版本)。該 Servlet 為 Velocity 用作一種視圖層技術(shù)提供了更復(fù)雜的支持,既可以與 JSP 技術(shù)聯(lián)合使用也可以代替后者。使用 VelocityViewServlet 可以減少許多冗余代碼,因?yàn)樗峁┝耍?div style="height:15px;">
對(duì)請(qǐng)求對(duì)象和屬性、會(huì)話對(duì)象和屬性以及 servlet 上下文和屬性的直接模板訪問 正式的、可外部配置的“工具箱”,可以增加在模板中使用的自定義工具(這里講的工具只是具有公共方法的已編譯的類) 一個(gè)通用的、經(jīng)過測(cè)試的、隨時(shí)可用的工具庫
要把 VelocityViewServlet 集成到 Web 應(yīng)用程序中,可以看一看示例 velview Web 應(yīng)用程序(在 webapps\velview 目錄中)。該應(yīng)用程序包括本文中所討論的那些模板。此外,它還顯示了請(qǐng)求、會(huì)話以及 servlet 上下文對(duì)象的屬性。集成的步驟如下:
首先要保證 velocity-tools-view.jar 文件在應(yīng)用程序的 lib 目錄中。當(dāng)然,這個(gè) velocity JAR 文件也應(yīng)該在那兒。
在部署描述符 web.xml 文件中,包括 VelocityViewServlet 。初始化參數(shù)是一個(gè)工具箱描述 XML 文件。該 servlet 映射為處理所有擴(kuò)展名為 .vm 的文件,如清單 20 所示:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>velocityView</servlet-name> <servlet-class>org.apache.velocity.tools.view.servlet.VelocityViewServlet</servlet-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</url-pattern> </servlet-mapping> </web-app>
該例子的工具箱描述符(toolbox.xml)文件中,包含了兩個(gè)來自 Velocity 工具庫的通用工具可以在模板 DateTool 和 MathTool 中訪問。這兩個(gè)工具使我們能夠格式化日期和時(shí)間信息,并在模板中執(zhí)行浮點(diǎn)運(yùn)算,如清單 21 所示:
<?xml version="1.0"?> <toolbox> <tool> <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> </tool> ...
在 VelocityViewServlet 中有一組常用的標(biāo)準(zhǔn)工具,如表 1 所示:
工具名 描述
LinkTool 處理 URI。該工具經(jīng)常會(huì)用到,如果在模板中創(chuàng)建可點(diǎn)擊的鏈接就要用到該工具,可以生成依賴于上下文的 URI 部分。
CookieTool 使模板能夠創(chuàng)建或訪問瀏覽器緩沖的 cookie。
ParameterParser 簡(jiǎn)化后面收到的請(qǐng)求參數(shù)的解析。
還有兩個(gè)高度專門化的、不那么常用的工具,如表 2 所示:
工具名 描述
ViewRenderTool 使模板能夠解析包含 VTL 的字符串。
AbstractSearchTool 提供了一種骨架工具(必須使用自定義的 Java 代碼來擴(kuò)展),以便實(shí)現(xiàn)在線搜索和搜索結(jié)果分頁。
您可以使用 http://localhost:8080/velview/variables.vm URL 測(cè)試 velview 應(yīng)用程序。您應(yīng)該打開模板源代碼看一看所用的 Velocity 引擎、 LinkTool 和 CookieTool 。
回頁首Struts 是一種構(gòu)造基于 MVC 模型的框架的流行 Web 應(yīng)用程序。Struts 默認(rèn)的視圖組件技術(shù)是 JSP 技術(shù)。但是,可以很容易把 Velocity 集成進(jìn)來作為視圖組件。圖 1 說明了 Velocity 的這種具體應(yīng)用:
重要的是要看到,在這種結(jié)合中 Velocity 并沒有代替 JSP 技術(shù)。相反,JSP 技術(shù)和 Velocity 模板可以協(xié)同工作。集成 Velocity 需要配置 VelocityViewServlet 以便處理 .vm 模板,就像
部署 VelocityViewServlet 部分所講的那樣。這意味著.jsp 文件將繼續(xù)由容器(即 Tomcat 5 中的 Jasper)處理,而任何 .vm 模板則傳遞給 Velocity。
Velocity Tools 子項(xiàng)目中的 VelocityStruts 組件(請(qǐng)參閱
參考資料)包含集成 Velocity 與 Struts 的所有功能。 VelocityStruts 提供了一組專用的 Velocity 工具,用于訪問 Struts 專有的資源和 Velocity 模板中的信息。表 3 列出了最常用的工具:
工具名 描述
StrutsLinkTool 針對(duì) Struts 的 LinkTool 專用版本,提供了 setAction() 和 setForward() 訪問預(yù)先配置的活動(dòng)映射。
FormTool 訪問 Struts 的表單 beans。
ErrorsTool 處理 Struts 錯(cuò)誤消息,包括對(duì)國際化的支持。
MessageTool 提供對(duì) Struts 國際化支持的訪問,尤為特別的是依賴于語言的消息資源。
還有一組工具專用于 Struts 1.1 中的新特性,如表 4 所示:
工具名 描述
SecureLinkTool 用于 Struts 1.1 的安全鏈接(SSL)擴(kuò)展。
ActionMessagesTool 提供對(duì) Struts 1.1 新對(duì)象 ActionMessages 的訪問。
TilesTool 提供對(duì) Struts 1.1 Tiles 擴(kuò)展支持的訪問。
ValidatorTool 提供對(duì) Struts 1.1 Validator 擴(kuò)展的訪問,生成代碼驗(yàn)證表單輸入字段。
在 webapps\struts-example 目錄中可以找到一個(gè)例子,使用 Struts 而非 JSP 技術(shù)創(chuàng)建 Struts 頁面。本例中我們使用 Struts 取代了實(shí)例 Web 應(yīng)用程序所發(fā)布的第一個(gè)標(biāo)題頁,您可以試著改變其他的頁面。下面列出了操作的步驟。 把 Velocity 庫復(fù)制到 Struts 示例應(yīng)用程序下的 WEB-INF\lib 目錄中。要使用 Tomcat 5(5.0.16 是撰寫本文時(shí)的最新版本)和 Struts 1.1,需要把以下 JAR 文件復(fù)制到 webapps\struts-example\WEB-INF\lib 目錄中: velocity-tools-1.1-beta1.jar velocity-1.4-rc1.jar
然后在 Struts 配置文件( WEB-INF\struts-config.xml ),把 Struts 動(dòng)作映射設(shè)置為轉(zhuǎn)向 index.vm 文件而不是 index.jsp 文件,如清單 22 所示:
清單 22. 把 Struts 動(dòng)作轉(zhuǎn)向 index.vm
<action path="/logoff" type="org.apache.struts.webapp.example.LogoffAction"> <forward name="success" path="/index.vm"/> </action>
在部署描述符 WEB-INF\web.xml 文件中配置 VelocityViewServlet 處理 .vm 文件。同樣把歡迎文件設(shè)為 index.vm 而非 index.jsp,如清單 23 所示:
清單 23. 改變 struts 示例 Web 應(yīng)用程序的部署描述符
<!-- Action Servlet Configuration --> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml, /WEB-INF/struts-config-registration.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>velocity</servlet-name> <servlet-class>org.apache.velocity.tools.view.servlet.VelocityViewServlet </servlet-class> <init-param> <param-name>org.apache.velocity.toolbox</param-name> <param-value>/WEB-INF/toolbox.xml</param-value> </init-param> <init-param> <param-name>org.apache.velocity.properties</param-name> <param-value>/WEB-INF/velocity.properties</param-value> </init-param> </servlet> <!-- Action Servlet Mapping --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>velocity</servlet-name> <url-pattern>*.vm</url-pattern> </servlet-mapping> <!-- The Welcome File List --> <welcome-file-list> <welcome-file>index.vm</welcome-file> </welcome-file-list>
最后,把 toolbox.xml 和 velocity.properties 文件從本文的源代碼下載中(請(qǐng)參閱
參考資料)移動(dòng)到 WEB-INF 目錄下。
新的 index.vm 文件如清單 24 所示,可以把它與原來的 index.jsp 文件比較。
<html> <head> <title>$msg.get("index.title")</title> </head> <body bgcolor="white"> #if ( !$application.database) <font color="red"> ERROR: User database not loaded -- check servlet container logs for error messages. </font> <hr> #end <h3>$msg.get("index.heading")</h3> <ul> <li> <a href="$link.setURI("editRegistration.do").addQueryData("action","Create")"> $msg.get("index.registration") </a> </li> <li> <a href="$link.setURI("logon.jsp")"> $msg.get("index.logon") </a> </li> </ul> <p> </p> <a href="$link.setURI("tour.do")"> <font size="-1">$msg.get("index.tour")</font> </a> <p> </p> <img src="$link.setURI("powered-by-logo.gif")" alt="Powered by Velocity"/> </body> </html>
在 index.vm 中,整個(gè)模板都使用 $msg 內(nèi)的消息工具訪問 Struts 的地域有關(guān)的國際化資源。通過對(duì)包含國際化字符串的資源包的本地化更改,這種方法避免了模板中的多數(shù)硬編碼字符串。
您可以使用 VTL 的條件指示符 #if 直接檢查在 servlet 上下文中是否存在數(shù)據(jù)庫屬性。 $application 引用可用于訪問 servlet 上下文中的任何屬性( $request 、 $response 和 $session 也可用于訪問其他 Servlet API 對(duì)象的屬性)。
LinkTool 的 setURI() 方法用于生成服務(wù)器端到 Struts 動(dòng)作和“Powered by Velocity”標(biāo)志圖片的 URI 鏈接。注意,這里使用 LinkTool 的 addQueryData() 方法向結(jié)果 URI 種增加附加的動(dòng)作信息。
要測(cè)試該 Velocity 頁面,您可以啟動(dòng) Tomcat 5 并訪問 http://localhost:8080/struts-example/ URL。注意它的結(jié)果與原來的 JSP 版本完全一致。
回頁首Velocity 模板處理程序可以直接集成到 Java 語言應(yīng)用程序中,立即提供報(bào)告生成或者模板處理的功能。
將模板引擎擴(kuò)展到 Web 應(yīng)用程序,可以使用 VelocityServlet 處理動(dòng)態(tài)生成 HTML 輸出的 Velocity 模板。Velocity 工具項(xiàng)目對(duì)使用 VelocityViewServlet 組件化 Web 層應(yīng)用程序開發(fā)提供了更多的支持。 VelocityViewServlet 以模板為基礎(chǔ)為基于 Web 的 UI 構(gòu)造提供了方便的視圖層。
在使用 MVC 模型框架設(shè)計(jì)復(fù)雜的 Web 應(yīng)用程序時(shí),Velocity 作為一種視圖/模板化技術(shù)——以 VelocityViewServlet 的形式——可以很方便地插入到框架中。對(duì)于流行的 Jakarta Struts MVC 框架,Velocity 可以與基于 JSP 的視圖技術(shù)協(xié)作,也可以和選擇的任何模型技術(shù)進(jìn)行交互。
您可以參閱本文在 developerWorks 全球站點(diǎn)上的
英文原文.
下載本文的
源代碼。
關(guān)于 Velocity 模板引擎的最新版本、相關(guān)文檔、郵件列表和社區(qū)新聞,請(qǐng)?jiān)L問
Velocity 官方站點(diǎn)。
可以從
Velocity 工具子項(xiàng)目 下載 VelocityView servlet、與 Struts 集成的 VelocityStruts 以及其他一些工具。
Struts MVC 框架是一種非常流行的開放源代碼的用于創(chuàng)建 Web 應(yīng)用程序的框架。Velocity 可以與 JSP 技術(shù)一起作為 Struts 的視圖技術(shù)。
Turbine是一種從頭開始設(shè)計(jì)的開放源代碼 MVC 框架,可以很好地使用 Velocity 作為視圖組件技術(shù)。
看看 Srikanth Shenoy 和 Nithin Mallya 的文章,了解如何
集成 Struts、Tiles 和 Java Server Faces( developerWorks,2003 年 9 月)。
要使用 WebSphere Studio V5 創(chuàng)建基于 Struts 的 Web 應(yīng)用程序,請(qǐng)閱讀 Colin Yu 和 Jane Fung 的
系列文章(2003 年 11 月)。
訪問
Developer Bookstore,上面有豐富的技術(shù)書籍列表,其中包括數(shù)百本和
Java 有關(guān)的書籍。
在
developerWorksJava 技術(shù)專區(qū) 可以找到關(guān)于 Java 編程語言各個(gè)方面的很多文章。
Sing Li 是
Professional Apache Tomcat 、
Pro JSP 、 Early Adopter JXTA、 Professional Jini 以及 Wrox Press 出版的許多其他書籍的作者,也是 Wrox Press 很多其他書籍的作者。他定期為技術(shù)雜志撰稿,也是 P2P 發(fā)展的積極倡導(dǎo)者。Sing 是咨詢顧問和自由作家,可以通過
westmakaha@yahoo.com與他聯(lián)系。