Freemarker 簡介


 

  1、動態網頁和靜態網頁差異

  在進入主題之前我先介紹一下什么是動態網頁,動態網頁是指跟靜態網頁相對應的一種網頁編程技術。靜態網頁,隨着HTML代碼的生成,頁面的內容和顯示效果就不會再發生變化(除非你修改頁面代碼)。而動態網頁則不然,頁面代碼雖然沒有發生變化,但是顯示的內容卻是可以隨着時間、環境或者數據庫操作的結果而發生相應的變化。簡而言之,動態網頁是基本的HTML語法規范與java、VB、VC等高級程序設計語言、數據庫編程等多種技術的融合,以實現對網站內容和風格的高效、動態和交互式的管理。

  通過前面的介紹我們可以得出動態網頁和靜態網頁的優缺點(這里我們只考慮網站性能方面的相關問題,信息安全等多方面問題不做贅述):

  1)靜態網頁:

  a、靜態網頁的內容穩定,頁面加載速度快。

  b、靜態網頁的沒有數據庫支持,在網站制作和維護方面的工作量較大。

  c、靜態網頁的交互性差,有很大的局限性。

  2)動態網頁:

  a、交互性好。

  b、動態網頁的信息都需要從數據庫中讀取,每打開一個一面就需要去獲取一次數據庫,如果訪問人數很多,也就會對服務器增加很大的荷載,從而影響這個網站的運行速度。

  通過上面的比較我們不難看出,要提升網站的性能,我們只要把動態網頁做成靜態網頁就會在運行速度方面有顯著的提升,但是問題出來了,如果將所有頁面都做成靜態頁面顯然是不切實際的。有什么辦法能讓我們的網站即能有動態網頁的交互性,又有靜態網頁的加載速度呢?FreeMarker便能實現這樣的需求:實現動態網頁靜態化。

  2、FreeMarker原理

  FreeMarker是一個基於Java的開發包和類庫的一種將模板和數據進行整合並輸出文本的通用工具,FreeMarker實現頁面靜態化的原理是:將頁面中所需要的樣式寫入到FreeMarker模板文件中,然后將頁面所需要的數據進行動態綁定並放入到Map中,然后通過FreeMarker的模板解析類process()方法完成靜態頁面的生成。其工作原理如圖2-1所示。

網站性能提升之采用FreeMarker
▲圖2-1 FreeMarker工作原理圖

  3、FreeMarker表達式

  表達式可以說是FreeMarker的核心功能,表達式放置在插值語法“${...}”之中時,表面需要輸出表達式的值,表達式語法也可以與FreeMarker標簽結合,用於控制輸出。

  1)直接指定值

  例如:${“zhangsan”}

  2)輸出變量值

  FreeMarker的表達式輸出變量時,這些變量可以是頂層變量,也可以是Map對象中的變量,還可以是集合中的變量,並可以使用點(.)語法來訪問Java對象的屬性,例如:${user.name}。

  3)字符串操作

  a、字符串的連接,字符串的連接可以直接使用雲算符“+”來連接字符串也可以使用${..}(或#{..})在字符串常量部分插入表達式的值,從而完成字符串連接。

  b、字符串的截取,${book[1..4]}

  4)集合連接運算符,這里所說的集合連接運算是將兩個集合連接成一個新的集合,連接集合的運算符是“+”,例如:

網站性能提升之采用FreeMarker

  5)Map連接運算符,Map對象的連接運算也是將兩個Map對象連接成一個新的Map對象,Map對象的連接運算符是+。如果兩個Map對象具有相同的 key,則后加入Map里的key所對應的value替代原來key所對應的value

  6)算術運算符,FreeMarker表達式中完全支持算術運算。FreeMarker支持的算術運算符包括: +,-,*,/,%

  7)比較運算符,FreeMarker表達式中支持的比較運算符有如下幾個

  a、=(或者==):判斷兩個值是否相等.

  b、!=:判斷兩個值是否不相等

  c、 >(或者gt):判斷坐標值是否大於右邊值

  d、 >=(或者gte):判斷坐標值是否大於等於右邊值

  e、 <(或者lt):判斷左邊值是否小於右邊值

  f、 <=(或者lte):判斷左邊值是否小於等於右邊值

  8)邏輯運算符,FreeMarker中的邏輯運算符有如下幾個:

  a、邏輯與:&&

  b、邏輯或:||

  c、邏輯非:!

  9)內建函數

  FreeMarker提供了一些內建函數用來轉換輸出,可以在任何變量后緊跟?,?后緊跟內建函數,就可以通過內建函數來轉換輸出變量,例如:${test?upper_case?html}這里就是將test字符串轉換為大寫並進行HTML編碼。

  10)空值處理運算符

  FreeMarker對空值的處理非常嚴格,FreeMarker的變量必須有值,如果存在沒有賦值的變量就會拋出異常,為了處理缺失變量FreeMarker提供了兩個運算符:“!”和“??”,其中“!”用於指定缺失變量的默認值,“??”用來判斷某個變量是否存在。

  4、FreeMarker的常用指令

  1)if指令

  使用if指令可以有條件的跳過模板的一部分,和程序語言中的if相似,例如你想顯示某個用戶是否成年可以這樣寫:

網站性能提升之采用FreeMarker

  2)switch、case、default、break指令

  FreeMarker中使用switch、case、default、break指令和常用的程序設計語言中的一樣。例如:

網站性能提升之采用FreeMarker

  雖然FreeMarker提供了switch指令,但它並不推薦使用switch指令來控制也輸出,而是推薦使用FreeMarker的if..elseif..else 指令來替代它。

  3)list指令

  當在HTML中需要用列表遍歷集合的內容時,list就顯得尤為重要,例如當我們需要遍歷一個用戶集合時可以這樣寫:

網站性能提升之采用FreeMarker

  4)include 指令

  include指令的作用類似於JSP的包含指令,用於包含指定頁,include指令的語法格式如下:

  <#include filename [options]>

  在上面的語法格式中,兩個參數的解釋如下

  a)filename:該參數指定被包含的模板文件

  b)options:該參數可以省略,指定包含時的選項,包含encoding和parse兩個選項,encoding指定包含頁面時所使用的解碼集,而parse指定被包含是否作為FTL文件來解析。如果省略了parse選項值,則該選項值默認是true。

  5)assign指令

  通過assign指令可以創建一個變量,或替換一個已存在的變量,例如:

  <#assign name=”zhangsan”>

  三、FreeMarker實現網頁靜態化

  上面我簡單介紹了FreeMarker的基本用法,下面我將以具體例子采用Freemarker實現網頁靜態化的功能。

  1)新建一個Maven項目,在pom.xml文件中新增FreeMarker的jar包,

網站性能提升之采用FreeMarker

  2)新建FreemarkerUtil工具類,其中包含了通過標准輸出流輸出模板的結果的方法和輸出到文件中的方法。Freemarker是通過template.Configuration這個對象對模板進行加載的(它也處理創建和緩存預解析模板的工作),然后我們通過getTemplate方法獲得你想要的模板,有一點要記住template.Configuration在你整個應用必須保證唯一實例。

網站性能提升之采用FreeMarker

  3)新建User實體類,用戶屬性包含用戶主鍵、用戶年齡、郵箱,該實體類用於模擬從數據庫中查詢出數據。

  4)新建模板文件01.ftl,通過上面的介紹知道FreeMarker是一種基於模板的、用來生成輸出文本的通用工具,所以我們必須要定制符合自己業務的模板出來,然后將需要動態加載的數據通過FreeMarker的語法規范書寫生成靜態HTML的模板文件,具體的語法規范在上前面已經詳細介紹。

網站性能提升之采用FreeMarker

  5)新建Junit測試類TestFreemarker,用假數據模擬從數據庫中查詢數據並通過FreeMarker將模板文件和數據結合生成靜態的HTML文件。

網站性能提升之采用FreeMarker

  6) 通過以上步驟便成功的完成了一個通過FreeMarker生成靜態HTML文件,生成的HTML文件內容如圖3-1所示。

網站性能提升之采用FreeMarker
▲圖3-1

  通過以上步驟便成功的實現了對一個需要從數據庫中查詢數據的動態頁面的靜態化處理,當我們每次更新了數據庫中的相應信息以后,我們便可以重新執行這個方法,將這個頁面重新靜態化,當我們每次訪問這個網頁的時候便不會每一次都去數據庫中查詢數據了,而是訪問的一個已經一次性生成了的靜態頁面,這也就達到了提高網站運行速度的目標。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM