FreeMarker的四種基本數據類型及其序列和哈希表

轉自:FreeMarker的四種基本數據類型及其序列和哈希表          作者:玄玉

這裏分兩塊來說:四種基本數據類型、序列和哈希表

  1. package com.jadyer.util;  
  2.   
  3. import java.io.BufferedWriter;  
  4. import java.io.File;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.OutputStreamWriter;  
  8. import java.io.PrintWriter;  
  9. import java.io.Writer;  
  10. import java.util.Map;  
  11.   
  12. import freemarker.template.Configuration;  
  13. import freemarker.template.Template;  
  14. import freemarker.template.TemplateException;  
  15.   
  16. public class FreeMarkerUtil {  
  17.     /** 
  18.      * 獲取指定目錄下的模板文件 
  19.      * @param name       模板文件的名稱 
  20.      * @param pathPrefix 模板文件的目錄 
  21.      */  
  22.     public Template getTemplate(String name, String pathPrefix) throws IOException{  
  23.         Configuration cfg = new Configuration(); //通過FreeMarker的Configuration對象可以讀取ftl文件  
  24.         cfg.setClassForTemplateLoading(this.getClass(), pathPrefix); //設置模板文件的目錄  
  25.         cfg.setDefaultEncoding("UTF-8");       //Set the default charset of the template files  
  26.         Template temp = cfg.getTemplate(name); //在模板文件目錄中尋找名爲"name"的模板文件  
  27.         return temp; //此時FreeMarker就會到類路徑下的"pathPrefix"文件夾中尋找名爲"name"的模板文件  
  28.     }  
  29.       
  30.     /** 
  31.      * 根據模板文件輸出內容到控制檯 
  32.      * @param name       模板文件的名稱 
  33.      * @param pathPrefix 模板文件的目錄 
  34.      * @param rootMap    模板的數據模型 
  35.      */  
  36.     public void print(String name, String pathPrefix, Map<String,Object> rootMap) throws TemplateException, IOException{  
  37.         this.getTemplate(name, pathPrefix).process(rootMap, new PrintWriter(System.out));  
  38.     }  
  39.       
  40.     /** 
  41.      * 根據模板文件輸出內容到指定的文件中 
  42.      * @param name       模板文件的名稱 
  43.      * @param pathPrefix 模板文件的目錄 
  44.      * @param rootMap    模板的數據模型 
  45.      * @param file       內容的輸出文件 
  46.      */  
  47.     public void printFile(String name, String pathPrefix, Map<String,Object> rootMap, File file) throws TemplateException, IOException{  
  48.         Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));  
  49.         this.getTemplate(name, pathPrefix).process(rootMap, out); //將模板文件內容以UTF-8編碼輸出到相應的流中  
  50.         if(null != out){  
  51.             out.close();  
  52.         }  
  53.     }  
  54. }  

這是位於//src//ftl//包中用於演示四種基本數據類型用法的dataType.ftl
  1. <meta http-equiv="content-type" content="text/html; charset=UTF-8">  
  2.   
  3.   
  4. <#-- 定義變量 -->  
  5. <#assign myname="Jadyer"/>  
  6. ${myname}  
  7.   
  8.   
  9. <#-- 定義數字 -->  
  10. <#assign mynum=10/>  
  11. ${mynum + 20}  
  12.   
  13.   
  14. <#-- 定義字符串 -->  
  15. <#assign mystr="55"/>  
  16. ${mystr + 20}  
  17. <#-- 下面的變量會覆蓋上面定義的同名變量,而不會顧及數據類型是否一致 -->  
  18. <#assign mystr=55/>  
  19. ${mystr + 20}  
  20. <#-- 下面的兩種寫法是等價的,它們連接字符串的方式分別爲:字符串連接方式和插值連接方式 -->  
  21. ${"hello,welcome:" + username}  
  22. ${"hello,welcome:${username}"}  
  23.   
  24.   
  25. <#-- 定義布爾型 -->  
  26. <#-- 如果直接輸出${myflag}則會報錯,因爲FreeMarker不能直接輸出數字或字符串以外的東西,否則都會報錯 -->  
  27. <#-- 此時需要將其轉換爲字符串才能輸出:使用xxx?string可以完成對字符串的轉換。另外??用於判斷變量是否存在 -->  
  28. <#assign myflag=true/>  
  29. ${myflag?string}  
  30. ${myflag?string("isTrue","isFalse")}  
  31. ${(user.name)???string("user.nameIsTrue","user.nameIsFalse")}  
  32.   
  33.   
  34. <#-- 日期類型的處理。如果直接輸出${currTime}則會報錯,此時仍需將其轉換爲字符串 -->  
  35. ${currTime?string("yyyy-MM-dd HH:mm:ss")}  
  36. <#-- 字符串轉換爲日期。注意:這樣輸出${"2012-06-08 22:33:33"?time("HH:mm:ss")}時,會報錯 -->  
  37. <#assign mydate="2012-06-06"?date("yyy-MM-dd")>  
  38. ${mydate}  
  39. ${myTime?date("yyy-MM-dd")}  
  40. ${"2012-06-08 22:33:33"?time("yyy-MM-dd HH:mm:ss")}  
  41. ${"2012-06-09 22:44:44"?datetime("yyy-MM-dd HH:mm:ss")}  
  42.   
  43.   
  44. <#-- HTML的轉換。補充:更多FreeMarker內建函數請參考《FreeMarker2.3.19_Manual_zh_CN.pdf》第四部分 -->  
  45. ${"<br/>"}  
  46. ${"<br/>"?html}  

這是位於//src//ftl//包中用於演示序列和哈希表用法的seqHash.ftl
  1. <meta http-equiv="content-type" content="text/html; charset=UTF-8">  
  2.   
  3.   
  4. <#-- 定義序列 -->  
  5. <#assign mynums=[11,12,13,14,15,16,17,18,19]/>  
  6. <#list mynums as mn>  
  7.     ${mn}  
  8. </#list>  
  9.   
  10.   
  11. <#-- 拆分序列 -->  
  12. <#-- 這裏是將mynums序列中下標從3到6之間的元素拆分出來,組成一個新的序列 -->  
  13. <#assign mynum01=mynums[3..6]/>  
  14. <#list mynum01 as mn01>  
  15.     ${mn01}  
  16. </#list>  
  17.   
  18. <#-- 拆分序列的引申:支持字符串的拆分 -->  
  19. <#-- 比如說博客文章概要時,可以採用這種方式,它要比CSS方便得多 -->  
  20. ${"我本將心向明月,奈何明月照溝渠。"[5..9]}....  
  21.   
  22.   
  23. <#-- 連續序列 -->  
  24. <#-- 從55到58:注意此時若寫成[55..58]或者[66..68]則會報錯 -->  
  25. <#assign num01=55..58/>  
  26. <#list num01 as num>  
  27.     ${num}  
  28. </#list>  
  29. <#list 66..68 as num>  
  30.     ${num}  
  31. </#list>  
  32.   
  33.   
  34.   
  35. <#-- 定義哈希表 -->  
  36. <#-- 注意:FreeMarker中的哈希表要求其key必須是字符串,包括數據模型中的java.util.HashMap的key也要是字符串,否則報錯 -->  
  37. <#assign maps={"1":"張起靈", "2":56, "3":"王胖子"}/>  
  38. ${maps["1"]}  
  39. <#assign users={"username":"jadyer", "password":1234}/>  
  40. ${users.username}----${(users.password)?int}----${users["password"]?string(0)}----${7.5?int}----${7.5?string(0)}  
  41.   
  42.   
  43. <#-- 遍歷哈希表 -->  
  44. <#-- 不能直接用list遍歷map,需要先將map的key轉換爲相應的序列 -->  
  45. <#assign keys=maps?keys/>  
  46. <#list keys as key>  
  47.     ${key}----${maps[key]}  
  48. </#list>  

最後是用JUnit4.x寫的一個測試類FreeMarkerTest.java

  1. package com.jadyer.test;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.util.Date;  
  6. import java.util.HashMap;  
  7. import java.util.Map;  
  8.   
  9. import org.junit.Before;  
  10. import org.junit.Test;  
  11.   
  12. import com.jadyer.util.FreeMarkerUtil;  
  13.   
  14. import freemarker.template.TemplateException;  
  15.   
  16. public class FreeMarkerTest {  
  17.     String pathPrefix;  
  18.     File file;  
  19.     Map<String,Object> rootMap;  
  20.     FreeMarkerUtil fmu;  
  21.       
  22.     @Before  
  23.     public void setUp(){  
  24.         pathPrefix = "/ftl";  
  25.         file = new File("D:\\ftl\\my.html");  
  26.         rootMap = new HashMap<String,Object>();  
  27.         fmu = new FreeMarkerUtil();  
  28.     }  
  29.       
  30.     @Test  
  31.     public void printDateType() throws TemplateException, IOException{  
  32.         rootMap.put("username""張小凡");  
  33.         rootMap.put("currTime"new Date());  
  34.         rootMap.put("myTime""2012-06-07 22:22:22");  
  35.         fmu.print("dataType.ftl", pathPrefix, rootMap);  
  36.         fmu.printFile("dataType.ftl", pathPrefix, rootMap, file);  
  37.     }  
  38.       
  39.     @Test  
  40.     public void printSeqHash() throws TemplateException, IOException{  
  41.         fmu.print("seqHash.ftl", pathPrefix, rootMap);  
  42.         fmu.printFile("seqHash.ftl", pathPrefix, rootMap, file);  
  43.     }  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章