1. 程式人生 > >模板工具(二)——VelocityTools

模板工具(二)——VelocityTools

應該算是Velocity的擴充套件,為了Velocity更好用。包括GenericTools  VelocityView  VelocityStruts三個子專案,其中VelocityStruts是為了與struts整合服務,此處不介紹。

GenericTools

j2se提供tools使用,具體tools如下:

         DateTool:  Date操作:格式化、比較等

         EscapeTool:對template進行escaping

         IteratorTool:更好地控制 #foreach loop

         ListTool:透明地處理array

list

         MathTool:數學運算

         NumberTool:對數字格式化和convert

         RenderTool:對VTL的字串執行 eval

         ResourceTool:國際化支援

         SortTool:對collections array iterator進行排序

         XMLTool:對xml檔案讀取,需要dom4j的支援

VelocityView

使用velocity快速且乾淨地構建應用程式,可以編寫獨立於特定技術的前臺程式

包含GenericTool,以及為J2EE擴充套件的tool;

VelocityViewServlet  VelocityLayoutServlet  VelocityViewTag(

嵌入velocityjsp)  Maven plugin

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

被自動載入到velocitycontext

<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獲取sessionrequest中的資料

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:獲取客戶端的瀏覽器、作業系統等相關資訊

         CookieToolCookie的控制

         LinkTool:格式化和組裝超連結,獲取url的相對和絕對路徑

ImportTool:以字串方式匯入 url指定的檔案

ViewRenderTool:使用當前context執行帶VTL的字串,並以字串形式返回結果

VelocityLayoutServlet

VelocityViewServlet的子類,提供了layouterror的支援,特性如下:

1.       修改web.xml VelocityViewServlet替換為VelocityLayoutServlet

2.       定義了layou vm

3.       使用content vmlayout 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中使用velocityvelocity tools,在jsp中使用如下:

       <%@taglib prefix="velocity" uri="http://velocity.apache.org/velocity-view" %> <velocity:view template="foo.vm"/>

其他工具

        Anakia 是一個用XSLXML 中輸出檢視的例

        Texen:用於產生任意文字的工具,It is capable of producing almost any sort of text output. Driven by Ant, essentially an Ant Task

         DocBook Framework:建立適合於online檢視和列印的文字,如PDFHTML

         DVSL:類似於XSLT,完成xml檔案的轉換