模板工具(二)——VelocityTools
應該算是Velocity的擴充套件,為了Velocity更好用。包括GenericTools VelocityView VelocityStruts三個子專案,其中VelocityStruts是為了與struts整合服務,此處不介紹。
GenericTools
為j2se提供tools使用,具體tools如下:
DateTool: 對Date操作:格式化、比較等
EscapeTool:對template進行escaping
IteratorTool:更好地控制 #foreach loop
ListTool:透明地處理array
MathTool:數學運算
NumberTool:對數字格式化和convert
RenderTool:對VTL的字串執行 eval
ResourceTool:國際化支援
SortTool:對collections array iterator進行排序
XMLTool:對xml檔案讀取,需要dom4j的支援
VelocityView
使用velocity快速且乾淨地構建應用程式,可以編寫獨立於特定技術的前臺程式
包含GenericTool,以及為J2EE擴充套件的tool;
有VelocityViewServlet VelocityLayoutServlet VelocityViewTag(
VelocityViewServlet
就是一個servlet,用於向vm檔案的context中插入 request response context物件。
簡單示例
1. 編寫vm檔案作為頁面
<html> <body> I'm a velocity template. #if( $XHTML ) #set( $br = "<br />" ) #else #set( $br = "<br>" ) #end Here we use a custom tool: $toytool.message $br Here we get the date from the DateTool: $date.medium </body> </html>
2. Toolbox.xml
被自動載入到velocity的context
<tools>
<data type="boolean" key="xhtml" value="true"/>
<data type="boolean" key="isSimple" value="true"/>
<data type="number" key="version" value="2.0"/>
<data key="foo">this is foo</data>
<data key="bar">this is bar.</data>
<toolbox scope="request">
<tool key="toytool" class="ToyTool" restrictTo="index*"/>
</toolbox>
<toolbox scope="session">
<tool key="map" class="java.util.HashMap"/>
</toolbox>
</tools>
data用來定義常量, tool獲取session和request中的資料
3. 配置web.xml檔案
<!-- Define Velocity template compiler -->
<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>
org.apache.velocity.tools.view.servlet.VelocityViewServlet
</servlet-class>
<!--
Unless you plan to put your toolbox.xml and velocity.properties
under different folders or give them different names, then these
two init-params are unnecessary as of VelocityTools 1.3. The
VelocityViewServlet will automatically look for these files in
the following locations.
-->
<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>
<!-- Map *.vm files to Velocity -->
<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
4.
訪問頁面
Toolbox
定義request session application範圍的變數或常量資料,可以呼叫該變數的方法,使用方法如下:
PipeWrench.java
public class PipeWrench {
public String getSize() {
return "Large Pipe Wrench!";
}
}
ToolBox.xml
<?xml version="1.0"?>
<toolbox>
<tool>
<key>wrench</key>
<scope>request</scope>
<request-path>/catalog/*</request-path>
<class>PipeWrench</class>
</tool>
</toolbox>
Tool Scope
支援request session application三種scope,用過flex的人應該很熟悉了,application在系統啟動時例項化。 Session在每個會話開始時例項化,request為每個請求
如果tool實現 ViewTool 介面,可在init函式中接收到 context物件。
Request-path
限制哪個path下的內容可以訪問,只支援request
Parameter
可以像tool中傳入引數,需要tool定義public void configure(java.util.Map params)
方法
Data
定義 strings, booleans, and numbers
<?xml version="1.0"?>
<toolbox>
<data type="number">
<key>app_version</key>
<value>0.9</value>
</data>
<data type="string">
<key>app_name</key>
<value>Jon's Tool Shop</value>
</data>
<data type="boolean">
<key>debug</key>
<value>true</value>
</data>
</toolbox>
在vm中 $app_version 訪問
Tools
AbstractSearchTool:進行查詢和分頁,需要實現executeQuery方法
PagerTool:基於request的分頁
BrowserTool:獲取客戶端的瀏覽器、作業系統等相關資訊
CookieTool:Cookie的控制
LinkTool:格式化和組裝超連結,獲取url的相對和絕對路徑
ImportTool:以字串方式匯入 url指定的檔案
ViewRenderTool:使用當前context執行帶VTL的字串,並以字串形式返回結果
VelocityLayoutServlet
是VelocityViewServlet的子類,提供了layout和error的支援,特性如下:
1. 修改web.xml 將VelocityViewServlet替換為VelocityLayoutServlet
2. 定義了layou 的vm
3. 使用content vm和layout vm組合生成頁面,在layout vm中,使用$screen_context引用content vm。
4. 可選定義 “error” template顯示錯誤
配置
在velocity.properties 中配置
# Filepath for error template,
# relative to web application root directory
tools.view.servlet.error.template = Error.vm
# Directory for layout templates,
# relative to web application root directory
tools.view.servlet.layout.directory = layout/
# Filepath of the default layout template
# relative to the layout directory
# NOT relative to the root directory of the webapp!
tools.view.servlet.layout.default.template = Default.vm
動態切換Layout
在url引數中傳入 layout=OtherLayout.vm
在內容頁面vm中定義 #set($layout=”OtherLayout.vm”)
Error Screen
對未捕獲的異常和錯誤處理,有兩個變數 $error_cause和$stack_trace,可以在$error_screen中輸出錯誤資訊
Escaping HTML
通過實現 ReferenceInsertionEventHandler 對引用做字元轉義,在velocity.properties中配置:
eventhandler.referenceinsertion.class = org.apache.velocity.app.event.implement.EscapeHtmlReference
eventhandler.escape.html.match = /msg.*/
VelocityViewTag
是一個jsp tag,允許在jsp中使用velocity和velocity tools,在jsp中使用如下:
<%@taglib prefix="velocity" uri="http://velocity.apache.org/velocity-view" %> <velocity:view template="foo.vm"/>
其他工具
Anakia 是一個用XSL從XML 中輸出檢視的例
Texen:用於產生任意文字的工具,It is capable of producing almost any sort of text output. Driven by Ant, essentially an Ant Task
DocBook Framework:建立適合於online檢視和列印的文字,如PDF和HTML
DVSL:類似於XSLT,完成xml檔案的轉換