1.Velocity 的使用
Velocity是一個開放源碼的模版引擎,由apache.org小組負責開發(fā),現(xiàn)在最新的版本是Velocity1.4,http://jakarta.apache.org/velocity/index.html 可以了解Velocity的最新信息。
Velocity允許我們在模版中設(shè)定變量,然后在運行時,動態(tài)的將數(shù)據(jù)插入到模版中,替換這些變量。
例如:
<html>
<body>HELLO $CUSTOMERNAME</body>
</html>
我們可以在運行時得到客戶的名字,然后把它插入到這個模版中替換變量$CUSTOMERNAME,整個替換過程是由Velocity進行控制的,而且java的調(diào)用代碼也非常簡單,如我們可以在java代碼中這樣調(diào)用



















這就是整個java的代碼,非常的簡單。如果我們有多個模版變量,我們僅需要把這些模版變量的值設(shè)置到context中。
下面我們簡單的分析一下,Velocity引擎讀取模板文件時,它直接輸出文件中所有的文本,但以$字符開頭的除外,$符號標識著一個模版變量位置,
context.put("CUSTOMERNAME", "My First Template Engine ---- Velocity.");
當 Velocity 模板引擎解析并輸出模板的結(jié)果時,模板中所有出現(xiàn)$CUSTOMERNAME的地方都將插入客戶的名字,即被加入到VelocityContext的對象的toString()方法返回值將替代Velocity變量(模板中以$開頭的變量)。
模板引擎中最強大、使用最頻繁的功能之一是它通過內(nèi)建的映像(Reflection)引擎查找對象信息的能力。這個映像引擎允許用一種方便的Java“.”類似的操作符,提取任意加入到VelocityContext的對象的任何公用方法的值,或?qū)ο蟮娜我鈹?shù)據(jù)成員。
映像引擎還帶來了另外一個改進:快速引用JavaBean的屬性。使用JavaBean屬性的時候,我們可以忽略get方法和括號。請看下面這個模板的例子。
<html>
<body>
Name:$Customer.Name()
Address:$Customer.Address()
Age:$Customer.Age()
</body>
</html>
java的代碼:





















輸出結(jié)果:
<html>
<body>
Name:Velocity
Address:jakarta.apache.org/velocity/index.html
Age:2
</body>
</html>
除了替換變量之外,象Velocity高級引擎還能做其他許多事情,它們有用來比較和迭代的內(nèi)建指令,通過這些指令我們可以完成程序語言中的條件判斷語句和循環(huán)語句等。
例如,我們想要輸出年齡等于2的所有客戶的信息,我們可以這樣定義我們的模版
模版:
<html>
<body>
<table>
<tr>
<td>名稱</td>
<td>地址</td>
<td>年齡</td>
</tr>
#foreach ($Customer in $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的代碼:









































結(jié)果:
<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等)屬于Java Collections Framework的一部分,我們可以用#foreach指令迭代其內(nèi)容。我們不用擔心如何定型對象的類型——映像引擎會為我們完成這個任務。#foreach指令的一般格式是“#foreach in ”。#foreach指令迭代list,把list中的每個元素放入item參數(shù),然后解析#foreach塊內(nèi)的內(nèi)容。對于list內(nèi)的每個元素,#foreach塊的內(nèi)容都會重復解析一次。從效果上看,它相當于告訴模板引擎說:“把list中的每一個元素依次放入item變量,每次放入一個元素,輸出一次#foreach塊的內(nèi)容”。
2.MVC設(shè)計模型
使用模板引擎最大的好處在于,它分離了代碼(或程序邏輯)和表現(xiàn)(輸出)。由于這種分離,你可以修改程序邏輯而不必擔心郵件消息本身;類似地,你(或公關(guān)部門的職員)可以在不重新編譯程序的情況下,重新編寫客戶列表。實際上,我們分離了系統(tǒng)的數(shù)據(jù)模式(Data Model,即提供數(shù)據(jù)的類)、控制器(Controller,即客戶列表程序)以及視圖(View,即模板)。這種三層體系稱為Model-View-Controller模型(MVC)。
如果遵從MVC模型,代碼分成三個截然不同的層,簡化了軟件開發(fā)過程中所有相關(guān)人員的工作。
結(jié)合模板引擎使用的數(shù)據(jù)模式可以是任何Java對象,最好是使用Java Collection Framework的對象。控制器只要了解模板的環(huán)境(如VelocityContext),一般這種環(huán)境都很容易使用。
一些關(guān)系數(shù)據(jù)庫的“對象-關(guān)系”映射工具能夠和模板引擎很好地協(xié)同,簡化JDBC操作;對于EJB,情形也類似。 模板引擎與MVC中視圖這一部分的關(guān)系更為密切。模板語言的功能很豐富、強大,足以處理所有必需的視圖功能,同時它往往很簡單,不熟悉編程的人也可以使用它。模板語言不僅使得設(shè)計者從過于復雜的編程環(huán)境中解脫出來,而且它保護了系統(tǒng),避免了有意或無意帶來危險的代碼。例如,模板的編寫者不可能編寫出導致無限循環(huán)的代碼,或侵占大量內(nèi)存的代碼。不要輕估這些安全機制的價值;大多數(shù)模板編寫者不懂得編程,從長遠來看,避免他們接觸復雜的編程環(huán)境相當于節(jié)省了你自己的時間。 許多模板引擎的用戶相信,在采用模板引擎的方案中,控制器部分和視圖部分的明確分離,再加上模板引擎固有的安全機制,使得模板引擎足以成為其他內(nèi)容發(fā)布系統(tǒng)(比如JSP)的替代方案。因此,Java模板引擎最常見的用途是替代JSP也就不足為奇了。
3.HTML處理
由于人們總是看重模板引擎用來替換JSP的作用,有時他們會忘記模板還有更廣泛的用途。到目前為止,模板引擎最常見的用途是處理HTML Web內(nèi)容。但我還用模板引擎生成過SQL、email、XML甚至Java源代碼。