<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下的一個開源項目,其網址:http://velocity.apache.org/;下載地址:http://velocity.apache.org/download.cgi,可直接下載源碼,也可通過SVN獲取源碼。
        在eclipse中創建一個web應用工程,把Velocity的源碼拷到java資源目錄下,自動編譯后,報幾個錯,拷貝下載的Velocity源碼lib目錄下的commons-collections-3.1.jar、oro-2.0.8.jar、commons-lang-2.1.jar這個三類包到web應用工程的lib目錄下即可。
        準備就緒,就寫個例子跑跑試試。寫一個hello.vm的模板文件,創建一個對應的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;
        }
    }
        創建servelt要注意的幾個地方。
        1、新建的Servlet要擴展Velocity的VelocityServlet
        2、在servlet中要實現 public Template handleRequest(HttpServletRequest request,HttpServletResponse response, Context ctx)
           A)把要返回到頁面上的數據放到context中對應到指定鍵值(鍵值名為對應模板中定義的變量名)
           B)引入指定模板文件
        3、導入配置文件的方法protected Properties loadConfiguration(ServletConfig config),是否實現,是可選的 ,其作用在后面說明。

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

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

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

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

    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

    導航

    統計

    常用鏈接

    留言簿(8)

    隨筆分類

    隨筆檔案

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲美国产亚洲AV| 国产亚洲人成网站观看| 久久精品国产亚洲AV久| 最近新韩国日本免费观看| 亚洲日本乱码一区二区在线二产线 | 亚洲视频国产视频| 国产一级理论免费版| 亚洲黄网在线观看| 99在线精品免费视频九九视| 精品亚洲成A人在线观看青青| 91免费人成网站在线观看18| 亚洲国产精品免费在线观看| 成视频年人黄网站免费视频| 国产精品亚洲一区二区麻豆| 国产大片线上免费看| 国产精品免费久久| 亚洲高清在线视频| 69av免费视频| 自拍偷自拍亚洲精品偷一| 久久久久亚洲AV综合波多野结衣| 最近免费字幕中文大全| 内射干少妇亚洲69XXX| 丁香花在线观看免费观看| 特级aaaaaaaaa毛片免费视频| 亚洲一区精品伊人久久伊人| 免费无码又爽又刺激高潮软件| 亚洲第一成年网站大全亚洲| 国产精品成人免费一区二区| 免费人人潮人人爽一区二区| 亚洲AV中文无码字幕色三| A在线观看免费网站大全| 性生大片视频免费观看一级| 久久精品夜色国产亚洲av| 免费无码又黄又爽又刺激| yellow视频免费在线观看| 亚洲最大在线视频| 国产一区二区三区免费在线观看 | 4hu四虎最新免费地址| 视频一区在线免费观看| 亚洲av丰满熟妇在线播放| 日韩免费a级在线观看|