目錄java
@(編程)程序員
FreeMarker是一個模板引擎,一個基於模板生成文本輸出的通用工具,使用純Java編寫。它是爲Java程序員提供的一個開發包。它不是面向最終用戶的,而是爲程序員提供的一款能夠嵌入他們所開發產品的應用程序。
FreeMarker被設計用來生成HTML Web頁面,特別是基於MVC模式的應用程序。
雖然FreeMarker具備一些編程的能力,但一般由Java程序準備要顯示的數據,由FreeMarker生成頁面,經過模板顯示準備的數據。
FreeMarker不是一個Web應用框架,而適合做爲Web應用框架一個組件
FreeMarker與容器無關,由於它並不知道HTTP或Servlet;FreeMarker一樣能夠應用於非Web應用程序環境。
FreeMarker更適合做爲Model2框架(如Struts)的視圖組件,你也能夠在模板中使用JSP標記庫
FreeMarker是免費的
並且你還能夠經過Eclipse的插件來編輯FreeMarker,通過驗證,FreeMarker 最好的 Eclipse 編輯插件是 JBoss Tools。web
可以生成各類文本:HTML、XML、RTF、Java源代碼等等
易於嵌入到你的產品中:輕量級;不須要Servlet環境
插件式模板載入器:能夠從任何源載入模板,如本地文件、數據庫等等
你能夠按你所需生成文本:保存到本地文件;做爲Email發送;從Web應用程序發送它返回給Web瀏覽器數據庫
全部經常使用的指令:include、if/elseif/else、循環結構
在模板中建立和改變變量
幾乎在任何地方均可以使用複雜表達式來指定值
命名的宏,能夠具備位置參數和嵌套內容
名字空間有助於創建和維護可重用的宏庫,或者將一個大工程分紅模塊,而沒必要擔憂名字衝突
輸出轉換塊:在嵌套模板片斷生成輸出時,轉換HTML轉義、壓縮、語法高亮等等;你能夠定義本身的轉換編程
FreeMarker不是直接反射到Java對象,Java對象經過插件式對象封裝,以變量方式在模板中顯示
你可使用抽象(接口)方式表示對象(JavaBean、XML文檔、SQL查詢結果集等等),告訴模板開發者使用方法,使其不受技術細節的打擾瀏覽器
在模板語言中內建處理典型Web相關任務(如HTML轉義)的結構
可以集成到Model2 Web應用框架中做爲JSP的替代
支持JSP標記庫
爲MVC模式設計:分離可視化設計和應用程序邏輯;分離頁面設計員和程序員app
字符集智能化(內部使用UNICODE)
數字格式本地化敏感
日期和時間格式本地化敏感
非US字符集能夠用做標識(如變量名)
多種不一樣語言的相同模板框架
<#recurse> 和<#visit>指令(2.3版本)用於遞歸遍歷XML樹
在模板中清楚和直覺的訪問XML對象模型工具
開源論壇 JForum 就是使用了 FreeMarker 作爲頁面模板。測試
使用JSP開發過程當中,在頁面中大量的存在業務邏輯代碼,使得頁面的內容很是混亂,在後期大量的修改維護過程當中就變得很是的困難。
FreeMarker不支持Java腳本代碼,FreeMarker的原理是,模板+數據模型=輸出。模板只負責數據在頁面中的表現,不涉及任何的邏輯代碼,而全部的邏輯都是由數據模型來處理的。用戶最終看到的輸出是模板和數據模型合併後建立的。
在以往的開發中,使用的都是JSP頁面來展現數據的,即所謂的表現層。咱們都知道,JSP在第一次執行的時候須要轉換成Servlet類,開發階段進行功能調試時,須要頻繁的修改JSP,每次修改都要編譯和轉換,那麼試想一下,一天中咱們浪費在程序編譯的時間有多少。
相對於JSP來講,FreeMarker模板技術不存在編譯和轉換的問題,因此就不會存在上述問題。並且開發過程當中,咱們再沒必要等待界面設計開發人員完成頁面原型後,咱們再來開發程序。
並且,一些特定的系統,好比OA工做流系統中,就須要動態生成表單技術,這就爲其提供了很好的實現依據。使得在整個流程的進行中,生成不一樣的表單就簡單了不少。
以往用JSP顯示數據時,一些程序員並不熟悉界面設計技術,反之界面開發人員,也並不熟悉程序語言。對二者而言,交替性的工做自己就有難度。有時候稍有不慎,可能會將整個頁面元素刪除或去掉了某個程序符號,使得頁面走樣或程序錯誤,這樣就須要雙方相互溝通協做,解決出現的問題。有時候由於項目中的時間、任務量等因素的存在,可能這個工做就由一我的來完成,這樣就可能加大某一方開發人員的工做量。
使用FreeMarker後,做爲界面開發人員,只專心建立HTML文件、圖像以及Web頁面的其餘可視化方面,不用理會數據;而程序開發人員則專一於系統實現,負責爲頁面準備要顯示的數據。
使用FreeMarker模板技術,生成靜態的HTML頁面後,若是一旦模板改變,而沒有及時更新模板生成的HTML頁面的話,用戶看到的就是過時的數據。
FreeMarker模板技術在應用過程當中,FreeMarker中的變量必需要賦值,若是不賦值,那麼就會拋出異常。FreeMarker沒有一個默認的null處理,甚至也不接受一個null值。想避免錯誤就要應用if/elseif/else 指令進行判段,若是對每個變量都判斷的話,那麼則反而增長了編程的麻煩。
Map問題,即FreeMarker中不能支持非String的Key值,這樣在進行一些複雜迭代時就須要做一些其餘的轉換,如將一個Map拆分爲兩個或多個Map。
爲了編成的方便性,把序列化的東西都放到了Session中,如Session,request等,在開發的過程當中確實方便,但若是將應用放到集羣中,就會出現錯誤。
package com.demo.index; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; import freemarker.template.Configuration; import freemarker.template.DefaultObjectWrapper; import freemarker.template.Template; import freemarker.template.TemplateException; import freemarker.template.TemplateExceptionHandler; public class TestFreeMarker { public static void main(String[] args) { String dir = "D:/Downloads/jfinal-2.2_demo/jfinal_demo/res"; Configuration cfg = new Configuration(); try { cfg.setDirectoryForTemplateLoading(new File(dir)); cfg.setObjectWrapper(new DefaultObjectWrapper()); cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER); Map root = new HashMap(); root.put("name", "hello,keke"); Template template = cfg.getTemplate("test.ftl"); PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(dir + "/out.txt"))); try { template.process(root, out); } catch (TemplateException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } } }
<span style="font-family:Microsoft YaHei;">個人測試程序:${name}</span>
<span style="font-family:Microsoft YaHei;">個人測試程序:hello,keke</span>