鷹翔宇空

          學習和生活

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks
          Velocity簡介
          原文引自:http://www.3doing.net/forums/dispbbs.asp?boardID=57&ID=593&page=1

          Velocity是一個開放源嗎的模版引擎,由apache.org小組負責開發,現在最新的版本是Velocity1.3.1
          http://jakarta.apache.org/velocity/index.html 可以了解Velocity的最新信息。
          ????Velocity允許我們在模版中設定變量,然后在運行時,動態的將數據插入到模版中,替換這些變量。
          ????例如:

          1. ????<HTML>
          2. ????????<BODY>
          3. ????????????HELLO $CUSTOMERNAME
          4. ????????</BODY>
          5. ????</HTML>

          ????我們可以在運行時得到客戶的名字,然后把它插入到這個模版中替換變量$CUSTOMERNAME,整個替換過程是由Velocity進行控制的,而且java的調用代碼也非常簡單
          ????如我們可以在java代碼中這樣調用

          1. ????//這個文件中設定了Velocity使用的log4j的配置和Velocity的模版文件所在的目錄
          2. ????Velocity.init("D:\\Template\\resource\\jt.properties");
          3. ????//模版文件名,模版文件所在的路徑在上一條語句中已經設置了
          4. ????Template template =Velocity.getTemplate("hello.vm", "gb2312");??
          5. ????//實例化一個Context
          6. ????VelocityContext context = new VelocityContext();????
          7. ????//把模版變量的值設置到context中
          8. ????context.put("CUSTOMERNAME", "My First Template Engine ---- Velocity.");????????
          9. ????//開始模版的替換
          10. ????template.merge(context, writer);
          11. ????//寫到文件中
          12. ????PrintWriter filewriter = newPrintWriter(newFileOutputStream(outpath),true);
          13. ????filewriter.println(writer.toString());
          14. ????filewriter.close();

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

          1. ????<HTML>
          2. ????????<BODY>
          3. ????????????Name:???????? $Customer.Name()
          4. ????????????Address:????$Customer.Address()
          5. ????????????Age:????????$Customer.Age()
          6. ????????</BODY>
          7. ????</HTML>

          ????java的代碼:????

          1. ????//設置客戶信息
          2. ????Customer mycustomer = new Customer();
          3. ????mycustomer.setName("Velocity");
          4. ????mycustomer.setAddress("jakarta.apache.org/velocity/index.html");
          5. ????mycustomer.setAge(2);
          6. ????
          7. ????//這個文件中設定了Velocity使用的log4j的配置和Velocity的模版文件所在的目錄
          8. ????Velocity.init("D:\\Template\\resource\\jt.properties");
          9. ????//模版文件名,模版文件所在的路徑在上一條語句中已經設置了
          10. ????Template template =Velocity.getTemplate("hello.vm", "gb2312");??
          11. ????//實例化一個Context
          12. ????VelocityContext context = new VelocityContext();????
          13. ????//把模版變量的值設置到context中
          14. ????context.put("Customer", mycustomer);????
          15. ????//開始模版的替換
          16. ????template.merge(context, writer);
          17. ????//寫到文件中
          18. ????PrintWriter filewriter = newPrintWriter(newFileOutputStream(outpath),true);
          19. ????filewriter.println(writer.toString());
          20. ????filewriter.close();

          ????輸出結果:

          1. ????<HTML>
          2. ????????<BODY>
          3. ????????????Name:????????Velocity
          4. ????????????Address:????jakarta.apache.orgvelocityindex.html
          5. ????????????Age:????????2
          6. ????????</BODY>
          7. ????</HTML>

          ????除了替換變量之外,象Velocity高級引擎還能做其他許多事情,它們有用來比較和迭代的內建指令,通過這些指令我們可以完成程序語言中的條件判斷語句和循環語句等
          ????
          ????例如,我們想要輸出年齡等于2的所有客戶的信息,我們可以這樣定義我們的模版
          ????模版:

          1. ????<HTML>
          2. ????????<BODY>
          3. ????????????<table>
          4. ????????????????<tr>
          5. ????????????????????<td>名稱</td><td>地址</td><td>年齡</td>
          6. ????????????????</tr>
          7. ????????????????#foreach ($Customer in $allCustomer)
          8. ????????????????????#if($Customer.Age()=="2")
          9. ????????????????????<tr>
          10. ????????????????????????<td>$Customer.Name()</td>
          11. ????????????????????????<td>$Customer.Address()</td>
          12. ????????????????????????<td>$Customer.Age()</td>
          13. ????????????????????</tr>
          14. ????????????????????#end
          15. ????????????????#end
          16. ????????????</table>
          17. ????????</BODY>
          18. ????</HTML>
          ????

          ????java的代碼:????

          1. ????//設置客戶信息
          2. ????ArrayList allMyCustomer = newArrayList();
          3. ????
          4. ????//客戶1
          5. ????Customer mycustomer1 = new Customer();
          6. ????mycustomer1.setName("Velocity");
          7. ????mycustomer1.setAddress("jakarta.apache.org/velocity/index.html");
          8. ????mycustomer1.setAge(2);
          9. ????
          10. ????//客戶2
          11. ????Customer mycustomer2 = new Customer();
          12. ????mycustomer2.setName("Tomcat");
          13. ????mycustomer2.setAddress("jakarta.apache.org/tomcat/index.html");
          14. ????mycustomer2.setAge(3);
          15. ????
          16. ????//客戶3
          17. ????Customer mycustomer3 = new Customer();
          18. ????mycustomer3.setName("Log4J");
          19. ????mycustomer3.setAddress("jakarta.apache.org/log4j/docs/index.html");
          20. ????mycustomer3.setAge(2);
          21. ????
          22. ????//添加到allMyCustomer(ArrayList)中.
          23. ????allMyCustomer.add(mycustomer1);
          24. ????allMyCustomer.add(mycustomer2);
          25. ????allMyCustomer.add(mycustomer3);
          26. ????
          27. ????//這個文件中設定了Velocity使用的log4j的配置和Velocity的模版文件所在的目錄
          28. ????Velocity.init("D:\\Template\\resource\\jt.properties");
          29. ????//模版文件名,模版文件所在的路徑在上一條語句中已經設置了
          30. ????Template template =Velocity.getTemplate("hello.vm", "gb2312");??
          31. ????//實例化一個Context
          32. ????VelocityContext context = new VelocityContext();????
          33. ????/**
          34. ???? * 注意這里我們僅僅需要給一個模版變量負值
          35. ???? */
          36. ????context.put("allCustomer", allMyCustomer);????
          37. ????//開始模版的替換
          38. ????template.merge(context, writer);
          39. ????//寫到文件中
          40. ????PrintWriter filewriter = newPrintWriter(newFileOutputStream(outpath),true);
          41. ????filewriter.println(writer.toString());
          42. ????filewriter.close();
          ????
          ????結果:

          1. ????<HTML>
          2. ????????<BODY>
          3. ????????????<table>
          4. ????????????????<tr>
          5. ????????????????????<td>名稱</td><td>地址</td><td>年齡</td>
          6. ????????????????</tr>
          7. ????????????????<tr>????????????????
          8. ????????????????????<td>Velocity</td>
          9. ????????????????????<td>jakarta.apache.orgvelocityindex.html</td>
          10. ????????????????????<td>2</td>
          11. ????????????????</tr>
          12. ????????????????<tr>????????????????
          13. ????????????????????<td>Log4J</td>
          14. ????????????????????<td>jakarta.apache.orglog4jdocsindex.html</td>
          15. ????????????????????<td>2</td>
          16. ????????????????</tr>
          17. ????????????</table>
          18. ????????</BODY>
          19. ????</HTML>

          ????#IF語句完成邏輯判斷,這個我想不用多說了。
          ????allCustomer對象包含零個或者多個Customer對象。由于ArrayList(List,HashMap,HashTable,Iterator,Vector等)屬于Java Collections Framework的一部分,我們可以用#foreach指令迭代其內容。我們不用擔心如何定型對象的類型——映像引擎會為我們完成這個任務。#foreach指令的一般格式是“#foreach in ”。#foreach指令迭代list,把list中的每個元素放入item參數,然后解析#foreach塊內的內容。對于list內的每個元素,#foreach塊的內容都會重復解析一次。從效果上看,它相當于告訴模板引擎說:“把list中的每一個元素依次放入item變量,每次放入一個元素,輸出一次#foreach塊的內容”。
          ????
          ????MVC設計模型:
          ????使用模板引擎最大的好處在于,它分離了代碼(或程序邏輯)和表現(輸出)。由于這種分離,你可以修改程序邏輯而不必擔心郵件消息本身;類似地,你(或公關部門的職員)可以在不重新編譯程序的情況下,重新編寫客戶列表。 實際上,我們分離了系統的數據模式(Data Model,即提供數據的類)、控制器(Controller,即客戶列表程序)以及視圖(View,即模板)。這種三層體系稱為Model-View-Controller模型(MVC)。如果遵從MVC模型,代碼分成三個截然不同的層,簡化了軟件開發過程中所有相關人員的工作。 結合模板引擎使用的數據模式可以是任何Java對象,最好是使用Java Collection Framework的對象。控制器只要了解模板的環境(如VelocityContext),一般這種環境都很容易使用。一些關系數據庫的“對象-關系”映射工具能夠和模板引擎很好地協同,簡化JDBC操作;對于EJB,情形也類似。 模板引擎與MVC中視圖這一部分的關系更為密切。模板語言的功能很豐富、強大,足以處理所有必需的視圖功能,同時它往往很簡單,不熟悉編程的人也可以使用它。模板語言不僅使得設計者從過于復雜的編程環境中解脫出來,而且它保護了系統,避免了有意或無意帶來危險的代碼。例如,模板的編寫者不可能編寫出導致無限循環的代碼,或侵占大量內存的代碼。不要輕估這些安全機制的價值;大多數模板編寫者不懂得編程,從長遠來看,避免他們接觸復雜的編程環境相當于節省了你自己的時間。 許多模板引擎的用戶相信,在采用模板引擎的方案中,控制器部分和視圖部分的明確分離,再加上模板引擎固有的安全機制,使得模板引擎足以成為其他內容發布系統(比如JSP)的替代方案。因此,Java模板引擎最常見的用途是替代JSP也就不足為奇了。
          ????HTML處理 :
          ????由于人們總是看重模板引擎用來替換JSP的作用,有時他們會忘記模板還有更廣泛的用途。到目前為止,模板引擎最常見的用途是處理HTML Web內容。但我還用模板引擎生成過SQL、email、XML甚至Java源代碼。
          posted on 2006-05-31 22:03 TrampEagle 閱讀(486) 評論(0)  編輯  收藏 所屬分類: opensource
          主站蜘蛛池模板: 南皮县| 德庆县| 庆城县| 新闻| 山丹县| 永善县| 金沙县| 饶河县| 宁海县| 怀远县| 胶南市| 古丈县| 治县。| 蒙城县| 阳高县| 会东县| 盈江县| 龙南县| 和林格尔县| 太原市| 洛扎县| 文成县| 荆州市| 宝鸡市| 勃利县| 惠来县| 库尔勒市| 吉林省| 永城市| 呈贡县| 屏边| 枣强县| 句容市| 舞钢市| 开封县| 南安市| 东乡县| 时尚| 桐梓县| 抚州市| 新巴尔虎右旗|