在java領域,表現層技術主要有三種:jsp、freemarker、velocity。
jsp是大家最熟悉的技術
優點:
1、功能強大,可以寫java代碼
2、支持jsp標簽(jsp tag)
3、支持表達式語言(el)
4、官方標准,用戶群廣,豐富的第三方jsp標簽庫
5、性能良好。jsp編譯成class文件執行,有很好的性能表現
缺點:
jsp沒有明顯缺點,非要挑點骨頭那就是,由於可以編寫java代碼,如使用不當容易破壞mvc結構。
velocity是較早出現的用於代替jsp的模板語言
優點:
1、不能編寫java代碼,可以實現嚴格的mvc分離
2、性能良好,據說比jsp性能還要好些
3、使用表達式語言,據說jsp的表達式語言就是學velocity的
缺點:
1、不是官方標准
2、用戶群體和第三方標簽庫沒有jsp多。
3、對jsp標簽支持不夠好
freemarker
優點:
1、不能編寫java代碼,可以實現嚴格的mvc分離
2、性能非常不錯
3、對jsp標簽支持良好
4、內置大量常用功能,使用非常方便
5、宏定義(類似jsp標簽)非常方便
6、使用表達式語言
缺點:
1、不是官方標准
2、用戶群體和第三方標簽庫沒有jsp多
選擇freemarker的原因:
1、性能。velocity應該是最好的,其次是jsp,普通的頁面freemarker性能最差(雖然只是幾毫秒到十幾毫秒的差距)。但是在復雜頁面上(包含大量判斷、日期金額格式化)的頁面上,freemarker的性能比使用tag和el的jsp好。
2、宏定義比jsp tag方便
3、內置大量常用功能。比如html過濾,日期金額格式化等等,使用非常方便
4、支持jsp標簽
5、可以實現嚴格的mvc分離
=====================================================================================================
相比較 FreeMarker 而言,Velocity 更加簡單、輕量級,但它的功能卻沒有 FreeMarker 那么強大。
對於大部分的應用來說,使用 FreeMarker 比 Velocity 更簡單,因為 Velocity 還必須編寫一些自定義的toolbox類以及一遍遍重復的編寫一些比較通用的模版代碼,因此也就喪失了剛開始開發時更多的寶貴時間。另外使用工具類和變通的方法在模版引擎中似乎不是一個非常有效的做法。同時,Velocity 的做法使得在Velocity的模版中大量的跟 Java 對象進行交互,這違反了簡單的原則,盡管你也可以將代碼轉入控制器中實現。當然,如果你像使用 Velocity 一樣來使用 FreeMarker ,那么 FreeMarker 也可以跟 Velocity 一樣簡單。
Velocity 一個優於 FreeMarker 的地方在於它有很廣泛的第三方支持以及一個非常龐大的用戶社區,你可以通過這個社區獲得到很多的幫助,相反的 FreeMarker 在這方面要差很多。當然,也有越來越多的第三方軟件開始在支持 FreeMarker 。
下面是一些 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. 先進的模板元程序
您可以捕捉到輸出的任意部分范本背景變量
您可以任意解釋的范圍變量,就好像它是一個模板定義
結束語:
功能強不強大並不是最重要的,關鍵在於是否適應你的要求。