Velocity簡介

 


1.Velocity的使用

  Velocity是一個開放源嗎的模版引擎,由apache.org小組負責開發,現在最新的版本是Velocity1.3.1,http://jakarta.apache.org/velocity/index.html可以瞭解Velocity的最新信息。

  Velocity允許我們在模版中設定變量,然後在運行時,動態的將數據插入到模版中,替換這些變量。

  例如:

  <html>

  <body>HELLO$CUSTOMERNAME</body>

  </html>

  我們可以在運行時得到客戶的名字,然後把它插入到這個模版中替換變量$CUSTOMERNAME,整個替換過程是由Velocity進行控制的,而且java的調用代碼也非常簡單,如我們可以在java代碼中這樣調用

  /***********************************************************/

  //這個文件中設定了Velocity使用的log4j的配置和Velocity的模版文件所在的目錄

  Velocity.init("D://Template//resource//jt.properties");

  //模版文件名,模版文件所在的路徑在上一條語句中已經設置了

  Templatetemplate=Velocity.getTemplate("hello.vm","gb2312");

  //實例化一個Context

  VelocityContextcontext=newVelocityContext();

  //把模版變量的值設置到context中

  context.put("CUSTOMERNAME","MyFirstTemplateEngine----Velocity.");

  //開始模版的替換

  template.merge(context,writer);

  //寫到文件中

  PrintWriterfilewriter=newPrintWriter(newFileOutputStream(outpath),true);

  filewriter.println(writer.toString());

  filewriter.close();

  /***********************************************************/

  這就是整個java的代碼,非常的簡單。如果我們有多個模版變量,我們僅需要把這些模版變量的值設置到context中。

  下面我們簡單的分析一下,Velocity引擎讀取模板文件時,它直接輸出文件中所有的文本,但以$字符開頭的除外,$符號標識着一個模版變量位置,

  context.put("CUSTOMERNAME","MyFirstTemplateEngine----Velocity.");

  當Velocity模板引擎解析並輸出模板的結果時,模板中所有出現$CUSTOMERNAME的地方都將插入客戶的名字,即被加入到VelocityContext的對象的toString()方法返回值將替代Velocity變量(模板中以$開頭的變量)。

  模板引擎中最強大、使用最頻繁的功能之一是它通過內建的映像(Reflection)引擎查找對象信息的能力。這個映像引擎允許用一種方便的Java“.”類似的操作符,提取任意加入到VelocityContext的對象的任何公用方法的值,或對象的任意數據成員。

  映像引擎還帶來了另外一個改進:快速引用JavaBean的屬性。使用JavaBean屬性的時候,我們可以忽略get方法和括號。請看下面這個模板的例子。

  <html>

  <body>

  Name:$Customer.Name()

  Address:$Customer.Address()

  Age:$Customer.Age()

  </body>

  </html>

  java的代碼:

  /***********************************************************/

  //設置客戶信息

  Customermycustomer=newCustomer();

  mycustomer.setName("Velocity");

  mycustomer.setAddress("jakarta.apache.org/velocity/index.html");

  mycustomer.setAge(2);

  //這個文件中設定了Velocity使用的Log4j的配置和Velocity的模版文件所在的目錄Velocity.init("D://Template//resource//jt.properties");

  //模版文件名,模版文件所在的路徑在上一條語句中已經設置了

  Templatetemplate=Velocity.getTemplate("hello.vm","gb2312");

  //實例化一個Context

  VelocityContextcontext=newVelocityContext();

  //把模版變量的值設置到context中

  context.put("Customer",mycustomer);

  //開始模版的替換

  template.merge(context,writer);

  //寫到文件中

  PrintWriterfilewriter=newPrintWriter(newFileOutputStream(outpath),true);

  filewriter.println(writer.toString());

  filewriter.close();

  輸出結果:

  <html>

  <body>

  Name:Velocity

  Address:jakarta.apache.org/velocity/index.html

  Age:2

  </body>

  </html>

  除了替換變量之外,象Velocity高級引擎還能做其他許多事情,它們有用來比較和迭代的內建指令,通過這些指令我們可以完成程序語言中的條件判斷語句和循環語句等。

  例如,我們想要輸出年齡等於2的所有客戶的信息,我們可以這樣定義我們的模版

  模版:

  <html>

  <body>

  <table>

  <tr>

  <td>名稱</td>

  <td>地址</td>

  <td>年齡</td>

  </tr>

  #foreach($Customerin$allCustomer)

  #if($Customer.Age()=="2")

  <tr>

  <td>$Customer.Name()</td>

  <td>$Customer.Address()</td>

  <td>$Customer.Age()</td>

  </tr>

  #end

  #end

  </table>

  </body>

  </html>

  java的代碼:

  /******************************************************/

  //設置客戶信息

  ArrayListallMyCustomer=newArrayList();

  //客戶1

  Customermycustomer1=newCustomer();

  mycustomer1.setName("Velocity");

  mycustomer1.setAddress("jakarta.apache.org/velocity/index.html");

  mycustomer1.setAge(2);

  //客戶2

  Customermycustomer2=newCustomer();

  mycustomer2.setName("Tomcat");

  mycustomer2.setAddress("jakarta.apache.org/tomcat/index.html");

  mycustomer2.setAge(3);

  //客戶3

  Customermycustomer3=newCustomer();

  mycustomer3.setName("Log4J");

  mycustomer3.setAddress("jakarta.apache.org/log4j/docs/index.html");

  mycustomer3.setAge(2);

  //添加到allMyCustomer(ArrayList)中.

  allMyCustomer.add(mycustomer1);

  allMyCustomer.add(mycustomer2);

  allMyCustomer.add(mycustomer3);

  //這個文件中設定了Velocity使用的log4j的配置和Velocity的模版文件所在的目

  Velocity.init("D://Template//resource//jt.properties");

  //模版文件名,模版文件所在的路徑在上一條語句中已經設置了

  Templatetemplate=Velocity.getTemplate("hello.vm","gb2312");

  //實例化一個Context

  VelocityContextcontext=newVelocityContext();

  /**注意這裏我們僅僅需要給一個模版變量負值*/

  context.put("allCustomer",allMyCustomer);

  //開始模版的替換

  template.merge(context,writer);

  //寫到文件中

  PrintWriterfilewriter=newPrintWriter(newFileOutputStream(outpath),true);

  filewriter.println(writer.toString());

  filewriter.close();

  /******************************************************/

  結果:

  <html>

  <body>

  <table>

  <tr>

  <td>名稱</td>

  <td>地址</td>

  <td>年齡</td>

  </tr>

  <tr>

  <td>Velocity</td>

  <td>jakarta.apache.org/velocity/index.html</td>

  <td>2</td>

  </tr>

  <tr>

  <td>Log4J</td>

  <td>jakarta.apache.org/log4j/docs/index.html</td>

  <td>2</td>

  </tr>

  </table>

  </body>

  </html>

  #if語句完成邏輯判斷,這個我想不用多說了。

  allCustomer對象包含零個或者多個Customer對象。由於ArrayList(List,HashMap,HashTable, Iterator,Vector等)屬於JavaCollectionsFramework的一部分,我們可以用#foreach指令迭代其內容。我們不 用擔心如何定型對象的類型——映像引擎會爲我們完成這個任務。#foreach指令的一般格式是“#foreachin”。#foreach指令迭代 list,把list中的每個元素放入item參數,然後解析#foreach塊內的內容。對於list內的每個元素,#foreach塊的內容都會重複 解析一次。從效果上看,它相當於告訴模板引擎說:“把list中的每一個元素依次放入item變量,每次放入一個元素,輸出一次#foreach塊的內 容”。

  2.MVC設計模型

  使用模板引擎最大的好處在於,它分離了代碼(或程序邏輯)和表現(輸出)。由於這種分離,你可以修改程序邏輯而不必擔心郵件消息本身;類似地, 你(或公關部門的職員)可以在不重新編譯程序的情況下,重新編寫客戶列表。實際上,我們分離了系統的數據模式(DataModel,即提供數據的類)、控 制器(Controller,即客戶列表程序)以及視圖(View,即模板)。這種三層體系稱爲Model-View-Controller模型 (MVC)。

  如果遵從MVC模型,代碼分成三個截然不同的層,簡化了軟件開發過程中所有相關人員的工作。

  結合模板引擎使用的數據模式可以是任何Java對象,最好是使用JavaCollectionFramework的對象。控制器只要瞭解模板的環境(如VelocityContext),一般這種環境都很容易使用。

  一些關係數據庫的“對象-關係”映射工具能夠和模板引擎很好地協同,簡化JDBC操作;對於EJB,情形也類似。模板引擎與MVC中視圖這一部 分的關係更爲密切。模板語言的功能很豐富、強大,足以處理所有必需的視圖功能,同時它往往很簡單,不熟悉編程的人也可以使用它。模板語言不僅使得設計者從 過於複雜的編程環境中解脫出來,而且它保護了系統,避免了有意或無意帶來危險的代碼。例如,模板的編寫者不可能編寫出導致無限循環的代碼,或侵佔大量內存 的代碼。不要輕估這些安全機制的價值;大多數模板編寫者不懂得編程,從長遠來看,避免他們接觸複雜的編程環境相當於節省了你自己的時間。許多模板引擎的用 戶相信,在採用模板引擎的方案中,控制器部分和視圖部分的明確分離,再加上模板引擎固有的安全機制,使得模板引擎足以成爲其他內容發佈系統(比如JSP) 的替代方案。因此,Java模板引擎最常見的用途是替代JSP也就不足爲奇了。

  3.HTML處理

  由於人們總是看重模板引擎用來替換JSP的作用,有時他們會忘記模板還有更廣泛的用途。到目前爲止,模板引擎最常見的用途是處理HTMLWeb內容。但我還用模板引擎生成過SQL、email、XML甚至Java源代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章