《Velocity Web應(yīng)用指南》中文版
來(lái)源http://velocity.
聲明: 轉(zhuǎn)載請(qǐng)保留此頁(yè)聲明
**************************************************************************
此文檔為藍(lán)杰實(shí)訓(xùn)學(xué)員拓展實(shí)訓(xùn)之用.
藍(lán)杰實(shí)訓(xùn)不對(duì)譯文中某些說(shuō)法可能會(huì)對(duì)您的系統(tǒng)或開(kāi)發(fā)造成損害負(fù)責(zé).
如對(duì)您有所幫助,我們不勝榮幸!
*************************************************************************
本文屬NetJava.cn中的Velocity中文系列,本系包含如下文章:
《Velocity Java開(kāi)發(fā)指南中文版》(Developer`s Guide)
《Velocity模板使用指南中文版》(User`s Guide)
《Velocity Web應(yīng)用開(kāi)發(fā)指南中文版》(Web Application Guide)
《VTL語(yǔ)法參考指南中文版》(VTL Reference)
《DB4O中文系列之起步篇》
. . .
更多資料請(qǐng)?jiān)L問(wèn)http://www./ 下載.
**************************************************************************
譯者: javaFound
Mail: javafound@gmail.com
*************************************************************************
目錄
1.使用Velocity構(gòu)建Web應(yīng)用
1.使用Velocity構(gòu)建Web應(yīng)用
Velocity常見(jiàn)的用途是生成web頁(yè)面, 通常用來(lái)替換JSP技術(shù). 使用它生成頁(yè)面有以下優(yōu)勢(shì):
- 簡(jiǎn)潔 – 一般的web美工不需要懂程序語(yǔ)言的就可以設(shè)計(jì)動(dòng)態(tài)業(yè)面.
- Web系統(tǒng)容易維護(hù) – MVC推薦的做法是在頁(yè)面中不要存在其它的腳本語(yǔ)言出現(xiàn)..
- 容易訪問(wèn)數(shù)據(jù)模型的命令和屬性 – 頁(yè)面設(shè)計(jì)者通過(guò)引用簡(jiǎn)單的就可訪問(wèn)context中的java數(shù)據(jù)對(duì)象.
- 一致性 – Velocity可用做其它的文本模板生成任務(wù),如如發(fā)送email.
本系列全面講解了將Velocity應(yīng)用從入門(mén)到精通其技術(shù)特點(diǎn)應(yīng)用的每個(gè)方面,助你成為MVC構(gòu)架的高手,本文由javaFound(NetJava.cn@gmail.com)譯自http://velocity./ .a
2.Use a Framework
Velocity的主要目標(biāo)是通過(guò)模板生成格式文檔. 因此, Velocity自身不提供任何Web相關(guān)的功能. 當(dāng)你需要開(kāi)發(fā)Web應(yīng)用時(shí), 需要一個(gè)框架來(lái)接收HTTP請(qǐng)求和, 處理用戶認(rèn)證,執(zhí)行業(yè)務(wù)邏輯調(diào)用,最后生成應(yīng)答內(nèi)容返回給客戶端。這里有幾個(gè)良好的可選方案:
1. Velocity Tools / VelocityViewServlet – 這是最容易的起步方法,你在下載時(shí)可同時(shí)下載Velocity Tools (Velocity的一個(gè)子項(xiàng)目)來(lái)使用其所長(zhǎng) VelocityViewServlet. 這是一個(gè)很容易配置和安裝的Servlet. 在你的web服務(wù)器上創(chuàng)建一個(gè)模板目錄,編輯一下配置的XML文件就行了---這很容易,我們隨后就講到.
2. Velocity Tools / VelocityStruts – 也許你比較熟悉流行的 Struts framework, Struts最初被設(shè)計(jì)為JSP應(yīng)用提供更多的功能支撐.利用Velocity的 VelocityStruts 模塊工具, 可以替代jsp而用模板語(yǔ)言做Web頁(yè)面對(duì)面. 這樣Struts的強(qiáng)大功能和Velocity有輕巧靈活就有效的結(jié)合到一起.
3. 第三方框架 – 還有更多的第三方框架可用,你可到wiki PoweredByVelocity 頁(yè)面上了解更多, Spring 也許是目前最為知名的了. Jakarta Turbine 也有很多特色也是與Velocity結(jié)合最好的. 它使用VTL做為主要的頁(yè)面語(yǔ)言, 它優(yōu)秀的設(shè)計(jì)會(huì)讓你驚異開(kāi)發(fā)者到底是怎么設(shè)計(jì)的它. 另外還有 Click or Maverick frameworks, 也提供了與Velocity整合很好的結(jié)構(gòu).
4. 創(chuàng)建你自己的 – 最后的一招是創(chuàng)建你自己的應(yīng)用結(jié)構(gòu),只需創(chuàng)建一個(gè)主要用于分發(fā)請(qǐng)求的Servlet servlet, 用來(lái)從文件或DB提取模板,整合你現(xiàn)有的業(yè)務(wù)域處理后,將結(jié)果發(fā)給用戶,一點(diǎn)也不費(fèi)力氣,就可用它整合你現(xiàn)有的系統(tǒng). 更進(jìn)一步,你可以通過(guò)extends VelocityViewServlet 來(lái)添加更多的你需要的功能.
另一方面,你可以多處引用VelocityServlet,但我們強(qiáng)烈建議你使用Velocity Tools中的VelocityViewServlet替代它.
3.Web應(yīng)用用例
這兒講解一些在Web應(yīng)用中的一般規(guī)則:
4.不要改變己輸出對(duì)象的狀態(tài)!
Velocity實(shí)際上通過(guò)引用來(lái)調(diào)用對(duì)象的命令.當(dāng)頁(yè)面正在顯示時(shí),而程序中的對(duì)象發(fā)生了改變,這就會(huì)帶來(lái)麻煩,如下例程示:
比如,以下是一個(gè)正常的調(diào)用一個(gè)List的命令size() 來(lái)顯示結(jié)果.
There are $users.size() currently logged in.
例如你在一個(gè)計(jì)算銀行帳額的頁(yè)面中如下寫(xiě)道:
2005 data: $table.data
$table.calculateNextYear()
2006 data: $table.data
這里就有可能發(fā)生問(wèn)題:你在通過(guò)VTL來(lái)改變一個(gè)對(duì)象的狀態(tài)后,再輸出對(duì)象的數(shù)據(jù),----要保證輸出的數(shù)據(jù)如你所愿,就絕對(duì)要保證在VTL中計(jì)算完成,沒(méi)有其它操作改變這個(gè)對(duì)象的狀態(tài),但頁(yè)面的設(shè)計(jì)者在使用VTL時(shí)肯定不能保證這一點(diǎn):想像你剛計(jì)算出帳金額,在沒(méi)輸出前某個(gè)地方的另一個(gè)操作將這個(gè)金額清0了,你會(huì)暈死呢。。。。。. 這種問(wèn)題出現(xiàn)的可能性無(wú)法從VTL本身的語(yǔ)法中消除,比如常用的#if 和 #foreach指令操作中就可能出現(xiàn),或在你用來(lái)控制應(yīng)用的會(huì)話狀態(tài)時(shí)會(huì)出現(xiàn)更多.
因此:強(qiáng)烈建議僅僅是使用Velocity將需要的信息插入到文本中---Velocity中的引用只是從java數(shù)據(jù)對(duì)象取得信息,而這個(gè)提取的命令調(diào)用不要改變對(duì)象的任何狀態(tài)!,不要在VTL中操作對(duì)象!
如果確實(shí)需要這樣做 (像上面的那個(gè)例子) ,可以先把計(jì)算出的值放入一個(gè)由控制器管理下的map或list中,所有計(jì)算結(jié)果的提取或狀態(tài)的改變都由一個(gè)控制器來(lái)代理.
另一個(gè)要注意的是, 不要將Iterator or Enumeration 對(duì)象放入context,可以用List或Set對(duì)象..
5.HTML/XML字符轉(zhuǎn)義
用戶輸入的包含特定 HTML or XML 符號(hào)的內(nèi)容 (如 <, >, or &)在Web頁(yè)面中需要轉(zhuǎn)義. 這是保證這字符串有效的辦法, 也可以防止出錯(cuò) cross-site scripting. 與JSTL (the Java Standard Tag Language found in Java Server Pages)不同的是, Velocity 默認(rèn)不會(huì)對(duì)這些字符做轉(zhuǎn)義處理.
但Velocity還是提供了這個(gè)事件接口: ReferenceInsertionEventHandler ,在這種字符插入到VTL中時(shí)讓你接收事件.你可以在文件velocity.properties中配置EscapeHtmlReference處理器以處理的表達(dá)式. 以下配置將包裝所有以msg開(kāi)頭的內(nèi)容為HTML 內(nèi)容實(shí)體(e.g. $msgText).
eventhandler.referenceinsertion.class = org.apache.velocity.app.event.implement.EscapeHtmlReference
eventhandler.escape.html.match = /msg.*/
注意:有時(shí)其它封類型.如,CSS( style sheets)中的@ 符號(hào)需要封裝, Javascript中的單引號(hào)‘也需要.
6.應(yīng)用安全性
Web應(yīng)用是運(yùn)行在網(wǎng)絡(luò)上的一個(gè)服務(wù),會(huì)有很多用戶訪問(wèn)不同機(jī)密程序的資源, 安全性是其首要條件. 一些標(biāo)準(zhǔn)的Web安全規(guī)則是Velocity所支持的.一些用法 (系統(tǒng)配置,兼容性腳本,命令攔截)都可以參考 Building Secure Applications with Velocity. 以進(jìn)一步了解, 你也需要防止模板設(shè)計(jì)者寫(xiě)下 "危險(xiǎn)"的引用指令---你需要對(duì)java對(duì)象更好的封裝.還可以這樣做,只是我不知這話是什么意思: 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日志配置方面需求較少,它默認(rèn)的會(huì)在使用的web程序的當(dāng)前目錄下創(chuàng)建velocity.log,"current directory" –指的是應(yīng)用服務(wù)器啟動(dòng)的目錄,如你從tomcat的bin目錄下雙擊start.bat啟動(dòng),那這個(gè)日志就是在bin下.
8.布署指南
這是一個(gè)將VelocityViewServlet構(gòu)建到你的Web 應(yīng)用中的簡(jiǎn)潔指南. (建議你先將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. 打開(kāi)目錄 "examples" ,你將看到"index.vm". 這是其中一些內(nèi)容摘要::
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. 將這個(gè)目錄下的東東全部考到你的tomcat的"webapps" 目錄下. ---也可以只考 "simple.war",現(xiàn)在可以這樣來(lái)訪問(wèn)了:
27. http://localhost:8080/simple/index.vm
28. 你可以測(cè)試加入新的velocity模板. 你只需改變?cè)L問(wèn)的URL就可訪問(wèn)這些頁(yè)面. 可以在Toolbox.xml 中改變配置或創(chuàng)建你自己的工具,請(qǐng)查看 Velocity Tools 文檔或 Wiki 取得更多信息.





