1、概述<o:p></o:p>
l Velocity是一個簡單而且更加輕量級的工具,但是它沒有達到FreeMarker能夠做的許多任務,而且它的模板語言不是很強大<o:p></o:p>
l 我們認爲對於大多數應用程序,FreeMarker比Velocity工作更簡單,因爲:<o:p></o:p>
Ø 使用Velocity,你需要尋找特定工具或各種工作環境來一次次的解決典型的模板創作任務,結果會浪費更多時間<o:p></o:p>
Ø 工作環境經常意味着在Velocity模板中直接使用Java對象的方法,這違反了簡單、無編程HTML設計的觀念<o:p></o:p>
Ø 或者將表示任務移到控制器代碼中,這違反了MVC模式<o:p></o:p>
l 使用FreeMarker,可以以out-of-the-box(如何翻譯確切?)的方式實現Velocity所能做的<o:p></o:p>
<o:p></o:p>
2、特性比較清單<o:p></o:p>
下面是一個使用FreeMarker能夠實現,而Velocity不能實現的不太全面的特性清單:<o:p></o:p>
(1)數字和日期支持<o:p></o:p>
l 可以對任何數字類型進行算術運算和比較,包括精度類型<o:p></o:p>
l 可以比較和顯示(格式化)日期/時間值<o:p></o:p>
(2)國際化<o:p></o:p>
l 根據各種內建和定製的數字格式,格式化本地敏感的數字<o:p></o:p>
l 根據各種內建和定製的日期格式,格式化本地敏感和時區敏感的日期<o:p></o:p>
l 標識(變量名)可以包含非英語字符,如重音字符、阿拉伯字符、中文字符等<o:p></o:p>
(3)循環處理<o:p></o:p>
l 可以跳出循環<o:p></o:p>
l 可以在循環外訪問循環體內的控制變量<o:p></o:p>
l 可以測試是否達到最後一次循環<o:p></o:p>
(4)模板級別的數組處理<o:p></o:p>
l 可以使用類似[i]語法的索引方式訪問數組元素<o:p></o:p>
l 可以查詢數組長度<o:p></o:p>
(5)宏<o:p></o:p>
l 宏可以有局部變量<o:p></o:p>
l 可以遞歸調用宏,同樣可以在模板的後面定義要調用的宏<o:p></o:p>
l 調用宏時,可以按位置或名字的方式傳遞參數<o:p></o:p>
l 宏參數可以有缺省值,使得在調用時忽略參數也有效<o:p></o:p>
l 調用的宏可以有嵌套的體內容(<@myMacro>body</@myMacro>),能夠在宏被調用時進行處理<o:p></o:p>
l 宏是純變量的,可以基於表達式來執行宏,或者作爲參數傳遞給另一個宏<o:p></o:p>
(6)命名空間<o:p></o:p>
l 可以對變量使用多命名空間,這對創建宏庫很重要,因爲這可以避免應用程序中指定的變量和宏庫中變量的名字衝突<o:p></o:p>
(7)使用內建的函數/操作符維護Java無關的string、list和map<o:p></o:p>
l 可以將字符串轉換成大/小寫、首字符大/小寫,對HTML、XML或RTF進行轉義處理,substring、split、查詢字符串長度、find/replace子串等等<o:p></o:p>
l 通過索引訪問list元素,獲得子list,合併list,查詢list長度,對list排序<o:p></o:p>
l 通過key變量訪問map元素,檢查map是否爲空,獲得key或值的list<o:p></o:p>
(8)揭示模板中的錯誤<o:p></o:p>
l 當訪問一個未定義的變量,FreeMarker不會沉默;你可以配置FreeMarker來停止render模板顯示錯誤信息,或者跳過錯誤部分;無論哪種,FreeMarker會記錄問題(日誌)<o:p></o:p>
l 在寫錯指令名時,FreeMarker會拋出異常<o:p></o:p>
(9)高級render控制<o:p></o:p>
l 可以使用一組標記來封裝模板的一塊區域,以便在塊區中所有要修改的地方應用HTML或XML轉義(或其它使用FreeMarker表達式表示的轉換)<o:p></o:p>
l FreeMarker有轉換器,它們是模板的一塊區域,在render時,通過轉換過濾;內建的轉換器包括空白字符壓縮、HTML和XML轉義;你可以實現自己的轉換器;當然轉換器可以嵌套<o:p></o:p>
l 可以使用flush指令顯式的flush輸出<o:p></o:p>
l 可以使用stop指令停止render<o:p></o:p>
(10)文字<o:p></o:p>
l 除了通常的字符串、數字和布爾值文字,也可以在模板中定義list和map文字<o:p></o:p>
l 支持所有的Java轉義文字:\b、\t、\n、\f、\r、\”、\’、\\,也支持\xXXXX使用UNICODE指定字符<o:p></o:p>
(11)高級空白字符移除<o:p></o:p>
l FreeMarker堅持移除各行只包含不輸出FreeMarker標記的空白字符<o:p></o:p>
l 對於明顯要整修掉不需要的空白字符的指令來說,空白字符是個大問題