国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Velocity初體驗(yàn)
【摘 要】velocity是一種Java模版引擎技術(shù),該項(xiàng)目由Apache提出,由另外一種引擎技術(shù)Webmacro引深而來。。

不少人看過或了解過Velocity,名稱字面翻譯為:速度、速率、迅速,用在Web開發(fā)里,用過的人可能不多,大都基本知道和在使用Struts,到底Velocity和Struts是如何聯(lián)系,怎么看待Velocity呢?讓我們來嘗試一下,了解Velocity的概念,通過在這里的介紹,強(qiáng)調(diào)在技術(shù)選擇上的問題,讓大家在選擇項(xiàng)目開發(fā)時(shí),可以考慮Velocity,另外也讓大家了解它的思想,畢竟它提供了一個很好的思維方式,給大家換換筋骨,換一種思考的方式。

本文基于你對Java開發(fā)有一定基礎(chǔ),知道MVC,Struts等開發(fā)模式。

Velocity是一種Java模版引擎技術(shù),該項(xiàng)目由Apache提出,由另外一種引擎技術(shù)Webmacro引深而來。那什么是官方的Velocity定義呢?Apache對它的定義是:一種基于Java的模板引擎,但允許任何人使用簡單而強(qiáng)大的模板語言來引用定義在Java代碼中的對象。目前最新的版本是1.4,可以在http://jakarta.apache.org/velocity/index.html查找更多信息。

其實(shí)說白了Velocity也就是MVC架構(gòu)的一種實(shí)現(xiàn),但它更多的是關(guān)注在Model和View之間,作為它們的橋梁。對于MVC的最流行架構(gòu)Struts來說,相信大家都不陌生,很多開發(fā)人員已經(jīng)大量在使用Struts架構(gòu),包括IBM的Websphere 5以上的管理平臺版本,Struts技術(shù)很好的實(shí)踐了MVC,它有效的減少Java代碼在View(Jsp)中的出現(xiàn),但在Model和View之間還是依靠Struts的Taglib技術(shù)來實(shí)現(xiàn),試想如果前臺開發(fā)的網(wǎng)頁設(shè)計(jì)師對Struts乃至Taglib不熟(相信也挺難熟的,包括后期的維護(hù)人員也一樣),將會對網(wǎng)頁設(shè)計(jì)師和前臺開發(fā)工程師的相互協(xié)作開發(fā)帶來很大的難度,現(xiàn)實(shí)開發(fā)中也還是存在這樣事實(shí),網(wǎng)頁設(shè)計(jì)師和前臺開發(fā)之間的工作或多或少還是存在一定的耦合,怎樣最大限度的解決這個難題呢?還是讓我們來看看Velocity或者說這個概念吧。

先做一個最簡單的Velocity開發(fā)例子,讓大家看看Velocity是怎樣工作的:

1、創(chuàng)建1個文件,文件名為:hellovelocity.vm,即velocity模版(其實(shí)和html一樣),內(nèi)容:

<html>

<title>Hello Velocity</title>

<body>

Welcome $name to Javayou.com!

today is $date.

</body>

</html>

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到運(yùn)行的當(dāng)前目錄下,運(yùn)行HelloVelocity還需要其他類包,可以從下載后的velocity1.4.zip來,\\velocity-1.4\\build\\lib,把commons-collections.jar、logkit-1.0.1.jar引入后運(yùn)行java -cp .\\bin; -Djava.ext.dirs=.\\lib2 com.javayou.velocity.HelloVelocity,假設(shè)class編譯到.\\bin目錄,而我們所需的類包放到.\\lib2目錄內(nèi),運(yùn)行結(jié)構(gòu)如下:

<html>

<title>Hello Velocity</title>

<body>

Welcome Liang to Javayou.com!

today is Tue Dec 14 19:26:37 CST 2004.

</body>

</html>

以上是最簡單的運(yùn)行結(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豈不是不用了么?是的,這樣的使用模式有點(diǎn)象早前的CGI方式:)由Velocity自動輸出代碼,并且Velocity在這方面的能力也很強(qiáng),Turbine里就采用了Velocity來產(chǎn)生很多代碼。

在Velocity中,變量的定義都是使用“$”開頭的,$作為Velocity的標(biāo)識符。字母、數(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)在當(dāng)然不少人已經(jīng)不滿足這樣的例子了,實(shí)際的應(yīng)用中我們還常常需要作些選擇性展示和列舉一些迭代數(shù)據(jù),如List列表,當(dāng)然Velocity(具體來說應(yīng)該是VTL模版語言)也支持這項(xiàng)功能,此外還支持其他一些常用的展示,如模版內(nèi)部的變量(如Jsp內(nèi)的變量),還有強(qiáng)大一些的如創(chuàng)建宏以實(shí)現(xiàn)自動化,讓我們繼續(xù)接著往下看吧。

我們還是使用上面的例子,把模版hellovelocity.vm中的內(nèi)容改為:

#set( $iAmVariable = "good!" )

Welcome $name to Javayou.com!

today is $date.

$iAmVariable

重新執(zhí)行上面的運(yùn)行命令,結(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í)行運(yùn)行命令,結(jié)果:

Welcome user!

可以看到判斷語句只是簡單的#if ()、#else、#end,不是很復(fù)雜。

接著繼續(xù)來看看迭代數(shù)據(jù)吧,把模版hellovelocity.vm中的內(nèi)容改為:

#foreach( $product in $list )

<li>$product</li>

#end

執(zhí)行運(yùn)行命令,結(jié)果:

<li>1</li>

<li>2</li>

把在例子中預(yù)先保存在VelocityContext的List中的值列舉了出來,是不是很方便???僅僅只是用了#foreach($variable in xx) 而已,如果上面的List換成Hashtable,則可以用下面的語法:

#foreach($key in $hashVariable.keySet() )

<li> $key ‘s value: $ hashVariable.get($key) </li>

#end

一點(diǎn)不覺得這些腳本很復(fù)雜。

還有不少人還會問,如果是javabean怎么辦?好的,我們增加一個bean:

package com.javayou.velocity;

/**

* @author Liang.xf 2004-12-14

*/

public class Student {

//注意class的屬性是public的

public String no = "";

public String address = "";

public Student(String _no, String _address) {

no = _no;

address = _address;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

public String getNo() {

return no;

}

public void setNo(String no) {

this.no = no;

}

}

這個Student是實(shí)足的javabean,或者說是data bean,常見的用來裝載數(shù)據(jù)的類,然后我們修改HelloVelocity.java,把:

temp.add("1");

temp.add("2");

替換成:

temp.add(new Student("123", "Guangzhou"));

temp.add(new Student("456", "Zhuhai"));

再把hellovelocity.vm的內(nèi)容改為:

#foreach ($s in $students)

<$velocityCount> Address: $s.address

#end

重新編譯和執(zhí)行運(yùn)行命令,結(jié)果如下:

<1> Address: Guangzhou

<2> Address: Zhuhai

這樣把list中Student的數(shù)據(jù)打印了出來,大功告成!這里用了Velocity的內(nèi)建變量$velocityCount,指的是默認(rèn)的列舉序號,從1開始,也可以改成0開始,但需要在Velocity.properties中更改,Velocity.properties位于velocity-1.4.jar包內(nèi)的目錄org\\apache\\velocity\\runtime\\defaults 下。

再復(fù)雜一些的迭代怎么處理呢?我們看看下面的模版例子就清楚了:

#foreach ($element in $list)

-- inner foreach --

#foreach ($element in $list)

This is $element.

$velocityCount

#end

-- inner foreach --

-- outer foreach --

This is $element.

$velocityCount

-- outer foreach --

#end

看出來了吧,Velocity是支持標(biāo)簽嵌套的,這個可是很強(qiáng)大的功能,這里就不深入演示了,如果有興趣,自己試試吧。

其實(shí),稍為深入思考剛剛我們舉的例子,就已經(jīng)可以看出來,Velocity的用處在哪里?即Servlet + Velocity的模式,另外,還記得我們早期Jsp開發(fā)的模式Jsp+JavaBean嗎?在這里,我們更改為Servlet+JavaBean+Velocity,想想,是不是已經(jīng)替代了Jsp+JavaBean,并更徹底的把Java代碼去除在Jsp(vm)外,如果光使用Struts(Servlet+Jsp),那么帶來的代價(jià)是Java代碼總或多或少出現(xiàn)在Jsp上,即使可以做到不出現(xiàn)Java代碼,但做過復(fù)雜架構(gòu)系統(tǒng)的開發(fā)者都知道,代價(jià)也是很昂貴的,并且在可維護(hù)性、和網(wǎng)頁設(shè)計(jì)師的集成開發(fā)上存在一定的困難,所以我們在這里能感覺到,Servlet+JavaBean+Velocity的模式較好的實(shí)現(xiàn)了OOD的概念。而在效率上,大家也不用擔(dān)心,此種結(jié)合方式比Servlet+Jsp的方式要高效一些。

愿意了解Velocity的人應(yīng)該不少,但真正實(shí)用到項(xiàng)目的,也許不多(還是有些項(xiàng)目在使用,如Jute),畢竟和Jsp比起來,Jsp更標(biāo)準(zhǔn)、更廣泛使用和有不少開發(fā)工具已經(jīng)支持Jsp開發(fā)。但Velocity的功能不會僅僅局限在和Jsp競爭的局面,由上可看出它在自動代碼輸出方面功能很強(qiáng),前面提到Turbine就是采用Velocity來生成很多代碼,你也可以稍加改動就可以做成代碼生成器,或其他模版生成上,都是很不錯的想法。

好了,我們再來看看要深入Velocity來做項(xiàng)目,還需要注意的一些常見問題吧,首先是國際化的問題,

Velocity本身支持模版的國際化編碼轉(zhuǎn)換,看看Velocity提供的方法:

Public Template getTemplate (Stirng template, String encoding),

由此推測這樣做其實(shí)不能徹底的做到國際化。

最簡單的在Struts中國際化的概念,即在Jsp上使用國際化語言標(biāo)簽的方式來做到,而每種語言采用不同的語言標(biāo)簽庫的方式,引申到這里,其實(shí)手工來做一樣可以做到,只不過需要稍加手工處理而已。

好在已經(jīng)有人處理了上面所說問題,做成了Velocity的tools: MessageTool,提供了變量text包含國際化標(biāo)簽,這樣只需要簡單的編寫標(biāo)簽代碼即可,如:$text.get(‘title’),更多具體的內(nèi)容還可在http://jakarta.apache.org/velocity/tools/struts/MessageTool.html 中了解。

好了,基于Velocity的介紹我們就說這么多,再說說其他引伸方面的內(nèi)容吧。有人評論Velocity不是標(biāo)準(zhǔn)的MVC結(jié)構(gòu),沒錯,剛開始我們就說過Velocity只是Model和View之間的良好結(jié)合,只是個好的模版引擎,畢竟還沒有形成MVC三者良好的結(jié)合。好在Apache又基于Struts和Velocity的結(jié)合,推出了VelocityStruts,這部分的陳述我們可以在后面的專題里再推出,這里簡單介紹它的概念,它是在Struts的結(jié)構(gòu)上,在業(yè)務(wù)邏輯處理的Action后,把業(yè)務(wù)流程轉(zhuǎn)向基于Velocity的顯示層,從而代替Jsp作為View層。以上我們也看到了所舉的例子基本上只是基于原理和演示,沒有和Web開發(fā)緊密結(jié)合起來,這方面內(nèi)容我們在講述VelocityStruts的內(nèi)容時(shí)再來結(jié)合吧。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Apache java項(xiàng)目全介紹
jetspeed velocity turbine的整合
分享我的大型Java多用戶商城系統(tǒng)開發(fā)的心得和困難
velocity
使用 Velocity 實(shí)現(xiàn)客戶端和服務(wù)器端模板
struts2 strus.xml中result類型及含義
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服