Java模版引擎:jsp、freemarker、velocity區別

在java領域,表現層技術主要有三種:jsp、freemarker、velocity。html

 

jsp是你們最熟悉的技術
優勢:
一、功能強大,能夠寫java代碼
二、支持jsp標籤(jsp tag)
三、支持表達式語言(el)
四、官方標準,用戶羣廣,豐富的第三方jsp標籤庫
五、性能良好。jsp編譯成class文件執行,有很好的性能表現
缺點:
jsp沒有明顯缺點,非要挑點骨頭那就是,因爲能夠編寫java代碼,如使用不當容易破壞mvc結構。


velocity是較早出現的用於代替jsp的模板語言
優勢:
一、不能編寫java代碼,能夠實現嚴格的mvc分離
二、性能良好,聽說比jsp性能還要好些
三、使用表達式語言,聽說jsp的表達式語言就是學velocity的
缺點:
一、不是官方標準
二、用戶羣體和第三方標籤庫沒有jsp多。
三、對jsp標籤支持不夠好


freemarker
優勢:
一、不能編寫java代碼,能夠實現嚴格的mvc分離
二、性能很是不錯
三、對jsp標籤支持良好
四、內置大量經常使用功能,使用很是方便
五、宏定義(相似jsp標籤)很是方便
六、使用表達式語言
缺點:
一、不是官方標準
java

二、用戶羣體和第三方標籤庫沒有jsp多express

選擇freemarker的緣由:
一、性能。velocity應該是最好的,其次是jsp,普通的頁面freemarker性能最差(雖然只是幾毫秒到十幾毫秒的差距)。可是在複雜頁面上(包含大量判斷、日期金額格式化)的頁面上,freemarker的性能比使用tag和el的jsp好。
二、宏定義比jsp tag方便
三、內置大量經常使用功能。好比html過濾,日期金額格式化等等,使用很是方便
四、支持jsp標籤
五、能夠實現嚴格的mvc分離
api

#####################################################################數組

相比較 FreeMarker 而言,Velocity 更加簡單、輕量級,但它的功能卻沒有 FreeMarker 那麼強大。mvc

對於大部分的應用來講,使用 FreeMarker 比 Velocity 更簡單,由於 Velocity 還必須編寫一些自定義的toolbox類以及一遍遍重複的編寫一些比較通用的模版代碼,所以也就喪失了剛開始開發時更多的寶貴時間。另外使用工具類和變通的方法在模版引擎中彷佛不是一個很是有效的作法。同時,Velocity 的作法使得在Velocity的模版中大量的跟 Java 對象進行交互,這違反了簡單的原則,儘管你也能夠將代碼轉入控制器中實現。固然,若是你像使用 Velocity 同樣來使用 FreeMarker ,那麼 FreeMarker 也能夠跟 Velocity 同樣簡單。app

Velocity 一個優於 FreeMarker 的地方在於它有很普遍的第三方支持以及一個很是龐大的用戶社區,你能夠經過這個社區得到到不少的幫助,相反的 FreeMarker 在這方面要差不少。固然,也有愈來愈多的第三方軟件開始在支持 FreeMarker 。jsp

下面是一些 FreeMarker 能作到的,而 Velocity 作不到的功能列表(且看着):工具

1. 日期和數字的支持
您能夠執行運算和比較,對任意數量的類型,包括任意精度類型,而不只僅是整數。
您能夠比較和顯示(格式化)日期/時間值。性能

2. 國際化
您能夠格式數字區域,各類各樣的內置和自定義數字格式模式。
您能夠格式日期地區和時區,各類各樣的內置和定製的日期格式模式。
標識符(變量名)能夠包含非英語字母同樣重音字母,阿拉伯字母,漢字等

3. 循環處理
您能夠退出循環
您能夠訪問控制變量外循環機構的內部循環
您能夠得知當前是否到了循環的結束位置

4. 模版級別的數組處理
您可使用[i]的語法來訪問數組元素,包括原始的和非原始的指數
能夠獲取到數組的長度

5. 宏定義
宏調用能夠經過位置或名稱進行參數傳遞
宏的參數能夠設定默認值,在調用宏時若是沒有指定該參數,則使用默認值代替
經過 <@myMacro>body</@myMacro> 能夠支持宏的嵌套
能夠經過文本表達的「宏的名稱」來直接調用某個宏
宏容許先使用再定義
宏能夠定義局部變量(新版本的Velocity也經過#local指令來實現該功能,儘管官方的文檔尚未進行介紹)

6. 命名空間
您可使用多個名稱空間的變數。當您創建「宏庫」時是很是有用的 ,由於能夠防止名稱衝突與申請特定變量或與其餘宏變量的庫。

7. 內置與 Java 語言無關的字符串、列表、Map 的操做方法

8. 能提示模版中的拼寫錯誤以及其餘錯誤
當訪問一個不存在的變量時,FreeMarker 在執行該模版時會報錯,經過配置,你能夠指定 FreeMarker 在碰到此類錯誤時是中止執行,仍是忽略該錯誤,同時 FreeMarker 會在日誌中記錄此問題;
若是您輸入錯誤指令的名稱,FreeMarker將拋出一個異常。

9. 更高級的文本輸出工具
You can enclose a block of template in a set of tags that will cause it to apply HTML escaping or XML escaping (or any other transformation you can express as a FreeMarker expression for that matter) on all interpolations (${foo}) in the block.
FreeMarker has transforms, which are blocks of template that when rendered, go through a transforming filter. Built-in transforms include whitespace compressor, HTML and XML escaper. Best of all, you can implement your own transformers as well (i.e. if you generate Java source code, you can write a Java code pretty-printer transform and insert it into the template). Naturally, transforms can be nested.
You can explicitly flush the output writer with a built-in flush-directive.
You can stop the rendering with a built-in stop-directive.

10. 文本處理
支持Java的特殊字符處理,例如\b, \t, \n, \f, \r, \", \', \\,以及UNICODE的\xXXXX
除了一般的字符串,數字,和布爾常量您能夠定義列表和地圖文字以及內部模板

11. 高級的空格清除
FreeMarker 將刪除一些多餘的空格、跳格、換行等字符,從而消除一些使人厭煩的明顯多餘的空格
FreeMarker 也提供指令來刪除多於的空格

12. 與其餘技術的集成
提供 JSP 標籤庫以便在 JSP 中嵌入 FreeMarker 模版
能夠直接跟 Python 對象一塊兒工做

13. 更強大的XML轉換功能

14. 先進的模板元程序 您能夠捕捉到輸出的任意部分範本背景變量 您能夠任意解釋的範圍變量,就好像它是一個模板定義

相關文章
相關標籤/搜索