buffalo & dwr 比較

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框架:

image

    Buffalo是 一個爲java web項目而設計的輕量級AJAX框架。它是開源的(Apache License 2.0),其功能強大且易用。主要解決在j2ee ajax開發中的常見問題。它承諾爲開發者和最終用戶都能受益。最重要的Buffalo的作者Michael Chen是位中國開發者,他就生活在北京。

image

    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的整體性。


五、相關資源:

image

   在過去的兩年間,baffalo的開發者擁有值得興奮的積極反饋:buffalo非常適於在java web項目的ajax開發。爲了幫助更多的用戶更好地使用buffalo,他們期待你的幫助:發佈文檔、bug報告和bug修正等。

   baffalo Maillist: [email protected]

   baffalo 論壇:http://groups.google.com/group/amowa
 
發佈了79 篇原創文章 · 獲贊 3 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章