Java模板引擎 FreeMarker

目錄java

@(編程)程序員

1. 簡介

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

2. FreeMarker特性

2.1. 通用目標

可以生成各類文本:HTML、XML、RTF、Java源代碼等等
易於嵌入到你的產品中:輕量級;不須要Servlet環境
插件式模板載入器:能夠從任何源載入模板,如本地文件、數據庫等等
你能夠按你所需生成文本:保存到本地文件;做爲Email發送;從Web應用程序發送它返回給Web瀏覽器數據庫

2.2. 強大的模板語言

全部經常使用的指令:include、if/elseif/else、循環結構
在模板中建立和改變變量
幾乎在任何地方均可以使用複雜表達式來指定值
命名的宏,能夠具備位置參數和嵌套內容
名字空間有助於創建和維護可重用的宏庫,或者將一個大工程分紅模塊,而沒必要擔憂名字衝突
輸出轉換塊:在嵌套模板片斷生成輸出時,轉換HTML轉義、壓縮、語法高亮等等;你能夠定義本身的轉換編程

2.3. 通用數據模型

FreeMarker不是直接反射到Java對象,Java對象經過插件式對象封裝,以變量方式在模板中顯示
你可使用抽象(接口)方式表示對象(JavaBean、XML文檔、SQL查詢結果集等等),告訴模板開發者使用方法,使其不受技術細節的打擾瀏覽器

2.4. 爲Web準備

在模板語言中內建處理典型Web相關任務(如HTML轉義)的結構
可以集成到Model2 Web應用框架中做爲JSP的替代
支持JSP標記庫
爲MVC模式設計:分離可視化設計和應用程序邏輯;分離頁面設計員和程序員app

2.5. 智能的國際化和本地化

字符集智能化(內部使用UNICODE)
數字格式本地化敏感
日期和時間格式本地化敏感
非US字符集能夠用做標識(如變量名)
多種不一樣語言的相同模板框架

2.6. 強大的XML處理能力

<#recurse> 和<#visit>指令(2.3版本)用於遞歸遍歷XML樹
在模板中清楚和直覺的訪問XML對象模型工具

開源論壇 JForum 就是使用了 FreeMarker 作爲頁面模板。測試

3. 優點與不足

3.1. 優點
能夠完全的分離表現層和業務邏輯

使用JSP開發過程當中,在頁面中大量的存在業務邏輯代碼,使得頁面的內容很是混亂,在後期大量的修改維護過程當中就變得很是的困難。

FreeMarker不支持Java腳本代碼,FreeMarker的原理是,模板+數據模型=輸出。模板只負責數據在頁面中的表現,不涉及任何的邏輯代碼,而全部的邏輯都是由數據模型來處理的。用戶最終看到的輸出是模板和數據模型合併後建立的。

能夠提升開發效率

在以往的開發中,使用的都是JSP頁面來展現數據的,即所謂的表現層。咱們都知道,JSP在第一次執行的時候須要轉換成Servlet類,開發階段進行功能調試時,須要頻繁的修改JSP,每次修改都要編譯和轉換,那麼試想一下,一天中咱們浪費在程序編譯的時間有多少。

相對於JSP來講,FreeMarker模板技術不存在編譯和轉換的問題,因此就不會存在上述問題。並且開發過程當中,咱們再沒必要等待界面設計開發人員完成頁面原型後,咱們再來開發程序。

並且,一些特定的系統,好比OA工做流系統中,就須要動態生成表單技術,這就爲其提供了很好的實現依據。使得在整個流程的進行中,生成不一樣的表單就簡單了不少。

使得開發過程當中的人員分工更加明確

以往用JSP顯示數據時,一些程序員並不熟悉界面設計技術,反之界面開發人員,也並不熟悉程序語言。對二者而言,交替性的工做自己就有難度。有時候稍有不慎,可能會將整個頁面元素刪除或去掉了某個程序符號,使得頁面走樣或程序錯誤,這樣就須要雙方相互溝通協做,解決出現的問題。有時候由於項目中的時間、任務量等因素的存在,可能這個工做就由一我的來完成,這樣就可能加大某一方開發人員的工做量。

使用FreeMarker後,做爲界面開發人員,只專心建立HTML文件、圖像以及Web頁面的其餘可視化方面,不用理會數據;而程序開發人員則專一於系統實現,負責爲頁面準備要顯示的數據。

3.2. 不足
在修改模板後,可能會看到已通過期的數據

使用FreeMarker模板技術,生成靜態的HTML頁面後,若是一旦模板改變,而沒有及時更新模板生成的HTML頁面的話,用戶看到的就是過時的數據。

FreeMarker的變量必須有值

FreeMarker模板技術在應用過程當中,FreeMarker中的變量必需要賦值,若是不賦值,那麼就會拋出異常。FreeMarker沒有一個默認的null處理,甚至也不接受一個null值。想避免錯誤就要應用if/elseif/else 指令進行判段,若是對每個變量都判斷的話,那麼則反而增長了編程的麻煩。

FreeMarker的Map限定Key必須是String,其餘數據類型沒法操做

Map問題,即FreeMarker中不能支持非String的Key值,這樣在進行一些複雜迭代時就須要做一些其餘的轉換,如將一個Map拆分爲兩個或多個Map。

FreeMarker不支持集羣應用

爲了編成的方便性,把序列化的東西都放到了Session中,如Session,request等,在開發的過程當中確實方便,但若是將應用放到集羣中,就會出現錯誤。

4. 代碼示例

4.1. java代碼
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();
        }
    }
}
4.2. 模板代碼
<span style="font-family:Microsoft YaHei;">個人測試程序:${name}</span>
4.3. 輸出
<span style="font-family:Microsoft YaHei;">個人測試程序:hello,keke</span>
相關文章
相關標籤/搜索