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

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

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

    junctioner

    Velocity之首次研究

        與Velocity的第一次見面,是03年,有個新同事推薦使用,因當時我在做別的項目,也沒怎么仔細了解,簡單的知曉類似如模板一類的東西。之后有過幾次接觸,但,都沒花時間仔細看,前段時間,幫朋友做一個小東西,覺得用個模板做,會省很多事,想到Velocity。東西很小,做完了都沒時間看Velocity,今天正好有時間,研究研究。
        Velocity是apache下的一個開源項目,其網(wǎng)址:http://velocity.apache.org/;下載地址:http://velocity.apache.org/download.cgi,可直接下載源碼,也可通過SVN獲取源碼。
        在eclipse中創(chuàng)建一個web應用工程,把Velocity的源碼拷到java資源目錄下,自動編譯后,報幾個錯,拷貝下載的Velocity源碼lib目錄下的commons-collections-3.1.jar、oro-2.0.8.jar、commons-lang-2.1.jar這個三類包到web應用工程的lib目錄下即可。
        準備就緒,就寫個例子跑跑試試。寫一個hello.vm的模板文件,創(chuàng)建一個對應的Servlet,就可以運行了。兩文件源碼貼出如下:
        hello.vm
    <html>
        
    <body>
        #set($greet = "你好哇!")
            Hello!$name, $greet
        
    </body>
    </html>
        HelloServlet.java
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.util.Hashtable;
    import java.util.Properties;

    import javax.servlet.ServletConfig;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.apache.velocity.Template;
    import org.apache.velocity.app.Velocity;
    import org.apache.velocity.context.Context;
    import org.apache.velocity.servlet.VelocityServlet;

    public class HelloServlet extends VelocityServlet {

        
    protected Properties loadConfiguration(ServletConfig config)
                
    throws IOException, FileNotFoundException {

            Properties p 
    = new Properties();

            String path 
    = config.getServletContext().getRealPath("/");

            
    if (path == null) {
                path 
    = "/";
            }

            p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path);
            p.setProperty(
    "runtime.log", path + "velocity.log");
            p.setProperty(Velocity.INPUT_ENCODING, 
    "GBK");
            p.setProperty(Velocity.OUTPUT_ENCODING, 
    "GBK");
            
    return p;
        }

        
    public Template handleRequest(HttpServletRequest request,
                HttpServletResponse response, Context ctx) {
            Template template 
    = null;
            
    try {
                ctx.put(
    "name","Velocity");
                template 
    = Velocity.getTemplate("/hello.vm");
            } 
    catch (Exception e) {
                e.printStackTrace();
            }
            
    return template;
        }
    }
        創(chuàng)建servelt要注意的幾個地方。
        1、新建的Servlet要擴展Velocity的VelocityServlet
        2、在servlet中要實現(xiàn) public Template handleRequest(HttpServletRequest request,HttpServletResponse response, Context ctx)
           A)把要返回到頁面上的數(shù)據(jù)放到context中對應到指定鍵值(鍵值名為對應模板中定義的變量名)
           B)引入指定模板文件
        3、導入配置文件的方法protected Properties loadConfiguration(ServletConfig config),是否實現(xiàn),是可選的 ,其作用在后面說明。

    發(fā)布運行后,訪問http://localhost:8080/vt/HelloServelt,就可看到結果了。

    運行起來,看到結果,是覺得很簡單,其運行過程,就要跟蹤看源碼才能知道了。

        看源碼,先看的,肯定是VelocityServlet.java。發(fā)現(xiàn)源碼注釋中,這個類已不推薦使用,推薦使用Velocity的一個子項目tool中的VelocityViewServlet.java,我沒有當tool子項目,就先看這個“過時的”實現(xiàn)。
         VelocityServlet.java,擴展了HttpServlet,實現(xiàn)了doGet、doPost、init基本方法,前兩個方法都直接調(diào)用新實現(xiàn)的doRequest方法,這些都是很常規(guī)的操作。
        doRequest方法做如下幾件事:創(chuàng)建上下文、設置響應內(nèi)容文件類型、獲取模板(調(diào)用每個請求中的具體實現(xiàn))、合并數(shù)據(jù)做出響應、出錯處理及資源清理。看到這兒,整個請求和響應過程很清晰,并沒什么特別的處理。
        接下來,看看它的初始化做了些什么事。就做了三件事,超類初始化、自己的初始化、緩存內(nèi)容類型數(shù)據(jù)。自己的初始化,也就是(i)導入配置信息,(ii)根據(jù)配置信息做初始化設置。導入配置信息,是根據(jù)指定的幾個地方,獲取配置數(shù)據(jù)(在提供的樣例中,重載了它的獲取配置數(shù)據(jù)的方法,自己靈活的寫入一些配置信息);根據(jù)配置信息做初始化的工作,應用單例設計模式,保證初始化工作的處理唯一。
        VelocityServlet自已的初始化,調(diào)用另一個類org.apache.velocity.app.Velocity的init( Properties p )方法,就看看Velocity里做了些什么。Velocity里全是靜態(tài)方法。主要有如下幾個方法:
        1、初始化;2、預演傳入的數(shù)據(jù)(發(fā)現(xiàn)在應用中沒有使用,只在單元測試代碼中引用到);3、合并數(shù)據(jù)和模板;4、設置/獲取屬性;5、操作信息提示(不過,都不推薦使用了),整個的看下來,有兩點:1、主要的還是初始化和數(shù)據(jù)合并了;2、這個類只是一個中轉類,所有的方法,最終都是調(diào)另一個類org.apache.velocity.runtime.RuntimeSingleton的方法。
        打開RuntimeSingleton的代碼,看一看,發(fā)現(xiàn)它同Velocity類差不多,類本身不做實際的處理操作。它與Velocity不同的是,它是申明一個靜態(tài)的實例,再調(diào)用這個實例,個別地方(init())加了同步控制。如此處理體現(xiàn)它這個類的名字--單例,核心的還是這個靜態(tài)實例org.apache.velocity.runtime.RuntimeInstance。
        到RuntimeInstance,就開始接觸到Velocity的處理核心了。

        寫到這兒,突然沒有寫下去的沖動了,暫切休息一下。
       
        抽時間看了一下Velocity子項目tool下的VelocityViewServlet的源碼,比VelocityServlet要實現(xiàn)的好多了,與struct接合的比較好。
        Velocity,不僅僅適合于web應用,還可以作生成SQL、XML的模板,內(nèi)容比較多,待一一挖掘。

    posted on 2007-05-30 15:49 junctioner 閱讀(2911) 評論(3)  編輯  收藏 所屬分類: 技術之路

    評論

    # re: Velocity之首次研究 2007-05-30 21:28 yinfei.L

    初次見面覺得比較簡潔輕量級
    用過之后才感覺到是那么的不方便...
    不知道什么時候能夠增加對浮點運算的支持

      回復  更多評論   

    # re: Velocity之首次研究 2007-05-31 09:34 sclsch

    不錯  回復  更多評論   

    # re: Velocity之首次研究 2007-05-31 17:29 killer->

    我想Freemarker是你想要的  回復  更多評論   

    <2007年5月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導航

    統(tǒng)計

    常用鏈接

    留言簿(8)

    隨筆分類

    隨筆檔案

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲熟妇无码八V在线播放| 久久精品亚洲中文字幕无码网站| 亚洲国产品综合人成综合网站| 日本在线免费观看| 亚洲欧洲国产日韩精品| 99精品视频在线免费观看| 亚洲欧洲精品久久| 成年人免费网站在线观看| 亚洲日本中文字幕天天更新| 国产乱子伦精品免费女 | 67194在线午夜亚洲| 亚洲人成电影网站免费| 亚洲av中文无码字幕色不卡| 日本免费一区二区三区最新| 美女裸免费观看网站| 国产午夜亚洲精品午夜鲁丝片 | 久久久无码精品亚洲日韩蜜桃| 亚洲成人免费在线| 亚洲一欧洲中文字幕在线| 岛国大片免费在线观看| 性色av极品无码专区亚洲| 中文字幕中韩乱码亚洲大片| 日本视频免费高清一本18| 久久精品亚洲AV久久久无码| 国产国产人免费视频成69大陆 | 亚洲中文久久精品无码1| 在线免费观看一级片| 成人国产网站v片免费观看 | 免费夜色污私人影院在线观看| A国产一区二区免费入口| 亚洲成人免费在线观看| 国产国产人免费视频成69大陆| 日韩电影免费在线观看网站 | 免费在线观看污网站| 国产一区二区三区免费| 国产成人亚洲综合网站不卡| 亚洲婷婷国产精品电影人久久| 成人片黄网站色大片免费观看APP| 亚洲精品成人av在线| 在线观看免费成人| 免费观看男人吊女人视频|