這是本系列的最後一篇,主要講一下FreeMarker模板引擎的基本概念與經常使用指令的使用方式。 1、FreemMarker基本概念 FreemMarker是一個用Java語言編寫的模板引擎,它是一個基於模板來生成文本輸出的一個工具。是除了JSP以外被使用得最多的頁面模板技術之一,另外一個比較有名的模板則是Velocity。 用戶可使用FreeMarker來生成所須要的內容,一般由Java提供數據模型,FreeMarker經過模板引擎渲染數據模型,這樣最終獲得咱們想要的內容。使用FreeMarker做爲展現層,訪問速度會比較快,由於FreeMarker引擎渲染頁面的時候,只須要把數據填充進去就能夠了,其它的都是固定的模板內容。另外,使用FreeMarker可以很方便的動態生成靜態頁面,對於大訪問量的網站,配合nginx能夠很好的提升網站性能。 在ssm3這個例子中,就是使用的FreeMarker模板技術來實現的視圖層。本文主要是對ssm3例子中所使用到的FreeMarker知識點進行介紹,其它更詳細的內容還請你們參考官方文檔。 在本文的最後有ssm3源碼,有須要的朋友能夠自行下載,例子是最基本的,方便入門的朋友學習與瞭解。 2、FreemMarker配置說明 在Spring 3.0框架中,已經集成好了FreeMarker,對它進行了適度的封裝,咱們使用起來很是方便。要使用FreemMarker模板的功能,只須要進行下面兩項配置。 a、FreemMarker視圖解析器 當咱們發出REST請求訪問資源時,當Controller執行完畢,須要返回結果給咱們時,那些返回字符串指定的都是結果頁面,這時,就經過上面這個解析器,根據返回的那些字符串解析成咱們設計的頁面。另外,若是要使用Spring提供的FreeMarker宏,還須要加上exposeSpringMacroHelpers這個屬性,將它設爲true,你能夠將這些宏理解爲一種功能,或一個方法。 b、FreemMarker環境配置
上面這段配置設置了FreeMarker環境屬性,templateLoaderPath指定模板文件存放的路徑,它至關因而定義了模板的前綴,全部顯示的頁面都遵循這個路徑規則。還指定了模板文件的編碼格式,若是不顯示配置,不然會採用系統默認編碼,這很容易出現亂碼的狀況,因此必定要將編碼統一設置,不要再使用gb2312或gbk之類的編碼方式了,採用國際統一的Unicode UTF-8編碼是比較好的習慣。 除了上面咱們看到的這些配置設置外,FreeMarkerConfigurer還有一個很重要的屬性是freemarkerVariables,它能夠用來設置咱們本身開發的自定義指令標籤,以知足不一樣的業務需求。 3、FreemMarker指令標記 要想在最終結果頁面中填充數據,須要用到FreeMarker標記指令來達到這一目的。不過這些標記指令通常不會單獨出現,基本上是多個組合使用,爲了讓你們方便理解,大象就以ssm3中的一些頁面爲例子進行說明。 FreeMarker有兩種類型:預約義指令和用戶自定義指令。預約義指令是以#號開頭,用戶自定義的指令則使用@開頭。而Spring的FreeMarker宏也是以@開頭。
指令assign表示定義一個變量,它的格式是<#assign name=value>,在這裏ctx是變量名name,value能夠是一個值,也能夠是一個表達式。還記得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>開始循環遍歷,list是model裏面定義的屬性名稱,as是list循環定義變量的語法,entity是list循環變量的名稱。${...}它和JSTL裏的同一個表達式含義相同。FreeMarker都是在輸出時,用實際值替換。html