《Velocity Web應用指南》中文版
聲明: 轉載請保留此頁聲明
**************************************************************************
此文檔為藍杰實訓學員拓展實訓之用.
藍杰實訓不對譯文中某些說法可能會對您的系統(tǒng)或開發(fā)造成損害負責.
如對您有所幫助,我們不勝榮幸!
*************************************************************************
本文屬NetJava.cn中的Velocity中文系列,本系包含如下文章:
《Velocity Java開發(fā)指南中文版》(Developer`s Guide)
《Velocity模板使用指南中文版》(User`s Guide)
《Velocity Web應用開發(fā)指南中文版》(Web Application Guide)
《VTL語法參考指南中文版》(VTL Reference)
《DB4O中文系列之起步篇》
. . .
更多資料請訪問http://www.netjava.cn/ 下載.
**************************************************************************
譯者: javaFound
Mail: javafound@gmail.com
*************************************************************************
目錄
1.使用Velocity構建Web應用
Velocity常見的用途是生成web頁面, 通常用來替換JSP技術. 使用它生成頁面有以下優(yōu)勢:
- 簡潔 – 一般的web美工不需要懂程序語言的就可以設計動態(tài)業(yè)面.
- Web系統(tǒng)容易維護 – MVC推薦的做法是在頁面中不要存在其它的腳本語言出現..
- 容易訪問數據模型的命令和屬性 – 頁面設計者通過引用簡單的就可訪問context中的java數據對象.
- 一致性 – Velocity可用做其它的文本模板生成任務,如如發(fā)送email.
本系列全面講解了將Velocity應用從入門到精通其技術特點應用的每個方面,助你成為MVC構架的高手,本文由javaFound(NetJava.cn@gmail.com)譯自http://velocity.apache.org/ .a
2.Use a Framework
Velocity的主要目標是通過模板生成格式文檔. 因此, Velocity自身不提供任何Web相關的功能. 當你需要開發(fā)Web應用時, 需要一個框架來接收HTTP請求和, 處理用戶認證,執(zhí)行業(yè)務邏輯調用,最后生成應答內容返回給客戶端。這里有幾個良好的可選方案:
1. Velocity Tools / VelocityViewServlet – 這是最容易的起步方法,你在下載時可同時下載Velocity Tools (Velocity的一個子項目)來使用其所長 VelocityViewServlet. 這是一個很容易配置和安裝的Servlet. 在你的web服務器上創(chuàng)建一個模板目錄,編輯一下配置的XML文件就行了---這很容易,我們隨后就講到.
2. Velocity Tools / VelocityStruts – 也許你比較熟悉流行的 Struts framework, Struts最初被設計為JSP應用提供更多的功能支撐.利用Velocity的 VelocityStruts 模塊工具, 可以替代jsp而用模板語言做Web頁面對面. 這樣Struts的強大功能和Velocity有輕巧靈活就有效的結合到一起.
3. 第三方框架 – 還有更多的第三方框架可用,你可到wiki PoweredByVelocity 頁面上了解更多, Spring 也許是目前最為知名的了. Jakarta Turbine 也有很多特色也是與Velocity結合最好的. 它使用VTL做為主要的頁面語言, 它優(yōu)秀的設計會讓你驚異開發(fā)者到底是怎么設計的它. 另外還有 Click or Maverick frameworks, 也提供了與Velocity整合很好的結構.
4. 創(chuàng)建你自己的 – 最后的一招是創(chuàng)建你自己的應用結構,只需創(chuàng)建一個主要用于分發(fā)請求的Servlet servlet, 用來從文件或DB提取模板,整合你現有的業(yè)務域處理后,將結果發(fā)給用戶,一點也不費力氣,就可用它整合你現有的系統(tǒng). 更進一步,你可以通過extends VelocityViewServlet 來添加更多的你需要的功能.
另一方面,你可以多處引用VelocityServlet,但我們強烈建議你使用Velocity Tools中的VelocityViewServlet替代它.
3.Web應用用例
這兒講解一些在Web應用中的一般規(guī)則:
4.不要改變己輸出對象的狀態(tài)!
Velocity實際上通過引用來調用對象的命令.當頁面正在顯示時,而程序中的對象發(fā)生了改變,這就會帶來麻煩,如下例程示:
比如,以下是一個正常的調用一個List的命令size() 來顯示結果.
There are $users.size() currently logged in.
例如你在一個計算銀行帳額的頁面中如下寫道:
2005 data: $table.data
$table.calculateNextYear()
2006 data: $table.data
這里就有可能發(fā)生問題:你在通過VTL來改變一個對象的狀態(tài)后,再輸出對象的數據,----要保證輸出的數據如你所愿,就絕對要保證在VTL中計算完成,沒有其它操作改變這個對象的狀態(tài),但頁面的設計者在使用VTL時肯定不能保證這一點:想像你剛計算出帳金額,在沒輸出前某個地方的另一個操作將這個金額清0了,你會暈死呢。。。。。. 這種問題出現的可能性無法從VTL本身的語法中消除,比如常用的#if 和 #foreach指令操作中就可能出現,或在你用來控制應用的會話狀態(tài)時會出現更多.
因此:強烈建議僅僅是使用Velocity將需要的信息插入到文本中---Velocity中的引用只是從java數據對象取得信息,而這個提取的命令調用不要改變對象的任何狀態(tài)!,不要在VTL中操作對象!
如果確實需要這樣做 (像上面的那個例子) ,可以先把計算出的值放入一個由控制器管理下的map或list中,所有計算結果的提取或狀態(tài)的改變都由一個控制器來代理.
另一個要注意的是, 不要將Iterator or Enumeration 對象放入context,可以用List或Set對象..
5.HTML/XML字符轉義
用戶輸入的包含特定 HTML or XML 符號的內容 (如 <, >, or &)在Web頁面中需要轉義. 這是保證這字符串有效的辦法, 也可以防止出錯 cross-site scripting. 與JSTL (the Java Standard Tag Language found in Java Server Pages)不同的是, Velocity 默認不會對這些字符做轉義處理.
但Velocity還是提供了這個事件接口: ReferenceInsertionEventHandler ,在這種字符插入到VTL中時讓你接收事件.你可以在文件velocity.properties中配置EscapeHtmlReference處理器以處理的表達式. 以下配置將包裝所有以msg開頭的內容為HTML 內容實體(e.g. $msgText).
eventhandler.referenceinsertion.class = org.apache.velocity.app.event.implement.EscapeHtmlReference
eventhandler.escape.html.match = /msg.*/
注意:有時其它封類型.如,CSS( style sheets)中的@ 符號需要封裝, Javascript中的單引號‘也需要.
6.應用安全性
Web應用是運行在網絡上的一個服務,會有很多用戶訪問不同機密程序的資源, 安全性是其首要條件. 一些標準的Web安全規(guī)則是Velocity所支持的.一些用法 (系統(tǒng)配置,兼容性腳本,命令攔截)都可以參考 Building Secure Applications with Velocity. 以進一步了解, 你也需要防止模板設計者寫下 "危險"的引用指令---你需要對java對象更好的封裝.還可以這樣做,只是我不知這話是什么意思: you may want to prevent template designers from including "dangerous" reflection-related methods by specifying the SecureUberspector to get/set properties and execute method calls.
runtime.introspector.uberspect = org.apache.velocity.util.introspection.SecureUberspector
7.日志文件
Velocity日志配置方面需求較少,它默認的會在使用的web程序的當前目錄下創(chuàng)建velocity.log,"current directory" –指的是應用服務器啟動的目錄,如你從tomcat的bin目錄下雙擊start.bat啟動,那這個日志就是在bin下.
8.布署指南
這是一個將VelocityViewServlet構建到你的Web 應用中的簡潔指南. (建議你先將VelocityViewServlet從源包中編譯,但這不是必須的).我們建議按如下步驟使用:
需要 Java Developer‘s Kit (JDK) and Apache Ant 支持.
更多的信息可以查看 Velocity Tools documentation.
1. 下載Veloicyt tools和源碼: download page.
2. 輸出以下命令使用ant編譯 Velocity Tools jar和例子:
3. ant example.simple
4. 打開目錄 "examples" ,你將看到"index.vm". 這是其中一些內容摘要::
5. <html>
6. <body>
7. I‘m a velocity template.
8.
9. #if( $XHTML )
10. #set( $br = "<br />" )
11. #else
12. #set( $br = "<br>" )
13. #end
14.
15. $br
16. $br
17.
18. Here we use a custom tool: $toytool.message
19.
20. $br
21. $br
22.
23. Here we get the date from the DateTool: $date.medium
24. </body>
25. </html>
You can copy any additional velocity files into this same directory. In examples/WEB-INF you will see a file "toolbox.xml". This specifies a list of "Tools" that are automatically included in the context.
<toolbox>
<xhtml>true</xhtml>
<tool>
<key>toytool</key>
<class>ToyTool</class>
</tool>
<data type="number">
<key>version</key>
<value>1.1</value>
</data>
<data type="boolean">
<key>isSimple</key>
<value>true</value>
</data>
<data type="string">
<key>foo</key>
<value>this is foo.</value>
</data>
<data type="string">
<key>bar</key>
<value>this is bar.</value>
</data>
<tool>
<key>map</key>
<class>java.util.HashMap</class>
</tool>
<tool>
<key>date</key>
<scope>application</scope>
<class>org.apache.velocity.tools.generic.DateTool</class>
</tool>
</toolbox>
And finally the web.xml file specifies the name of the servlet and location of toolbox.properties.
<web-app>
<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>
<load-on-startup>10</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.vm</welcome-file>
</welcome-file-list>
</web-app>
26. 將這個目錄下的東東全部考到你的tomcat的"webapps" 目錄下. ---也可以只考 "simple.war",現在可以這樣來訪問了:
27. http://localhost:8080/simple/index.vm
28. 你可以測試加入新的velocity模板. 你只需改變訪問的URL就可訪問這些頁面. 可以在Toolbox.xml 中改變配置或創(chuàng)建你自己的工具,請查看 Velocity Tools 文檔或 Wiki 取得更多信息.