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完成頁面的靜態化: