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,就可看到結(jié)果了。

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

              看源碼,先看的,肯定是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、這個類只是一個中轉(zhuǎn)類,所有的方法,最終都是調(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 閱讀(2914) 評論(3)  編輯  收藏 所屬分類: 技術(shù)之路

          評論

          # 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)

          隨筆分類

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 南和县| 调兵山市| 土默特左旗| 太原市| 临颍县| 浦县| 环江| 宽甸| 聂荣县| 崇左市| 枣阳市| 修水县| 五大连池市| 金湖县| 孟连| 南召县| 建平县| 陆丰市| 安泽县| 当阳市| 武川县| 西城区| 德兴市| 高州市| 凤翔县| 澜沧| 辽宁省| 建阳市| 信宜市| 崇仁县| 佛山市| 济源市| 十堰市| 衢州市| 肇东市| 兴隆县| 阿拉尔市| 施秉县| 瑞昌市| 新余市| 乌兰浩特市|