FreeMaker教程(一)-----FreeMaker簡介
1.什麼是 FreeMarker?
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的設計初衷就是:模板+資料模型=輸出,模板只負責資料在頁面中的表現,不涉及任何的邏輯程式碼,而所有的邏輯都是由資料模型來處理的。使用者最終看到的輸出是模板和資料模型合併後建立的。
提高開發效率
在我們以往的開發中,使用的都是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特性
1、通用目標
能夠生成各種文字:HTML、XML、RTF、Java原始碼等等
易於嵌入到你的產品中:輕量級;不需要Servlet環境
外掛式模板載入器:可以從任何源載入模板,如本地檔案、資料庫等等
你可以按你所需生成文字:儲存到本地檔案;作為Email傳送;從Web應用程式傳送它返回給Web瀏覽器
2、強大的模板語言
所有常用的指令:include、if/elseif/else、迴圈結構
在模板中建立和改變變數
幾乎在任何地方都可以使用複雜表示式來指定值
命名的巨集,可以具有位置引數和巢狀內容
名字空間有助於建立和維護可重用的巨集庫,或者將一個大工程分成模組,而不必擔心名字衝突
輸出轉換塊:在巢狀模板片段生成輸出時,轉換HTML轉義、壓縮、語法高亮等等;你可以定義自己的轉換
3、通用資料模型
FreeMarker不是直接反射到Java物件,Java物件通過外掛式物件封裝,以變數方式在模板中顯示
你可以使用抽象(介面)方式表示物件(JavaBean、XML文件、SQL查詢結果集等等),告訴模板開發者使用方法,使其不受技術細節的打擾
4、為Web準備
在模板語言中內建處理典型Web相關任務(如HTML轉義)的結構
能夠整合到Model2 Web應用框架中作為JSP的替代
支援JSP標記庫
為MVC模式設計:分離視覺化設計和應用程式邏輯;分離頁面設計員和程式設計師
5、智慧的國際化和本地化
字符集智慧化(內部使用UNICODE)
數字格式本地化敏感
日期和時間格式本地化敏感
非US字符集可以用作標識(如變數名)
多種不同語言的相同模板
6、強大的XML處理能力
<#recurse> 和<#visit>指令(2.3版本)用於遞迴遍歷XML樹
在模板中清楚和直覺的訪問XML物件模型
開源論壇 JForum 就是使用了 FreeMarker 做為頁面模板。
5.Freemarker生成靜態頁面的原理
Freemarker 生成靜態頁面,首先需要使用自己定義的模板頁面,這個模板頁面可以是最最普通的html,也可以是巢狀freemarker中的 取值表示式, 標籤或者自定義標籤等等,然後後臺讀取這個模板頁面,解析其中的標籤完成相對應的操作, 然後採用鍵值對的方式傳遞引數替換模板中的的取值表示式,做完之後 根據配置的路徑生成一個新的html頁面, 以達到靜態化訪問的目的。
6.Freemarker提供的標籤
Freemarker提供了很多有用 常用的標籤,Freemarker標籤都是<#標籤名稱>這樣子命名的,${value} 表示輸出變數名的內容 ,具體如下:
1、list:該標籤主要是進行迭代伺服器端傳遞過來的List集合,比如:
<#list nameList as names>
${names}
</#list>
names是list迴圈的時候取的一個迴圈變數,freemarker在解析list標籤的時候,等價於:
for (String names : nameList) {
System.out.println(names);
}
2、if:該標籤主要是做if判斷用的,比如:
<#if (names=="陳靖仇")>
他的武器是: 十五~~
</#if>
這個是條件判斷標籤,要注意的是條件等式必須用括號括起來, 等價於:
if(names.equals("陳靖仇")){
System.out.println("他的武器是: 十五~~");
}
3、include:該標籤用於匯入檔案用的。
<#include "include.html"/>
這個匯入標籤非常好用,特別是頁面的重用。
另外在靜態檔案中可以使用${} 獲取值,取值方式和el表示式一樣,非常方便。
推薦閱讀: