1.什麼是 FreeMarker? html
FreeMarker是一個模板引擎,一個基於模板生成文本輸出的通用工具,使用純Java編寫。FreeMarker被設計用來生成HTMLWeb頁面,特別是基於MVC模式的應用程序。程序員
所謂模板,就是一份已經寫好了基本內容,有着固定格式的文檔,其中空出或者用佔位符標識的內容,由使用者來填充,不一樣的使用者給出的數據是不一樣的。在模板中的佔位符,在模板運行時,由模板引擎來解析模板,並採用動態數據替換佔位符部分的內容。數據庫
FreeMarker不是一個Web應用框架,而適合做爲Web應用框架一個組件,FreeMarker與Web容器無關,即在Web運行時,它並不知道Servlet或HTTP。它不只能夠用做表現層的實現技術,並且還能夠用於生成XML,JSP或Java文件等。編程
雖然FreeMarker具備一些編程的能力,但一般由Java程序準備要顯示的數據,由FreeMarker生成頁面,經過模板顯示準備的數據(以下圖)瀏覽器
2.FreeMake的優勢服務器
分離表現層和業務邏輯框架
使用 JSP 開發過程當中在頁面中大量的存在業務邏輯的代碼,使得頁面內容凌亂,在後期大量的修改維護過程當中就變得很是困難。 FreeMarker 根本不支持 Java 腳本代碼,而是使用 el 表達式來輸出展現數據。 FreeMarker 的設計初衷就是: 模板 + 數據模型 = 輸出 ,模板只負責數據在頁面中的表現,不涉及任何的邏輯代碼,而全部的邏輯都是由數據模型來處理的。用戶最終看到的輸出是模板和數據模型合併後建立的。工具
提升開發效率spa
在咱們以往的開發中,使用的都是 JSP 頁面來展現數據的,即所謂的表現層。咱們都知道, JSP 在第一次執行的時候須要轉換成 Servlet 類,開發階段進行功能調適時,須要頻繁的修改 JSP ,每次修改都要編譯和轉換,那麼試想一天中咱們浪費在程序編譯的時間有多少。相對於 JSP 來講, FreeMarker 模板技術不存在編譯和轉換的問題,因此就不會存在上述問題。並且開發過程當中,咱們在沒必要在等待界面設計開發人員完成頁面原形後,咱們再來開發程序。插件
分工明確
以往用JSP展示數據時,程序員並不熟悉界面設計技術,反之界面開發人員,也並不熟悉程序語言。協調工做很困難,使用FreeMarker後,做爲界面開發人員,只專心建立HTML文件、圖像以及Web頁面的其餘可視化方面,不用理會數據;而程序開發人員則專一於系統實現,負責爲頁面準備要顯示的數據。
3.FreeMarker的缺點
1.FreeMarker的缺點一,應用FreeMarker模板技術,在修改模板後,可能會看到已通過期的數據。如:生成靜態的HTML頁面後,若是一旦模板改變,而沒有及時更新模板生成的HTML頁面的話,用戶看到的就是過時的數據。
2.FreeMarker的缺點二,FreeMarker模板技術在應用過程當中,FreeMarker中的變量必需要賦值,若是不賦值,那麼就會拋出異常。想避免錯誤就要應用if/elseif/else 指令進行判段,若是對每個變量都判斷的話,那麼則反而增長了編程的麻煩。
3.FreeMarker的缺點三,FreeMarker的map限定key必須是string,其餘數據類型沒法操做。
4.FreeMarker的缺點四,FreeMarker不支持集羣應用。爲了編成的方便性,把序列化的東西都放到了Session中,如Session,request等,在開發的過程當中確實方便,但若是將應用放到集羣中,就會出現錯誤。
4.FreeMarker特性
一、通用目標
可以生成各類文本:HTML、XML、RTF、Java源代碼等等
易於嵌入到你的產品中:輕量級;不須要Servlet環境
插件式模板載入器:能夠從任何源載入模板,如本地文件、數據庫等等
你能夠按你所需生成文本:保存到本地文件;做爲Email發送;從Web應用程序發送它返回給Web瀏覽器
二、強大的模板語言
全部經常使用的指令:include、if/elseif/else、循環結構
在模板中建立和改變變量
幾乎在任何地方均可以使用複雜表達式來指定值
命名的宏,能夠具備位置參數和嵌套內容
名字空間有助於創建和維護可重用的宏庫,或者將一個大工程分紅模塊,而沒必要擔憂名字衝突
輸出轉換塊:在嵌套模板片斷生成輸出時,轉換HTML轉義、壓縮、語法高亮等等;你能夠定義本身的轉換
三、通用數據模型
FreeMarker不是直接反射到Java對象,Java對象經過插件式對象封裝,以變量方式在模板中顯示
你可使用抽象(接口)方式表示對象(JavaBean、XML文檔、SQL查詢結果集等等),告訴模板開發者使用方法,使其不受技術細節的打擾
四、爲Web準備
在模板語言中內建處理典型Web相關任務(如HTML轉義)的結構
可以集成到Model2 Web應用框架中做爲JSP的替代
支持JSP標記庫
爲MVC模式設計:分離可視化設計和應用程序邏輯;分離頁面設計員和程序員
五、智能的國際化和本地化
字符集智能化(內部使用UNICODE)
數字格式本地化敏感
日期和時間格式本地化敏感
非US字符集能夠用做標識(如變量名)
多種不一樣語言的相同模板
六、強大的XML處理能力
<#recurse> 和<#visit>指令(2.3版本)用於遞歸遍歷XML樹
在模板中清楚和直覺的訪問XML對象模型
開源論壇 JForum 就是使用了 FreeMarker 作爲頁面模板。
5.Freemarker生成靜態頁面的原理
Freemarker 生成靜態頁面,首先須要使用本身定義的模板頁面,這個模板頁面能夠是最最普通的html,也能夠是嵌套freemarker中的 取值表達式, 標籤或者自定義標籤等等,而後後臺讀取這個模板頁面,解析其中的標籤完成相對應的操做, 而後採用鍵值對的方式傳遞參數替換模板中的的取值表達式,作完以後 根據配置的路徑生成一個新的html頁面, 以達到靜態化訪問的目的。
6.Freemarker提供的標籤
Freemarker提供了不少有用 經常使用的標籤,Freemarker標籤都是<#標籤名稱>這樣子命名的,${value} 表示輸出變量名的內容 ,具體以下:
一、list:該標籤主要是進行迭代服務器端傳遞過來的List集合,好比:
names是list循環的時候取的一個循環變量,freemarker在解析list標籤的時候,等價於:
二、if:該標籤主要是作if判斷用的,好比:
這個是條件判斷標籤,要注意的是條件等式必須用括號括起來, 等價於:
三、include:該標籤用於導入文件用的。
這個導入標籤很是好用,特別是頁面的重用。
另外在靜態文件中可使用${} 獲取值,取值方式和el表達式同樣,很是方便。