Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全註解實例詳解(五)


    這是本系列的最後一篇,主要講一下FreeMarker模板引擎的基本概念與常用指令的使用方式。
    
一、FreemMarker基本概念
    
FreemMarker是一個用Java語言編寫的模板引擎,它是一個基於模板來生成文本輸出的一個工具。是除了JSP之外被使用得最多的頁面模板技術之一,另一個比較有名的模板則是Velocity
    用戶可以使用FreeMarker來生成所需要的內容,通常由Java提供數據模型,FreeMarker通過模板引擎渲染數據模型,這樣最終得到我們想要的內容。使用FreeMarker作爲展示層,訪問速度會比較快,因爲FreeMarker引擎渲染頁面的時候,只需要把數據填充進去就可以了,其它的都是固定的模板內容。另外,使用FreeMarker能夠很方便的動態生成靜態頁面,對於大訪問量的網站,配合nginx可以很好的提高網站性能。
    ssm3這個例子中,就是使用的FreeMarker模板技術來實現的視圖層。本文主要是對ssm3例子中所使用到的FreeMarker知識點進行介紹,其它更詳細的內容還請大家參考官方文檔。
    
在本文的最後有ssm3源碼,有需要的朋友可以自行下載,例子是最基本的,方便入門的朋友學習與瞭解。
    二、FreemMarker配置說明
    Spring 3.0框架中,已經集成好了FreeMarker,對它進行了適度的封裝,我們使用起來非常方便。要使用FreemMarker模板的功能,只需要進行下面兩項配置。
    aFreemMarker視圖解析器
    
    當我們發出REST請求訪問資源時,當Controller執行完畢,需要返回結果給我們時,那些返回字符串指定的都是結果頁面,這時,就通過上面這個解析器,根據返回的那些字符串解析成我們設計的頁面。另外,如果要使用Spring提供的FreeMarker宏,還需要加上exposeSpringMacroHelpers這個屬性,將它設爲true,你可以將這些宏理解爲一種功能,或一個方法。
    bFreemMarker環境配置
    
    上面這段配置設置了FreeMarker環境屬性,templateLoaderPath指定模板文件存放的路徑,它相當於是定義了模板的前綴,所有顯示的頁面都遵循這個路徑規則。還指定了模板文件的編碼格式,如果不顯示配置,否則會採用系統默認編碼,這很容易出現亂碼的情況,所以一定要將編碼統一設置,不要再使用gb2312gbk之類的編碼方式了,採用國際統一的Unicode UTF-8編碼是比較好的習慣。
    除了上面我們看到的這些配置設置外,FreeMarkerConfigurer還有一個很重要的屬性是freemarkerVariables,它可以用來設置我們自己開發的自定義指令標籤,以滿足不同的業務需求。
    
三、FreemMarker指令標記
    要想在最終結果頁面中填充數據,需要用到FreeMarker標記指令來達到這一目的。不過這些標記指令一般不會單獨出現,基本上是多個組合使用,爲了讓大家方便理解,大象就以ssm3中的一些頁面爲例子進行說明。
    FreeMarker有兩種類型:預定義指令和用戶自定義指令。預定義指令是以#號開頭,用戶自定義的指令則使用@開頭。而SpringFreeMarker宏也是以@開頭。
    
    指令assign表示定義一個變量,它的格式是<#assign name=value>,在這裏ctx是變量名namevalue可以是一個值,也可以是一個表達式。還記得FreeMarker解析器中我們設置的requestContextAttribute屬性爲rc吧,我們現在就是用它來獲得我們應用上下文,我們的應用名爲ssm3,所以這裏就是取得這個值,將它賦給ctx,上面這些都寫在meta.html這個模板頁面中,這樣我們就可以在所有模板頁中引用這個變量。
    在表達式中,使用了一個!符號,它的作用是如果rc.getContextPath()null或不存在,就將字符串”/ssm3”作爲默認值賦給變量ctx。這樣,即使萬一因爲某些原因無法取得上下文值,我們的ctx變量也不會因此而出現空值或不正確的值,從而引起系統異常。
    在使用FreeMarker時,一定要注意一點,FreeMarker絕不允許引用不存在的變量(即變量爲null),除非明確地告訴它當變量不存在(null)時如何處理。
    上面這一點非常重要,往往很多時候Bug就出在空值未處理上面,請大家使用FreeMarker的時候一定要多加註意。
    
    指令include載入模板頁,可以使用它在一個模板中插入另外一個FreeMarker模板文件。
    
    <#if>條件判斷指令,list??是否爲空判斷,如果list不爲null纔會往下執行。??一般都與if指令一起執行。
    <#list list as entity>開始循環遍歷,listmodel裏面定義的屬性名稱,aslist循環定義變量的語法,entitylist循環變量的名稱。${...}它和JSTL裏的同一個表達式含義相同。FreeMarker都是在輸出時,用實際值替換。
    
源碼下載:ssm3     
    
本文爲菠蘿大象原創,如要轉載請註明出處。
http://bolo.blogjava.net/
發佈了21 篇原創文章 · 獲贊 3 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章