Buffalo VS DWR
作者:cleverpig
聲明:文中引用的評論僅表示個人觀點,供大家作為技術參考。
開篇言:
????本文根據
BJUG maillist討論整理,取自
Buffalo網站,在此對Michael的貢獻表示感謝!文中引用的評論僅表示個人觀點,供大家作為技術參考。先敬佩Michael一個,能做到這樣,Michael付出了很多。下文簡單比較一下Buffalo和DWR,兩者的思路基本類似,有很多共性的東西。總的看來,Buffalo能滿足基本的需要,但DWR已經在整體系統結構上有了更多優勢。框架的生命周期是有限的,如果不能與時俱進,將遲早面臨被淘汰的局面。
版權聲明:任何獲得Matrix授權的網站,轉載時請務必保留以下作者信息和鏈接作者:cleverpig;
cleverpig原文:
http://www.matrix.org.cn/resource/article/2006-10-18/Buffalo+DWR_4ebd1e01-5e90-11db-a5c2-7f23a8944cb0.html關鍵字:buffalo,dwr,ajax,比較
一、兩個Ajax框架:
????
Buffalo是一個為java web項目而設計的輕量級AJAX框架。它是開源的(Apache License 2.0),其功能強大且易用。主要解決在j2ee ajax開發中的常見問題。它承諾為開發者和最終用戶都能受益。最重要的Buffalo的作者Michael Chen是位中國開發者,他就生活在北京。

????
DWR是一個Java開源庫,幫助你實現Ajax網站。它可以讓你在瀏覽器中的Javascript代碼調用Web服務器上的Java,就像在Java代碼就在瀏覽器中一樣。DWR會根據你的Java類動態的生成Javascript代碼。這些代碼的魔力是讓你感覺整個Ajax調用都是在瀏覽器上發生的,但事實上是服務器執行了這些代碼,DWR負責數據的傳遞和轉換。
二、共性:????
支持Spring集成:均支持。
????
使用一個Servlet來接收所有的AJAX請求:????????Buffalo使用ApplicationServlet<————>DWR使用DWRServlet。
????
使用XMLHttpRequest + JavaScript 傳輸數據:????????Buffalo使用buffalo.js<————>DWR使用dwr.js & util.js。
????
在Java和Javascript之間轉換數據:????????Buffalo使用marshallingContext<————>DWR使用Converter。
????
協議:????????Buffalo在1.2.x之前采用burlap, Buffalo解析大數據量可能會比較慢,然而可以適用于多種服務器端和客戶端,并且burlap協議的完整性和支持的數據類型更加豐富。2.0開始采用自定義的基于xml的協議(來自burlap,做了更適合web的修改),并自行編寫了解析器,性能更高。
????????DWR使用自定義的簡單文本協議。
三、Buffalo特性:??
1. 基于prototype:如果你的AJAX應用也是基于prototype,那么可以減少重復加載prototype的帶寬,并且獲得相當一致的編程概念。
??
2. Bind:提供了對結果數據的處理,直接將數據綁定到頁面對象并展示,這是一個動人的特性。(DWR在Util.js中也提供了一些方法來簡化數據的展示,但不如 Buffalo做的更多。) 在2.0中,Bind能力更加強大,能夠將值直接綁定到表單元素、表格、DIV/Span、甚至整個表單上。關鍵是這種綁定是無侵入并且與buffalo 整體結構完全整合,對外表現只有一個簡單的buffalo.bindReply或者Buffalo.Bind.bind即可。http://buffalo.sourceforge.net/binding.html有一些描述。
??
3. 序列化:Buffalo支持任意對象,任意深度,任意數據結構的java到javascript以及javascript到java的雙向序列化。并且支持引用。這里有完整的協議說明。由于文檔和演示不充分,很多人以為buffalo不支持任意對象了 ~
??
4. 生命周期對象訪問:1.2.4之前需要繼承一個BuffaloService,
????從1.2.4開始就不需要繼承了,引入了線程安全的BuffaloContext對象,只需要通過BuffaloContext.getContext()即可獲得一個線程安全的引用,并且對Request的各種屬性進行操作。更方便的是:
??????Map BuffaloContext.getContext.getSession()
??????Map BuffaloContext.getContext.getApplication()
??????Map BuffaloContext.getContext.getCookie()
??????即可獲得session/application/cookie的Map,操作這些Map即可獲得對這些生命周期的各種變量進行查詢和更新。這個特性參考了webwork中ActionContext的設計。
??
5. 對Collection/Array的模糊處理:buffalo中提供了對Collection/Array對象的模糊識別能力。例如:服務器端有一個方法需要List參數,客戶端傳遞過去一個javascript數組就可以了,不需要費心的組裝對象。buffalo通過這些很細小的地方來提高程序員生產力。
??
6. 客戶端組裝對象:據報告DWR只支持簡單數據類型作為參數在客戶端傳入。buffalo支持在客戶端組裝對象,甚至可以直接將整個表單序列化為一個對象作為參數傳給遠程客戶端。DWR協議天生不足,這方面,我猜想它完全沒有能力。
??
7. 對重載方法的處理能力:由于java與javascript之間類型的不匹配,DWR的代碼生成無法對重載方法進行處理。例如,sum(double,double), sum(int, int) DWR很可能不知道你要調用哪一個。從2.0開始buffalo支持了對重載的處理。
四、DWR特性:??
1. 支持Batch:可以將多個Service函數調用放在一個XMLHttpRequest請求中完成。
?? Michael Chen評論:我一直認為這不是一個好的實踐。在客戶端發起多個請求并獲得響應除了獲得編程的復雜外,還增加了服務器端設計service的自由度。這種方式感覺上更鼓勵為遠程調用設計細粒度的服務、將組裝邏輯放在客戶端。這種設計風格我不太喜歡,因此batch也一直沒有考慮實現,雖然實現不太麻煩。
??
2. Converter:可以轉換任意類型的Java對象到JavaScript,并允許直接使用。例如:Customer類包含一個address變量,當AjaxCall返回Customer對象的時候,可以直接在Javascript中使用customer.address來獲得Address的信息。
??
3. HttpServlet:支持在被調用的Service方法中獲得HttpServletRequest和HttpServletResponse對象,這樣可以訪問當前Session中的數據。
??
4. 允許Expose部分函數和屬性。(Buffalo無限制,可以訪問Service中的任意函數。)
?? Michael Chen評論: 這個我也考慮過...DWR的代碼生成機制使得它不得不通過這種方式減小些流量。Buffalo如果想實現這個特性也不是不行,只是我覺得,既然 Service辛辛苦苦實現了,還需要通過這種方式來讓別人不能用么?況且buffalo沒有代碼生成,無論你暴露多少方法流量都是一樣的。考慮到實際情況,buffalo沒有實現這個特性。
??
5. DWR2.0中提出了Reverse Ajax:提供在Java代碼中來處理頁面上元素的功能。
?? Michael Chen評論: 這個東東...也還是代碼生成的trick...然而我的態度是javascript與java同樣重要的,因此不會讓代碼生成類的東西破壞javascript的整體性。
五、相關資源:
?? 在過去的兩年間,baffalo的開發者擁有值得興奮的積極反饋:buffalo非常適于在java web項目的ajax開發。為了幫助更多的用戶更好地使用buffalo,他們期待你的幫助:發布文檔、bug報告和bug修正等。
?? baffalo Maillist:
buffalo-users@lists.sourceforge.net?? baffalo 論壇:
http://groups.google.com/group/amowa
cleverpig寫的Buffalo的最佳實踐
posted on 2006-10-19 15:31
xzc 閱讀(418)
評論(0) 編輯 收藏 所屬分類:
XML