freemarker簡介
首先我們在學習FreeMarker之前我們首先要了解FreeMarker是做什麼的?FreeMarker是一個模板引擎,一個基於模板生成文本輸出的通用工具,
使用純Java編寫。
FreeMarker被設計用來生成HTML Web頁面,特別是基於MVC模式的
應用程序。雖然FreeMarker具有一些編程的能力,
但通常由Java程序準備要顯示的數據,由FreeMarker生成頁面,通過
模板顯示準備的數據,通俗一點來講,FreeMarker就是一種基於模板的
用來生成輸出文本的通用工具,基於Java的開發包和類庫用來生成輸
出文本的通用工具,基於Java的開發包和類庫。
講了這麼多,那麼FreeMarker到底如何使用,它的優點兒在哪兒,我
們爲什麼要使用它
接下來,根據我這一段時間的學習及在項目中的應用下面對
FreeMarker的認知,做一個簡單的介紹:
1.爲什麼要用freemarker?它的特性有哪些?
特性:
1).分離表現層和業務邏輯 |
使用JSP開發過程中在頁面中大量的存在業務邏輯的代碼,使得頁 面內容凌亂,在後期大量的修改維護過程中就變得非常困難 |
FreeMarker根本不支持Java腳本代碼,而是使用el表達式來輸出展 示數據。FreeMarker的設計初衷就是:。模板+數據模型=輸出, |
模板只負責數據在頁面中的表現,不涉及任何的邏輯代碼,而所有的邏 輯都是由數據模型來處理的。 |
用戶最終看到的輸出是模板和數據模型合併後創建的。 |
2).智能的國際化和本地化 |
字符集智能化(內部使用UNICODE)、數字格式本地化敏感、日期 和時間格式本地化敏感、非US字符集可以用作標識(如變量名) |
多種不同語言的相同模板 |
3).提高開發效率 |
在我們以往的開發中,使用的都是JSP頁面來展示數據的,即所謂的 表現層。我們都知道,JSP在第一次執行的時候需要轉換成Servlet類, |
開發階段進行功能調適時,需要頻繁的修改JSP,每次修改都要編譯和轉 換,那麼試想一天中我們浪費在程序編譯的時間有多少。 |
相對於JSP來說,FreeMarker模板技術不存在編譯和轉換的問題,所以就 不會存在上述問題。而且開發過程中, |
我們在不必在等待界面設計開發人員完成頁面原形後,我們再來開發程序。 |
4). 分工明確 |
以往用JSP展現數據時,程序員並不熟悉界面設計技術,反之界面開發 人員,也並不熟悉程序語言。協調工作很困難 |
使用FreeMarker後,作爲界面開發人員,只專心創建HTML文件、圖像以及 Web頁面的其他可視化方面,不用理會數據; |
而程序開發人員則專注於系統實現,負責爲頁面準備要顯示的數據。 |
首先我們來對Freemarker有一個初略的認識,在這一章中,我們要學會如何寫出 一個簡單但是非常有效的Freemarker模板。 |
|
2.freemarker模板文件組成
①、文本,直接輸出的部分 |
②、註釋,即<#--...-->格式不會輸出 |
③、FTL指令:FreeMarker指令,和HTML標記類似,名字前加#予以區分,不會輸出 |
④、插值(Interpolation):即${..}或者#{..}格式的部分,將使用數據模型中的部分替代輸出 |
FTL指令規則:
FreeMarker有三種FTL標籤,這和HTML的標籤是完全類似的 開始標籤:<#directivename parameters> 結束標籤:</#directivename> 空標籤: <#directivename parameters />
實際上,使用標籤時前面的#符號也可能變成@,如果該指令是一個用戶指令而
不是系統內建指令時,應將#符號改爲@符號。
插值規則:
FreeMarker的插值有如下兩種類型 |
1、通用插值:${expr} |
2、數字格式化插值:#{expr}或者#{expr;format} |
3.表達式:
表達式是FreeMarker的核心功能。表達式放置在插值語法(${...})之中時,
表面需要輸出表達式的值,表達式語法也可以與FreeMarker標籤結合,用於控制輸出
1、直接指定值 a、字符串: ${"我的文件保存在d:\\盤"}; b、數值 c、布爾值 d、日期型FreeMarker支持date、time、datetime三種類型,這三種類型的值無法直接
指定,通常需要藉助字符串的date、time、datetime三個內建函數進行轉換纔可以
<#assigntest1 = "2015-01-22"?date("yyyy-MM-dd")/>; <#assign test2="16:34:43"?time("HH:mm:ss") /> <#assigntest2 = "2015-01-2217:23:45"?datetime("yyyy-MM-dd HH:mm:ss") /> ${test1?string.full} e、集合 集合以方括號包括,各集合元素之間以英文逗號(,)分隔,看如下的示例: <#list["星期一",,["星期二",["星期三",["星期四",["星期五"] as x> ${s}; </#list> f、Map集合Map對象使用花括號包括,Map中的key-value對之間以英文冒號(:)隔開,
多組key-value對之間以英文逗號(,)隔開:
<#assign score = {"語文":78,"數學":83,"Java":89} > <#list score?key as x> ${x}--->${score[x]}; </#list><spanstylespanstyle="font-family:sans-serif,arial,verdana,trebuchet ms;
line-height:1.6em"> </span>
2、輸出變量值FreeMarker的表達式輸出變量時,這些變量可以是頂層變量,也可以是
Map對象中的變量,還可以是集合中的變量,並可以使用點(.)語法來訪問Java對象的屬性
a、頂層變量 Map root = newHashMap(); root.put("name","wenchao");對應頂層變量,直接使用${variableName}來輸出變量值,變量名只能是
數字、字母、下劃線、$、@和#的組合,並不能以數字開頭
b、輸出集合元素如果需要輸出集合元素,則可以根據集合元素的索引來輸出元素。集合元
素的索引以方括號指定。
假設有集合對象爲:["星期一","星期二","星期三","星期四","星期五","星期六"],
該集合對象名爲week,如果需要輸出星期三,則可以使用如下語法:
${week[2]} 集合裏的第一個元素的索引是0 c、輸出Map元素這裏的Map對象可以是直接HashMap的實例,甚至包括JavaBean實例,對
應JavaBean實例,我們一樣可以把其當成屬性爲key,屬性爲value的Map實例
3、空值處理運算符FreeMarker對空值的處理非常嚴格,FreeMarker的變量必須有值,沒有被賦
值的變量就會拋出異常。
4、list、map操作、運算符
4.freemarker常用指令:
1、if指令 <#if(columns?size>10)> <#ifpo_index%2==0> …. </#if> <#else> … </#if> 2、switch、case、default、break指令
雖然FreeMarker提供了switch指令,但它並不推薦使用switch指令來控制也
輸出,而是推薦使用FreeMarker的if..elseif..else指令來替代它。
3、list、break指令list指令時一個典型的迭代輸出指令,用於迭代輸出數據模型中的集合。list指
令的語法格式如下:
<#list sequenceas item> ... </#list> 除此之外,迭代集合對象時,還包括兩個特殊的循環變量: a、item_index:當前變量的索引值。 b、item_has_next:是否存在下一個對象 也可以使用<#break>指令跳出迭代 4、include指令include指令的作用類似於JSP的包含指令,用於包含指定頁,include
指令的語法格式如下
<#include filename [options] 在上面的語法格式中,兩個參數的解釋如下 a、filename:該參數指定被包含的模板文件b、options:該參數可以省略,指定包含時的選項,包含encoding和
parse兩個選項,encoding指定包含頁面時所使用的解碼集,而parse指定被
包含是否作爲FTL文件來解析。如果省略了parse選項值,則該選項值默認是true 5、 import指令該指令用於導入FreeMarker模板中的所有變量,並將該變量放置在指定
的Map對象中,import指令的語法格式如下
<#import path as mapObject>在上面的語法格式中,path指定要被導入的模板文件,而mapObject是
一個Map對象名,通過這行代碼,將導致path模板中的所有變量都被放置
在mapObject中 <#import "/lib/common.ftl"as com> 6、noparse指令noparse指令指定FreeMarker不處理該指令裏包含的內容,該指令
的語法格式如下:
<#noparse> ... </#noparse> 7、assign指令 它用於爲該模板頁面創建或替換一個頂層變量 8、setting指令 該指令用於設置FreeMarker的運行環境,該指令的語法格式如下: <#setting name = value> name的取值範圍包括如下幾個 locale:該選項指定該模板所用的國家/語言選項 number_format:該選項指定格式化輸出數字的格式 boolean_format:該選項指定兩個布爾值的語法格式,默認值是"true、false" date_format,time_format,datetime_format:該選項指定格式化輸出日期的格式 time_zone: 設置格式化輸出日期時所使用的時區 ------------------------------------------------------------------------------------------------------------------------------------------------------ 以上,是簡單的freemaker的使用,通過使用freemaker幫助我們更便捷的開發。