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 閱讀(2914) 評論(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)

          隨筆分類

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 阿坝| 河间市| 封丘县| 广丰县| 葵青区| 东乡族自治县| 颍上县| 吕梁市| 塘沽区| 黄陵县| 松滋市| 万载县| 宁夏| 屏边| 万州区| 青浦区| 崇州市| 南宫市| 进贤县| 玛沁县| 新沂市| 南丰县| 内江市| 华宁县| 都兰县| 尚义县| 佳木斯市| 上林县| 柯坪县| 武功县| 印江| 玛沁县| 屯门区| 黄陵县| 若尔盖县| 修武县| 鹿泉市| 林芝县| 南城县| 涿州市| 郴州市|