不少人看過或了解過Velocity,名稱字面翻譯為:速度、速率、迅速,用在Web開發(fā)里,用過的人可能不多,大都基本知道和在使用Struts,到底Velocity和Struts是如何聯(lián)系,怎么看待Velocity呢?讓我們來嘗試一下,了解Velocity的概念,通過在這里的介紹,強調(diào)在技術(shù)選擇上的問題,讓大家在選擇項目開發(fā)時,可以考慮Velocity,另外也讓大家了解它的思想,究竟它提供了一個很好的思維方式,給大家換換筋骨,換一種思考的方式。
本文基于你對java開發(fā)有一定基礎(chǔ),知道MVC,Struts等開發(fā)模式。
Velocity是一種Java模版引擎技術(shù),該項目由Apache提出,由另外一種引擎技術(shù)Webmacro引深而來。那什么是官方的Velocity定義呢?Apache對它的定義是:一種基于Java的模板引擎,但答應(yīng)任何人使用簡單而強大的模板語言來引用定義在Java代碼中的對象。目前最新的版本是1.4,可以在http://jakarta.apache.org/velocity/index.Html查找更多信息。
其實說白了Velocity也就是MVC架構(gòu)的一種實現(xiàn),但它更多的是關(guān)注在Model和View之間,作為它們的橋梁。對于MVC的最流行架構(gòu)Struts來說,相信大家都不生疏,很多開發(fā)人員已經(jīng)大量在使用Struts架構(gòu),包括IBM的Websphere 5以上的治理平臺版本,Struts技術(shù)很好的實踐了MVC,它有效的減少Java代碼在View(jsp)中的出現(xiàn),但在Model和View之間還是依靠Struts的Taglib技術(shù)來實現(xiàn),試想假如前臺開發(fā)的網(wǎng)頁設(shè)計師對Struts乃至Taglib不熟(相信也挺難熟的,包括后期的維護人員也一樣),將會對網(wǎng)頁設(shè)計師和前臺開發(fā)工程師的相互協(xié)作開發(fā)帶來很大的難度,現(xiàn)實開發(fā)中也還是存在這樣事實,網(wǎng)頁設(shè)計師和前臺開發(fā)之間的工作或多或少還是存在一定的耦合,怎樣最大限度的解決這個難題呢?還是讓我們來看看Velocity或者說這個概念吧。
先做一個最簡單的Velocity開發(fā)例子,讓大家看看Velocity是怎樣工作的:
1、創(chuàng)建1個文件,文件名為:hellovelocity.vm,即velocity模版(其實和html一樣),內(nèi)容:
Welcome $name to Javayou.com!
today is $date.
2、創(chuàng)建1個java文件,HelloVelocity.java,內(nèi)容:
package com.javayou.velocity;
import java.io.StringWriter;
import java.util.*;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
/**
* @author Liang.xf 2004-12-14
*/
public class HelloVelocity {
public static void main(String[] args) throws Exception {
//初始化并取得Velocity引擎
VelocityEngine ve = new VelocityEngine();
ve.init();
//取得velocity的模版
Template t = ve.getTemplate("hellovelocity.vm");
//取得velocity的上下文context
VelocityContext context = new VelocityContext();
//把數(shù)據(jù)填入上下文
context.put("name", "Liang");
context.put("date", (new Date()).toString());
//為后面的展示,提前輸入List數(shù)值
List temp = new ArrayList();
temp.add("1");
temp.add("2");
context.put("list", temp);
//輸出流
StringWriter writer = new StringWriter();
//轉(zhuǎn)換輸出
t.merge(context, writer);
System.out.PRintln(writer.toString());
}
}
3、在http://jakarta.apache.org/site/binindex.cgi上下載Velocity 1.4 zip,解壓后獲取velocity-1.4.jar,用它來編譯上面的類HelloVelocity.java。
4、把1上的hellovelocity.vm copy到運行的當前目錄下,運行HelloVelocity還需要其他類包,可以從下載后的velocity1.4.zip來,//velocity-1.4//build//lib,把commons-collections.jar、logkit-1.0.1.jar引入后運行java -cp .//bin; -Djava.ext.dirs=.//lib2 com.javayou.velocity.HelloVelocity,假設(shè)class編譯到.//bin目錄,而我們所需的類包放到.//lib2目錄內(nèi),運行結(jié)構(gòu)如下:
Welcome Liang to Javayou.com!
today is Tue Dec 14 19:26:37 CST 2004.
以上是最簡單的運行結(jié)果,怎么樣,知道個大概吧,模版hellovelocity.vm里的2個定義變量$name和$date分別被context.put("name", "Liang")和context.put("date", (new Date()).toString())所設(shè)的值替代了。
由此看來業(yè)務(wù)流程處理包括業(yè)務(wù)結(jié)果基本在model這層全部解決,而view這一層基本只用使用簡單的VTL(Velocity Template Language)來展示。這樣,Jsp豈不是不用了么?是的,這樣的使用模式有點象早前的CGI方式:)由Velocity自動輸出代碼,并且Velocity在這方面的能力也很強,Turbine里就采用了Velocity來產(chǎn)生很多代碼。
在Velocity中,變量的定義都是使用“$”開頭的,$作為Velocity的標識符。字母、數(shù)字、中劃和下劃線都可以作為Velocity的定義變量。
此外我們還需要注重的是Velocity特色的變量定義,如:$student.No、$student.Address,它有2層含義:第1種是假如student是hashtable,則將從hashtable中提取key為No和Address的值,另外第2種就是它有可能是調(diào)用方法,即上面2個變量將被轉(zhuǎn)換為student.getNo()和student.getAddress()。Velocity對在servlet中的java code返回的值有對象,還可以調(diào)用對象的方法,如$ student.getAddress()等等,在此就不一一舉例和深入了。
上面的例子只是簡單的舉例,現(xiàn)在當然不少人已經(jīng)不滿足這樣的例子了,實際的應(yīng)用中我們還經(jīng)常需要作些選擇性展示和列舉一些迭代數(shù)據(jù),如List列表,當然Velocity(具體來說應(yīng)該是VTL模版語言)也支持這項功能,此外還支持其他一些常用的展示,如模版內(nèi)部的變量(如Jsp內(nèi)的變量),還有強大一些的如創(chuàng)建宏以實現(xiàn)自動化,讓我們繼續(xù)接著往下看吧。
我們還是使用上面的例子,把模版hellovelocity.vm中的內(nèi)容改為:
#set( $iAmVariable = "good!" )
Welcome $name to Javayou.com!
today is $date.
$iAmVariable
重新執(zhí)行上面的運行命令,結(jié)果:
Welcome Liang to Javayou.com!
today is Tue Dec 14 22:44:39 CST 2004.
good!
可以看得模版中的變量定義為# set開頭的語句,不是很難理解,執(zhí)行后模版中的變量$iAmVariable都轉(zhuǎn)換成定義的值:good!
再來看看簡單的選擇,把模版hellovelocity.vm中的內(nèi)容改為:
#set ($admin = "admin")
#set ($user = "user")
#if ($admin = = $user)
Welcome admin!
#else
Welcome user!
#end
執(zhí)行運行命令,結(jié)果:
Welcome user!
可以看到判定語句只是簡單的#if ()、#else、#end,不是很復(fù)雜。
接著繼續(xù)來看看迭代數(shù)據(jù)吧,把模版hellovelocity.vm中的內(nèi)容改為:
#foreach( $prodUCt in $list )
新聞熱點
疑難解答