1. 程式人生 > >Freemarker模板引擎的使用總結(一)

Freemarker模板引擎的使用總結(一)



1. FreeMarker模板引擎的使用: 模板 + 資料模型 = 輸出
  1) FreeMarker模板:一個普通文字檔案,其中使用了一些FreeMarker的特別標記。
  2) 資料模型:存放了資料的資料結構,通常是一個Hash儲存結構(如:HashMap)
  3) FreeMarker框架負責將一個數據模型中的資料合併到模板中,從而生成輸出。
 
2. 配置使用環境: 下載(http://www.freemarker.org/)並把freemarker-2.x.x.jar新增到應用程式的classpath下。

3. Java應用:
   1) 建立資料模型: Map<String, Object> root = new HashMap<String,Object>();
   2) 建立模板檔案: templates/first.ftl
   3) 合併:
//建立一個Configuration例項來初始freeMarker的配置 //在classpath下新增一個名為freemarker.properties
Configuration cfg = new Configuration();
//設定模板檔案的存放目錄
cfg.setDirectoryForTemplateLoading(new File("templates"));
//載入指定的模板
Template t = cfg.getTemplate("first.ftl");
//處理合並
t.process(root, new OutputStreamWriter(System.out));

4. web應用中直接使用FreeMarker: 在Servlet的請求處理方法中:
//建立一個Configuration例項來初始freeMarker的配置
Configuration cfg = new Configuration();
//設定模板檔案的存放目錄
cfg.setServletContextForTemplateLoading(getServletContext(),"/templates");
//載入指定的模板
Template t = cfg.getTemplate("first.ftl", "UTF-8");
//處理合並
t.process(root, response.getWriter());

5. FTL(FreeMarker模板語言)語法:

1) 模板檔案由4部分組成:
   a) 文字:直接輸出的部分
   b) 註釋:<#--  註釋內容 -->  不會輸出
   c) 插值(interpolation):${表示式} 或 #{表示式} ,將使用資料模型中的資料替換後再輸出
   d) FTL指令:
       內建(預定義)指令:<#指令名 屬性名="值">主體</#指令名>  如:<#if user??>${user.loginname}</#if>
       自定義指令: <@指令名 屬性名="值">主體</@指令名>

2) 插值規則
 a) 表示式放置在插值語法${}之中,用於輸出表達式的值。
 b) 表示式的值的型別可以是:字串、 數字、布林、日期時間、序列、Hash結構
 c) 表示式支援Java中的所有運算子:
     算術運算子:+、-、*、/、%
     比較運算子:==(eq)、!=(ne)、>(gt)、>=(gte)、<(lt)、<=(lte)
     邏輯運算子:&&(and)、||(or)、!(not)
     三目運算子:? :

 d) 內建函式:
    Ⅰ) 使用方式:表示式?函式名[(實參)]
    Ⅱ) 字串的常用內建函式: substring(from[, to])、html、length、trim、url
            示例:<#setting url_escaping_charset="UTF-8"> 、exp?url[("UTF-8")]
    Ⅲ) 數字的常用內建函式:c、string[(數字模式串)]、
    Ⅳ) 布林的內建函式:string[("男", "女")]
    Ⅴ) 內建的常用日期時間函式:string[("格式模式串")]、datetime、date、time
 e) 序列:
         在FTL中定義的序列:由方括號包括,各元素用英文逗號分隔如:<#assign seq=["winter", "spring", "summer",  "autumn"]>
         也可以用數字範圍(遞增、反遞增)定義數字序列: <#assign nums=101..105>  或 <#assign nums=105..101>
         在資料模型中:可以是List物件、Set物件
         序列的常用內建函式:size、sort[("指定欄位作排序依據")]
 f) Hash結構:
         在FTL檔案中直接定義時:由大括號包括,由逗號分隔鍵/值列表,鍵和值之間用冒號分隔。鍵必須是字串。

           如: <#assign scores={"語文":78, "數學":89, "英語":87}> ${scores.語文}
         在資料模型中:可以是Map物件
         Hash結構的內建函式:size、keys、values

3) FreeMarker中的空值判斷
  a) 判斷是否為空值:用??(?if_exists,?exists) 如果不為空返回true,否則返回false。
  b) 通過Configuration設定:Configuration cfg = new Configuration(); cfg.setClassicCompatible(true);
  c) 屬性配置方式:在freemarker.properties檔案中classic_compatible=true
  d) 通過ftl設定:在ftl檔案頭前加入<#setting classic_compatible=true>
  e) 在FTL中遍歷序列、Hash結構時:<#if userList??><#list userList as user>....</#list></#if>
 
4) 常用內建指令:
  a) if/else
<#if condition>
  ...
<#elseif condition2>
  ...
<#elseif condition3>
  ...
...
<#else>
  ...
</#if>

  b) switch/case
<#switch value>
  <#case refValue1>
    ...
    <#break>
  <#case refValue2>
    ...
    <#break>
  ...
  <#case refValueN>
    ...
    <#break>
  <#default>
    ...
</#switch>

  c) list
<#list sequence as item>  <#-- item_index 當前迭代項的索引 -->
    ...
</#list>

  d) include 包含指定檔案。類似於JSP中的include標準動作
<#include "檔案路徑" [encoding="charset"] [parse=true|false]>

  e) import 匯入指定模板中的所有變數。
<#import "檔案路徑"  as hash>
 
  f) noparse 不處理該指令中包含的內容
<#noparse>
  …
</#noparse>

  g) assign: 為當前模板頁面建立或替換一個頂層變數
<#assign name=value>
<#assign name1=value1 name2=value2 ... nameN=valueN>

  h) global:建立或替換一個名稱空間全域性範圍作用域的頂層變數
  i) local:建立或替換一個區域性作用域的頂層變數
  j)setting 設定FreeMarker執行時的屬性.語法:<#setting name=value> 
    name常用的有:
       locale:該模板所使用的語言環境選項。en,zh,zh_CN,zh_TW
       number_format:數字格式化輸出的格式
       boolean_format:布林值格式化輸出的格式
       date_format,time_format,datetime_format:日期時間格式化輸出的格式
       time_zone:格式化輸出日期時間所使用的時區。
       url_escaping_charset:URL編碼的字符集。

  k) 自定義指令:<#macro 指令名 屬性名...>...</#macro>

6. Web應用中整合FreeMarker:FreeMarker提供了FreemarkerServlet類來整合模板到Web應用中:
  1) 這個Servlet在資料模型中放置了三個Hash結構:
      Request, Session, Application,分別用來訪問請求,會話,應用上下文中的屬性。
      訪問作用域中的屬性時,沒有指定Hash結構名,它會依次按Request,Session,Application順序搜尋。
  2) 它還提供了一個名為RequestParameters的Hash結構,用來訪問HTTP請求中的引數資料。
 
7. Struts2中整合FreeMarker: Struts2預設就是使用FreeMarker來產生所有UI標籤的HTML標記。
  1) 提供了FreeMarkerResult來支援FTL頁面。
     <result type="freemarker">/templates/info.ftl</result>
  2) FreeMarker針對Struts2提供了以下內建Hash結構:
     a) stack: 代表ValueStack本身

     b) action: 代表剛剛執行過的Action例項
     c) response: 代表HpptServletResponse例項
     d) res: 代表HpptServletResponse例項
     e) request: 代表HpptServletRequest例項
     f) req: 代表HpptServletRequest例項
     g) session: 代表HpptSession例項
     h) application: 代表ServletContext例項
     i) base: 代表使用者請求的上下文路徑

8. 使用FreeMarker完成頁面的靜態化: