
【基本介紹】
FreeMarker是一款模板引擎: 即一種基于模板和要改變的數(shù)據(jù), 并用來生成輸出文本(HTML網(wǎng)頁、電子郵件、配置文件、源代碼等)的通用工具。 它不是面向最終用戶的,而是一個(gè)Java類庫,是一款程序員可以嵌入他們所開發(fā)產(chǎn)品的組件。FreeMarker是免費(fèi)的,基于Apache許可證2.0版本發(fā)布。其模板編寫為FreeMarker Template Language(FTL),屬于簡單、專用的語言。需要準(zhǔn)備數(shù)據(jù)在真實(shí)編程語言中來顯示,比如數(shù)據(jù)庫查詢和業(yè)務(wù)運(yùn)算, 之后模板顯示已經(jīng)準(zhǔn)備好的數(shù)據(jù)。在模板中,主要用于如何展現(xiàn)數(shù)據(jù), 而在模板之外注意于要展示什么數(shù)據(jù)。
【軟件特性】
1、通用目標(biāo)能夠生成各種文本:HTML、XML、RTF、Java源代碼等等
易于嵌入到你的產(chǎn)品中:輕量級(jí);不需要Servlet環(huán)境
插件式模板載入器:可以從任何源載入模板,如本地文件、數(shù)據(jù)庫等等
你可以按你所需生成文本:保存到本地文件;作為Email發(fā)送;從Web應(yīng)用程序發(fā)送它返回給Web瀏覽器
2、強(qiáng)大的模板語言
所有常用的指令:include、if/elseif/else、循環(huán)結(jié)構(gòu)
在模板中創(chuàng)建和改變變量
幾乎在任何地方都可以使用復(fù)雜表達(dá)式來指定值
命名的宏,可以具有位置參數(shù)和嵌套內(nèi)容
名字空間有助于建立和維護(hù)可重用的宏庫,或者將一個(gè)大工程分成模塊,而不必?fù)?dān)心名字沖突
輸出轉(zhuǎn)換塊:在嵌套模板片段生成輸出時(shí),轉(zhuǎn)換HTML轉(zhuǎn)義、壓縮、語法高亮等等;你可以定義自己的轉(zhuǎn)換
3、通用數(shù)據(jù)模型
FreeMarker不是直接反射到Java對(duì)象,Java對(duì)象通過插件式對(duì)象封裝,以變量方式在模板中顯示
你可以使用抽象(接口)方式表示對(duì)象(JavaBean、XML文檔、SQL查詢結(jié)果集等等),告訴模板開發(fā)者使用方法,使其不受技術(shù)細(xì)節(jié)的打擾
4、為Web準(zhǔn)備
在模板語言中內(nèi)建處理典型Web相關(guān)任務(wù)(如HTML轉(zhuǎn)義)的結(jié)構(gòu)
能夠集成到Model2 Web應(yīng)用框架中作為JSP的替代
支持JSP標(biāo)記庫
為MVC模式設(shè)計(jì):分離可視化設(shè)計(jì)和應(yīng)用程序邏輯;分離頁面設(shè)計(jì)員和程序員
5、智能的國際化和本地化
字符集智能化(內(nèi)部使用UNICODE)
數(shù)字格式本地化敏感
日期和時(shí)間格式本地化敏感
非US字符集可以用作標(biāo)識(shí)(如變量名)
多種不同語言的相同模板
6、強(qiáng)大的XML處理能力
<#recurse> 和<#visit>指令(2.3版本)用于遞歸遍歷XML樹
在模板中清楚和直覺的訪問XML對(duì)象模型
開源論壇 JForum 就是使用了 FreeMarker 做為頁面模板。
【工作原理】
假設(shè)在一個(gè)應(yīng)用系統(tǒng)中需要一個(gè)HTML頁面如下:
頁面中的用戶名(即上面的“Big Joe”)是登錄這個(gè)網(wǎng)頁的訪問者的名字, 并且最新產(chǎn)品的數(shù)據(jù)應(yīng)該來自于數(shù)據(jù)庫才能隨時(shí)更新。所以,不能直接在HTML頁面中輸入“Big Joe”、“greenmouse”及鏈接, 不能使用靜態(tài)HTML代碼。可以使用要求輸出的模板來解決,模板和靜態(tài)頁面是相同的,只是它會(huì)包含一些FreeMarker將它們變成動(dòng)態(tài)內(nèi)容的指令:

模板文件存放在Web服務(wù)器上,當(dāng)有人來訪問這個(gè)頁面,F(xiàn)reeMarker就會(huì)介入執(zhí)行,然后動(dòng)態(tài)轉(zhuǎn)換模板,用最新的數(shù)據(jù)內(nèi)容替換模板中${...}的部分,之后將結(jié)果發(fā)送到訪問者的Web瀏覽器中。訪問者的Web瀏覽器就會(huì)接收到例如第一個(gè)HTML示例那樣的內(nèi)容(也就是沒有FreeMarker指令的HTML代碼),訪問者也不會(huì)察覺到服務(wù)器端使用的FreeMarker。(存儲(chǔ)在Web服務(wù)器端的模板文件是不會(huì)被修改的;替換也僅僅出現(xiàn)在Web服務(wù)器的響應(yīng)中。)
為模板準(zhǔn)備的數(shù)據(jù)整體被稱作為數(shù)據(jù)模型。數(shù)據(jù)模型是樹形結(jié)構(gòu)(就像硬盤上的文件夾和文件),在視覺效果上, 數(shù)據(jù)模型可以是(這只是一個(gè)形象化顯示,數(shù)據(jù)模型不是文本格式,它來自于Java對(duì)象):

早期版本中,可以從數(shù)據(jù)模型中選取這些值,使用user和latestProduct.name表達(dá)式即可。類比于硬盤的樹形結(jié)構(gòu),數(shù)據(jù)模型就像一個(gè)文件系統(tǒng),“(root)”和latestProduct就對(duì)應(yīng)著目錄(文件夾),而user、url和name就是這些目錄中的文件。
總體上,模板和數(shù)據(jù)模型是FreeMarker來生成輸出所必須的組成部分:模板 + 數(shù)據(jù)模型 = 輸出

【使用教程】
這里通過模擬簡單的代碼自動(dòng)生產(chǎn)工具來感受第一個(gè)FreeMarker程序。項(xiàng)目目錄結(jié)構(gòu)
806956-20171029173200820-322396228.png
項(xiàng)目創(chuàng)建流程
第一步:創(chuàng)建一個(gè)maven項(xiàng)目導(dǎo)入 FreeMarker jar 包
第二步:創(chuàng)建目錄templates,并創(chuàng)建一個(gè) FreeMarker模版文件 hello.ftl
第三步:創(chuàng)建一個(gè)運(yùn)行FreeMarker模版引擎的 FreeMarkerDemo.java 文件
第四步:運(yùn)行main方法后刷新項(xiàng)目
pom.xml 文件 ,maven 項(xiàng)目核心文件,管理 jar 包。
【使用教程】
語法詳解數(shù)據(jù)類型
和java不同,F(xiàn)reeMarker不需要定義變量的類型,直接賦值即可。
字符串: value = "xxxx" 。如果有特殊字符 string = r"xxxx" 。單引號(hào)和雙引號(hào)是一樣的。
數(shù)值:value = 1.2。數(shù)值可以直接等于,但是不能用科學(xué)計(jì)數(shù)法。
布爾值:true or false。
List集合:list = [1,2,3] ; list=[1..100] 表示 1 到 100 的集合,反之亦然。
Map集合:map = {"key" : "value" , "key2" : "value2"},key 必須是字符串哦!
實(shí)體類:和EL表達(dá)式差不多,直接點(diǎn)出來。
字符串操作
字符串連接:可以直接嵌套${"hello , ${name}"} ; 也可以用加號(hào)${"hello , " + name}
字符串截?。簊tring[index]。index 可以是一個(gè)值,也可以是形如 0..2 表示下標(biāo)從0開始,到下標(biāo)為2結(jié)束。一共是三個(gè)數(shù)。
比較運(yùn)算符
== (等于),!= (不等于),gt(大于),gte(大于或者等于),lt(小于),lte(小于或者等于)。不建議用 >,< 可能會(huì)報(bào)錯(cuò)!
一般和 if 配合使用
內(nèi)建函數(shù)
FreeMarker 提供了一些內(nèi)建函數(shù)來轉(zhuǎn)換輸出,其結(jié)構(gòu):變量?內(nèi)建函數(shù),這樣就可以通過內(nèi)建函數(shù)來轉(zhuǎn)換輸出變量。
html: 對(duì)字符串進(jìn)行HTML編碼;
cap_first: 使字符串第一個(gè)字母大寫;
lower_case: 將字符串轉(zhuǎn)成小寫;
upper_case: 將字符串轉(zhuǎn)成大寫;
size: 獲得集合中元素的個(gè)數(shù);
int: 取得數(shù)字的整數(shù)部分。
變量空判斷
! 指定缺失變量的默認(rèn)值;一般配置變量輸出使用
?? 判斷變量是否存在。一般配合if使用 <#if value??></#if>
宏指令
可以理解為java的封裝方法,供其他地方使用。宏指令也稱為自定義指令,macro指令
語法很簡單:<#macro val > 聲明macro </#macro>; 使用macro <@val />
命名空間
可以理解為java的import語句,為避免變量重復(fù)。一個(gè)重要的規(guī)則就是:路徑不應(yīng)該包含大寫字母,使用下劃線_分隔詞語,myName --> my_name
語法很簡單:<#import "xxx.ftl" as val>
其他沒有說明的語法是因?yàn)楹蚸ava一樣,沒什么特別之處。所以沒有列出來。
【使用方法】
FreeMarker與JSP比較在java領(lǐng)域,表現(xiàn)層技術(shù)主要有三種:jsp、freemarker、velocity。
jsp是大家最熟悉的技術(shù)
優(yōu)點(diǎn):
1、功能強(qiáng)大,可以寫java代碼
2、支持jsp標(biāo)簽(jsp tag)
3、支持表達(dá)式語言(el)
4、官方標(biāo)準(zhǔn),用戶群廣,豐富的第三方j(luò)sp標(biāo)簽庫
5、性能良好。jsp編譯成class文件執(zhí)行,有很好的性能表現(xiàn)
缺點(diǎn):
jsp沒有明顯缺點(diǎn),非要挑點(diǎn)骨頭那就是,由于可以編寫java代碼,如使用不當(dāng)容易破壞mvc結(jié)構(gòu)。
velocity是較早出現(xiàn)的用于代替jsp的模板語言
優(yōu)點(diǎn):
1、不能編寫java代碼,可以實(shí)現(xiàn)嚴(yán)格的mvc分離
2、性能良好,據(jù)說比jsp性能還要好些
3、使用表達(dá)式語言,據(jù)說jsp的表達(dá)式語言就是學(xué)velocity的
缺點(diǎn):
1、不是官方標(biāo)準(zhǔn)
2、用戶群體和第三方標(biāo)簽庫沒有jsp多。
3、對(duì)jsp標(biāo)簽支持不夠好
freemarker
優(yōu)點(diǎn):
1、不能編寫java代碼,可以實(shí)現(xiàn)嚴(yán)格的mvc分離
2、性能非常不錯(cuò)
3、對(duì)jsp標(biāo)簽支持良好
4、內(nèi)置大量常用功能,使用非常方便
5、宏定義(類似jsp標(biāo)簽)非常方便
6、使用表達(dá)式語言
缺點(diǎn):
1、不是官方標(biāo)準(zhǔn)
2、用戶群體和第三方標(biāo)簽庫沒有jsp多
選擇freemarker的原因:
1、性能。velocity應(yīng)該是最好的,其次是jsp,普通的頁面freemarker性能最差(雖然只是幾毫秒到十幾毫秒的差距)。但是在復(fù)雜頁面上(包含大量判斷、日期金額格式化)的頁面上,freemarker的性能比使用tag和el的jsp好。
2、宏定義比jsp tag方便
3、內(nèi)置大量常用功能。比如html過濾,日期金額格式化等等,使用非常方便
4、支持jsp標(biāo)簽
5、可以實(shí)現(xiàn)嚴(yán)格的mvc分離


































