<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    hengheng123456789

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      297 Posts :: 68 Stories :: 144 Comments :: 0 Trackbacks
     

    Velocity Beginning

     

    作者: ahlie

     

    Velocity,名稱(chēng)字面翻譯為:速度、速率、迅速,用在Web開(kāi)發(fā)里,用過(guò)的人可能不多,大都基本知道和在使用Struts,到底VelocityStruts(TaglibTiles)是如何聯(lián)系?在技術(shù)上Velocity要比Struts Struts(TaglibTiles)先進(jìn),單從技術(shù)上考慮可以考慮Velocity;而Struts用的非常普遍,這樣的人才也很多,所以對(duì)于公司來(lái)說(shuō),選擇Struts的人才容易點(diǎn)。畢竟Velocity提供了一個(gè)很好的思維方式,給大家換了一種思考的方式。

     

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

     

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

     

    下面是一個(gè)簡(jiǎn)單的Velocity例子:

     

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

     

    <html>

    <title>Hello Velocity</title>

    <body>

    Welcome $name to Javayou.com!

    today is $date.

    </body>

    </html>

     

    2、創(chuàng)建java文件,HelloVelocity.java

     

    package com.fasttalk. velocity;

    import java.io.StringWriter;

    import java.util.*;

    import org.apache.velocity.app.VelocityEngine;

    import org.apache.velocity.Template;

    import org.apache.velocity.VelocityContext;

     

    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());

    }

    }

     

    http://jakarta.apache.org/site/binindex.cgi上下載Velocity 1.4 zip

     

    4、把1上的hellovelocity.vm copy到運(yùn)行的當(dāng)前目錄下,運(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>

     

    以上是最簡(jiǎn)單的運(yùn)行結(jié)果,怎么樣,知道個(gè)大概吧,模版hellovelocity.vm里的2個(gè)定義變量$name$date分別被context.put("name", "Liang")context.put("date", (new Date()).toString())所設(shè)的值替代了。

     

    由此看來(lái)業(yè)務(wù)流程處理包括業(yè)務(wù)結(jié)果基本在model這層全部解決,而view這一層基本只用使用簡(jiǎn)單的VTLVelocity Template Language)來(lái)展示。這樣,Jsp豈不是不用了么?是的,這樣的使用模式有點(diǎn)象早前的CGI方式:)由Velocity自動(dòng)輸出代碼,并且Velocity在這方面的能力也很強(qiáng),Turbine里就采用了Velocity來(lái)產(chǎn)生很多代碼。

     

    Velocity中,變量的定義都是使用“$”開(kāi)頭的,$作為Velocity的標(biāo)識(shí)符。字母、數(shù)字、中劃和下劃線(xiàn)都可以作為Velocity的定義變量。

     

    還需要注意的是Velocity特色的變量定義,如:$student.No、$student.Address,它有2層含義:

     

    l       1種是如果studenthashtable,則將從hashtable中提取keyNoAddress的值,

     

    l       另外第2種就是它有可能是調(diào)用方法,即上面2個(gè)變量將被轉(zhuǎn)換為student.getNo()student.getAddress()。

     

    Velocity對(duì)在servlet中的java code返回的值有對(duì)象,還可以調(diào)用對(duì)象的方法,如$ student.getAddress()等等,在此就不一一舉例和深入了。

     

    上面的例子只是簡(jiǎn)單的舉例,現(xiàn)在當(dāng)然不少人已經(jīng)不滿(mǎn)足這樣的例子了,實(shí)際的應(yīng)用中我們還常常需要作些選擇性展示和列舉一些迭代數(shù)據(jù),如List列表,當(dāng)然Velocity(具體來(lái)說(shuō)應(yīng)該是VTL模版語(yǔ)言)也支持這項(xiàng)功能,此外還支持其他一些常用的展示,如模版內(nèi)部的變量(如Jsp內(nèi)的變量),還有強(qiáng)大一些的如創(chuàng)建宏以實(shí)現(xiàn)自動(dòng)化,讓我們繼續(xù)接著往下看吧。

     

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

     

    #set( $iAmVariable = "good!" )

    Welcome $name to csdn.net!

    today is $date.

    $iAmVariable

     

    重新執(zhí)行上面的運(yùn)行命令,結(jié)果:

     

    Welcome Liang to csdn.net!

    today is Tue Dec 14 22:44:39 CST 2004.

    good!

     

    可以看得模版中的變量定義為# set開(kāi)頭的語(yǔ)句,不是很難理解,執(zhí)行后模版中的變量$iAmVariable都轉(zhuǎn)換成定義的值:good!

     

    再來(lái)看看簡(jiǎn)單的選擇,把模版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!

     

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

     

    接著繼續(xù)來(lái)看看迭代數(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ù)先保存在VelocityContextList中的值列舉了出來(lái),是不是很方便啊??jī)H僅只是用了#foreach$variable in xx 而已,如果上面的List換成Hashtable,則可以用下面的語(yǔ)法:

     

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

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

    #end

     

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

     

    還有不少人還會(huì)問(wèn),如果是javabean怎么辦?好的,我們?cè)黾右粋€(gè)bean

     

    package com.fasttalk.velocity;

     

    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;

    }

    }

     

    這個(gè)Student是實(shí)足的javabean,或者說(shuō)是data bean,常見(jiàn)的用來(lái)裝載數(shù)據(jù)的類(lèi),然后我們修改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

     

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

     

    再?gòu)?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

     

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

     

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

     

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

     

    好了,我們?cè)賮?lái)看看要深入Velocity來(lái)做項(xiàng)目,還需要注意的一些常見(jiàn)問(wèn)題吧,首先是國(guó)際化的問(wèn)題,

     

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

     

    Public Template getTemplate (Stirng template, String encoding),

     

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

     

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

     

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

     

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

     

    談到Velocity,在這里要順便提提FreeMarker,FreeMarker也是一種模版引擎,和Velocity功能基本類(lèi)似,都是簡(jiǎn)單和輕量級(jí)的工具,但功能上較Velocity有不少增強(qiáng)的地方,這我們也在以后再來(lái)深入了解吧。

    posted on 2007-05-29 18:09 哼哼 閱讀(283) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): JAVA-Common
    主站蜘蛛池模板: 亚洲一级黄色视频| 99热这里有免费国产精品| 偷自拍亚洲视频在线观看| 亚洲国产激情在线一区| 精品亚洲成A人无码成A在线观看 | AV免费网址在线观看| 国产精品久久久久久久久免费| 免费看男女下面日出水来| 蜜臀98精品国产免费观看| 免费观看国产网址你懂的| 性xxxxx免费视频播放| 日韩吃奶摸下AA片免费观看 | aa级毛片毛片免费观看久| 国产一区二区三区免费观看在线| 日韩成人免费视频| 最近免费中文字幕大全免费版视频| 91麻豆最新在线人成免费观看| 噼里啪啦电影在线观看免费高清| 全免费a级毛片免费**视频| 四虎永久免费观看| 久久久精品国产亚洲成人满18免费网站 | 无码国产精品一区二区免费3p| 99免费视频观看| 99在线视频免费观看视频| 女人18毛片a级毛片免费| 男人的天堂亚洲一区二区三区 | 在线成人a毛片免费播放| 国产青草视频免费观看97| 亚洲伊人久久成综合人影院| 国产AV无码专区亚洲精品| 亚洲最新中文字幕| 亚洲AV日韩综合一区| 久久国产免费直播| 91大神在线免费观看| 免费观看a级毛片| 最新亚洲成av人免费看| 99久久亚洲精品无码毛片| 亚洲色大成网站www| xvideos永久免费入口| 在线人成精品免费视频| 午夜高清免费在线观看|