Buffalo VS DWR
作者:cleverpig
聲明:文中引用的評論僅表示個人觀點,供大家作為技術(shù)參考。
開篇言: 本文根據(jù)
BJUG maillist討論整理,取自
Buffalo網(wǎng)站, 在此對Michael的貢獻(xiàn)表示感謝!文中引用的評論僅表示個人觀點,供大家作為技術(shù)參考。先敬佩Michael一個,能做到這樣,Michael付出了 很多。下文簡單比較一下Buffalo和DWR,兩者的思路基本類似,有很多共性的東西??偟目磥恚珺uffalo能滿足基本的需要,但DWR已經(jīng)在整體 系統(tǒng)結(jié)構(gòu)上有了更多優(yōu)勢??蚣艿纳芷谑怯邢薜?,如果不能與時俱進(jìn),將遲早面臨被淘汰的局面。
版權(quán)聲明:任何獲得Matrix授權(quán)的網(wǎng)站,轉(zhuǎn)載時請務(wù)必保留以下作者信息和鏈接作者:cleverpig;
cleverpig原文:
http://www.matrix.org.cn/resource/article/2006-10-18/Buffalo+DWR_4ebd1e01-5e90-11db-a5c2-7f23a8944cb0.html關(guān)鍵字:buffalo,dwr,ajax,比較
一、兩個Ajax框架: Buffalo是 一個為java web項目而設(shè)計的輕量級AJAX框架。它是開源的(Apache License 2.0),其功能強(qiáng)大且易用。主要解決在j2ee ajax開發(fā)中的常見問題。它承諾為開發(fā)者和最終用戶都能受益。最重要的Buffalo的作者M(jìn)ichael Chen是位中國開發(fā)者,他就生活在北京。
DWR是 一個Java開源庫,幫助你實現(xiàn)Ajax網(wǎng)站。它可以讓你在瀏覽器中的Javascript代碼調(diào)用Web服務(wù)器上的Java,就像在Java代碼就在瀏 覽器中一樣。DWR會根據(jù)你的Java類動態(tài)的生成Javascript代碼。這些代碼的魔力是讓你感覺整個Ajax調(diào)用都是在瀏覽器上發(fā)生的,但事實上 是服務(wù)器執(zhí)行了這些代碼,DWR負(fù)責(zé)數(shù)據(jù)的傳遞和轉(zhuǎn)換。
二、共性: 支持Spring集成:均支持。
使用一個Servlet來接收所有的AJAX請求: Buffalo使用ApplicationServlet<————>DWR使用DWRServlet。
使用XMLHttpRequest + JavaScript 傳輸數(shù)據(jù): Buffalo使用buffalo.js<————>DWR使用dwr.js & util.js。
在Java和Javascript之間轉(zhuǎn)換數(shù)據(jù): Buffalo使用marshallingContext<————>DWR使用Converter。
協(xié)議: Buffalo 在1.2.x之前采用burlap, Buffalo解析大數(shù)據(jù)量可能會比較慢,然而可以適用于多種服務(wù)器端和客戶端,并且burlap協(xié)議的完整性和支持的數(shù)據(jù)類型更加豐富。2.0開始采用 自定義的基于xml的協(xié)議(來自burlap,做了更適合web的修改),并自行編寫了解析器,性能更高。
DWR使用自定義的簡單文本協(xié)議。
三、Buffalo特性: 1. 基于prototype:如果你的AJAX應(yīng)用也是基于prototype,那么可以減少重復(fù)加載prototype的帶寬,并且獲得相當(dāng)一致的編程概念。
2. Bind:提 供了對結(jié)果數(shù)據(jù)的處理,直接將數(shù)據(jù)綁定到頁面對象并展示,這是一個動人的特性。(DWR在Util.js中也提供了一些方法來簡化數(shù)據(jù)的展示,但不如 Buffalo做的更多。) 在2.0中,Bind能力更加強(qiáng)大,能夠?qū)⒅抵苯咏壎ǖ奖韱卧?、表格、DIV/Span、甚至整個表單上。關(guān)鍵是這種綁定是無侵入并且與buffalo 整體結(jié)構(gòu)完全整合,對外表現(xiàn)只有一個簡單的buffalo.bindReply或者Buffalo.Bind.bind即可。http: //buffalo.sourceforge.net/binding.html有一些描述。
3. 序列化:Buffalo支持任意對象,任意深度,任意數(shù)據(jù)結(jié)構(gòu)的java到j(luò)avascript以及javascript到j(luò)ava的雙向序列化。并且支持引用。這里有完整的協(xié)議說明。由于文檔和演示不充分,很多人以為buffalo不支持任意對象了 ~
4. 生命周期對象訪問:1.2.4之前需要繼承一個BuffaloService,
從1.2.4開始就不需要繼承了,引入了線程安全的BuffaloContext對象,只需要通過BuffaloContext.getContext()即可獲得一個線程安全的引用,并且對Request的各種屬性進(jìn)行操作。更方便的是:
Map BuffaloContext.getContext.getSession()
Map BuffaloContext.getContext.getApplication()
Map BuffaloContext.getContext.getCookie()
即可獲得session/application/cookie的Map,操作這些Map即可獲得對這些生命周期的各種變量進(jìn)行查詢和更新。這個特性參考了webwork中ActionContext的設(shè)計。
5. 對Collection/Array的模糊處理:buffalo中提供了對Collection/Array對象的模糊識別能力。例如:服務(wù)器端有一個方法需要List參數(shù),客戶端傳遞過去一個javascript數(shù)組就可以了,不需要費心的組裝對象。buffalo通過這些很細(xì)小的地方來提高程序員生產(chǎn)力。
6. 客戶端組裝對象:據(jù)報告DWR只支持簡單數(shù)據(jù)類型作為參數(shù)在客戶端傳入。buffalo支持在客戶端組裝對象,甚至可以直接將整個表單序列化為一個對象作為參數(shù)傳給遠(yuǎn)程客戶端。DWR協(xié)議天生不足,這方面,我猜想它完全沒有能力。
7. 對重載方法的處理能力:由于java與javascript之間類型的不匹配,DWR的代碼生成無法對重載方法進(jìn)行處理。例如,sum(double,double), sum(int, int) DWR很可能不知道你要調(diào)用哪一個。從2.0開始buffalo支持了對重載的處理。
四、DWR特性: 1. 支持Batch:可以將多個Service函數(shù)調(diào)用放在一個XMLHttpRequest請求中完成。
Michael Chen評論:我一直認(rèn)為這不是一個好的實踐。在客戶端發(fā)起多個請求并獲得響應(yīng)除了獲得編程的復(fù)雜外,還增加了服務(wù)器端設(shè)計service的自由度。這種 方式感覺上更鼓勵為遠(yuǎn)程調(diào)用設(shè)計細(xì)粒度的服務(wù)、將組裝邏輯放在客戶端。這種設(shè)計風(fēng)格我不太喜歡,因此batch也一直沒有考慮實現(xiàn),雖然實現(xiàn)不太麻煩。
2. Converter:可 以轉(zhuǎn)換任意類型的Java對象到JavaScript,并允許直接使用。例如:Customer類包含一個address變量,當(dāng)AjaxCall返回 Customer對象的時候,可以直接在Javascript中使用customer.address來獲得Address的信息。
3. HttpServlet:支持在被調(diào)用的Service方法中獲得HttpServletRequest和HttpServletResponse對象,這樣可以訪問當(dāng)前Session中的數(shù)據(jù)。
4. 允許Expose部分函數(shù)和屬性。(Buffalo無限制,可以訪問Service中的任意函數(shù)。)
Michael Chen評論: 這個我也考慮過...DWR的代碼生成機(jī)制使得它不得不通過這種方式減小些流量。Buffalo如果想實現(xiàn)這個特性也不是不行,只是我覺得,既然 Service辛辛苦苦實現(xiàn)了,還需要通過這種方式來讓別人不能用么?況且buffalo沒有代碼生成,無論你暴露多少方法流量都是一樣的??紤]到實際情 況,buffalo沒有實現(xiàn)這個特性。
5. DWR2.0中提出了Reverse Ajax:提供在Java代碼中來處理頁面上元素的功能。
Michael Chen評論: 這個東東...也還是代碼生成的trick...然而我的態(tài)度是javascript與java同樣重要的,因此不會讓代碼生成類的東西破壞javascript的整體性。
五、相關(guān)資源: 在過去的兩年間,baffalo的開發(fā)者擁有值得興奮的積極反饋:buffalo非常適于在java web項目的ajax開發(fā)。為了幫助更多的用戶更好地使用buffalo,他們期待你的幫助:發(fā)布文檔、bug報告和bug修正等。
baffalo Maillist:
buffalo-users@lists.sourceforge.net baffalo 論壇:
http://groups.google.com/group/amowa