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

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

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

    posts - 78,  comments - 48,  trackbacks - 0
    1.Velocity 的使用
    Velocity是一個(gè)開(kāi)放源嗎的模版引擎,由apache.org小組負(fù)責(zé)開(kāi)發(fā),現(xiàn)在最新的版本是Velocity1.3.1,http://jakarta.apache.org/velocity/index.html 可以了解Velocity的最新信息。
    Velocity允許我們?cè)谀0嬷性O(shè)定變量,然后在運(yùn)行時(shí),動(dòng)態(tài)的將數(shù)據(jù)插入到模版中,替換這些變量。
    例如:
    <html>
    <body>HELLO $CUSTOMERNAME</body>
    </html>
    我們可以在運(yùn)行時(shí)得到客戶的名字,然后把它插入到這個(gè)模版中替換變量$CUSTOMERNAME,整個(gè)替換過(guò)程是由Velocity進(jìn)行控制的,而且java的調(diào)用代碼也非常簡(jiǎn)單,如我們可以在java代碼中這樣調(diào)用
    /***********************************************************/
    //這個(gè)文件中設(shè)定了Velocity使用的log4j的配置和Velocity的模版文件所在的目錄
    Velocity.init("D:\\Template\\resource\\jt.properties");
    //模版文件名,模版文件所在的路徑在上一條語(yǔ)句中已經(jīng)設(shè)置了
    Template template = Velocity.getTemplate("hello.vm", "gb2312");
    //實(shí)例化一個(gè)Context
    VelocityContext context = new VelocityContext();
    //把模版變量的值設(shè)置到context中
    context.put("CUSTOMERNAME", "My First Template Engine ---- Velocity.");
    //開(kāi)始模版的替換
    template.merge(context, writer);
    //寫到文件中
    PrintWriter filewriter = new PrintWriter(new FileOutputStream(outpath),true);
    filewriter.println(writer.toString());
    filewriter.close();
    /***********************************************************/

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

    java的代碼:
    /***********************************************************/
    //設(shè)置客戶信息
    Customer mycustomer = new Customer();
    mycustomer.setName("Velocity");
    mycustomer.setAddress("jakarta.apache.org/velocity/index.html");
    mycustomer.setAge(2);
    //這個(gè)文件中設(shè)定了 Velocity 使用的 Log4j 的配置和Velocity的模版文件所在的目錄Velocity.init("D:\\Template\\resource\\jt.properties");
    //模版文件名,模版文件所在的路徑在上一條語(yǔ)句中已經(jīng)設(shè)置了
    Template template = Velocity.getTemplate("hello.vm", "gb2312");
    //實(shí)例化一個(gè)Context
    VelocityContext context = new VelocityContext();
    //把模版變量的值設(shè)置到context中
    context.put("Customer", mycustomer);
    //開(kāi)始模版的替換
    template.merge(context, writer);
    //寫到文件中
    PrintWriter filewriter = new PrintWriter(new FileOutputStream(outpath),true);
    filewriter.println(writer.toString());
    filewriter.close();
    輸出結(jié)果:
    <html>
    <body>
    Name:Velocity
    Address:jakarta.apache.org/velocity/index.html
    Age:2
    </body>
    </html>
    除了替換變量之外,象Velocity高級(jí)引擎還能做其他許多事情,它們有用來(lái)比較和迭代的內(nèi)建指令,通過(guò)這些指令我們可以完成程序語(yǔ)言中的條件判斷語(yǔ)句和循環(huán)語(yǔ)句等。
    例如,我們想要輸出年齡等于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的代碼:
    /******************************************************/
    //設(shè)置客戶信息
    ArrayList allMyCustomer = new ArrayList();
    //客戶1
    Customer mycustomer1 = new Customer();
    mycustomer1.setName("Velocity");
    mycustomer1.setAddress("jakarta.apache.org/velocity/index.html");
    mycustomer1.setAge(2);
    //客戶2
    Customer mycustomer2 = new Customer();
    mycustomer2.setName("Tomcat");
    mycustomer2.setAddress("jakarta.apache.org/tomcat/index.html");
    mycustomer2.setAge(3);
    //客戶3
    Customer mycustomer3 = new Customer();
    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);
    //這個(gè)文件中設(shè)定了Velocity使用的log4j的配置和Velocity的模版文件所在的目
    Velocity.init("D:\\Template\\resource\\jt.properties");
    //模版文件名,模版文件所在的路徑在上一條語(yǔ)句中已經(jīng)設(shè)置了
    Template template =Velocity.getTemplate("hello.vm", "gb2312");
    //實(shí)例化一個(gè)Context
    VelocityContext context = new VelocityContext();
    /** 注意這里我們僅僅需要給一個(gè)模版變量負(fù)值 */
    context.put("allCustomer", allMyCustomer);
    //開(kāi)始模版的替換
    template.merge(context, writer);
    //寫到文件中
    PrintWriter filewriter = new PrintWriter(new FileOutputStream(outpath),true);
    filewriter.println(writer.toString());
    filewriter.close();
    /******************************************************/
    結(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 語(yǔ)句完成邏輯判斷,這個(gè)我想不用多說(shuō)了。
    allCustomer對(duì)象包含零個(gè)或者多個(gè)Customer對(duì)象。由于ArrayList (List, HashMap, HashTable, Iterator, Vector等)屬于Java Collections Framework的一部分,我們可以用#foreach指令迭代其內(nèi)容。我們不用擔(dān)心如何定型對(duì)象的類型——映像引擎會(huì)為我們完成這個(gè)任務(wù)。#foreach指令的一般格式是“#foreach in ”。#foreach指令迭代list,把list中的每個(gè)元素放入item參數(shù),然后解析#foreach塊內(nèi)的內(nèi)容。對(duì)于list內(nèi)的每個(gè)元素,#foreach塊的內(nèi)容都會(huì)重復(fù)解析一次。從效果上看,它相當(dāng)于告訴模板引擎說(shuō):“把list中的每一個(gè)元素依次放入item變量,每次放入一個(gè)元素,輸出一次#foreach塊的內(nèi)容”。

    2.MVC設(shè)計(jì)模型

    使用模板引擎最大的好處在于,它分離了代碼(或程序邏輯)和表現(xiàn)(輸出)。由于這種分離,你可以修改程序邏輯而不必?fù)?dān)心郵件消息本身;類似地,你(或公關(guān)部門的職員)可以在不重新編譯程序的情況下,重新編寫客戶列表。實(shí)際上,我們分離了系統(tǒng)的數(shù)據(jù)模式(Data Model,即提供數(shù)據(jù)的類)、控制器(Controller,即客戶列表程序)以及視圖(View,即模板)。這種三層體系稱為Model-View-Controller模型(MVC)。
    如果遵從MVC模型,代碼分成三個(gè)截然不同的層,簡(jiǎn)化了軟件開(kāi)發(fā)過(guò)程中所有相關(guān)人員的工作。
    結(jié)合模板引擎使用的數(shù)據(jù)模式可以是任何Java對(duì)象,最好是使用Java Collection Framework的對(duì)象。控制器只要了解模板的環(huán)境(如VelocityContext),一般這種環(huán)境都很容易使用。
    一些關(guān)系數(shù)據(jù)庫(kù)的“對(duì)象-關(guān)系”映射工具能夠和模板引擎很好地協(xié)同,簡(jiǎn)化JDBC操作;對(duì)于EJB,情形也類似。 模板引擎與MVC中視圖這一部分的關(guān)系更為密切。模板語(yǔ)言的功能很豐富、強(qiáng)大,足以處理所有必需的視圖功能,同時(shí)它往往很簡(jiǎn)單,不熟悉編程的人也可以使用它。模板語(yǔ)言不僅使得設(shè)計(jì)者從過(guò)于復(fù)雜的編程環(huán)境中解脫出來(lái),而且它保護(hù)了系統(tǒng),避免了有意或無(wú)意帶來(lái)危險(xiǎn)的代碼。例如,模板的編寫者不可能編寫出導(dǎo)致無(wú)限循環(huán)的代碼,或侵占大量?jī)?nèi)存的代碼。不要輕估這些安全機(jī)制的價(jià)值;大多數(shù)模板編寫者不懂得編程,從長(zhǎng)遠(yuǎn)來(lái)看,避免他們接觸復(fù)雜的編程環(huán)境相當(dāng)于節(jié)省了你自己的時(shí)間。 許多模板引擎的用戶相信,在采用模板引擎的方案中,控制器部分和視圖部分的明確分離,再加上模板引擎固有的安全機(jī)制,使得模板引擎足以成為其他內(nèi)容發(fā)布系統(tǒng)(比如JSP)的替代方案。因此,Java模板引擎最常見(jiàn)的用途是替代JSP也就不足為奇了。

    3.HTML處理

    由于人們總是看重模板引擎用來(lái)替換JSP的作用,有時(shí)他們會(huì)忘記模板還有更廣泛的用途。到目前為止,模板引擎最常見(jiàn)的用途是處理HTML Web內(nèi)容。但我還用模板引擎生成過(guò)SQL、email、XML甚至Java源代碼。
        
    posted on 2006-03-13 17:30 黑咖啡 閱讀(258) 評(píng)論(0)  編輯  收藏 所屬分類: Velocity

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    留言簿(2)

    隨筆分類(67)

    文章分類(43)

    Good Article

    Good Blogs

    Open Source

    最新隨筆

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 国产成人无码免费看片软件| 亚洲高清资源在线观看| 免费国产在线观看老王影院| 麻豆精品国产免费观看| 久久WWW免费人成人片| 成人免费大片免费观看网站| 亚洲香蕉免费有线视频| 国产在线观看麻豆91精品免费| 永久看日本大片免费35分钟| 久久精品国产免费观看三人同眠| 精品熟女少妇av免费久久| 最近免费最新高清中文字幕韩国 | 成人亚洲国产va天堂| 亚洲婷婷第一狠人综合精品| 亚洲av无码国产综合专区 | 亚洲自偷自偷在线制服| 亚洲自偷自偷偷色无码中文| 中文字幕精品亚洲无线码二区| 国产亚洲综合网曝门系列| 亚洲AV无码一区东京热| 亚洲视频免费在线看| 亚洲最大福利视频| WWW亚洲色大成网络.COM| 无遮挡a级毛片免费看| 免费国产污网站在线观看| 99热在线免费观看| 韩国免费一级成人毛片| 日日夜夜精品免费视频| 亚洲美女高清一区二区三区 | 国产在线观看免费视频播放器| 亚洲精品无码久久久| 亚洲AV一宅男色影视| 亚洲国产成+人+综合| 久久精品国产亚洲av瑜伽| aa毛片免费全部播放完整| 99在线观看视频免费| 搡女人免费视频大全| 亚洲性在线看高清h片| 亚洲黄色网站视频| 亚洲hairy多毛pics大全| 国内精品99亚洲免费高清|