最近Ajax比較火,全世界都在討論。于是我也摻和摻和,直接用XMLHttpRequest?現在的我還沒(méi)有那個(gè)水平。用Echo2或者backbase,又感覺(jué)那些純Ajax的framework太重量級了。我要的只是一些簡(jiǎn)單的應用而已。于是尋覓的重點(diǎn)放在了一些對xmlhttpRequest進(jìn)行輕量級包裝的代碼庫上了。于是我找到了DWR(Direct Web Remoting)。DWR的口號是AJAX and XMLHttpRequest made easy,并且它也基本上做到了這一點(diǎn)。它提供了一個(gè)友好的框架和一些很有用的JavaScript庫,可以讓我用起Ajax更容易些。詳細的信息可以到他們的網(wǎng)站http://www.getahead.ltd.uk/dwr/。順便在介紹一個(gè)網(wǎng)站吧:http://www.ajaxmatters.com 這里也有很多關(guān)于Ajax的資源。
下面來(lái)簡(jiǎn)單介紹一下DWR。
其實(shí)在沒(méi)有XMLHttpRequest前DWR就有了,那時(shí)它用的是IFrame,效果很差,所以我看看了就沒(méi)有再diao它?,F在的DWR主要用XMLHttpRequest,當然也可以選者用IFrame,但是不推薦。
DWR是個(gè)open source software,授權方式是 ASL version 2.0的?,F在網(wǎng)站上examples and tutorials做的也不錯。我就根據這些東西自己也做了一個(gè)應用,在本文的后面我會(huì )詳細講到。
現在DWR的最新版本是1.0RC1。在我的試用環(huán)境相還算比較穩定,沒(méi)有出現什么問(wèn)題。
DWR本身以一個(gè)dwr.jar的jar包存在,它的入口時(shí)一個(gè)Servlet(uk.ltd.getahead.dwr.DWRServlet)所以要在web.xml里配置一下就可以了。具體配置看這里http://www.getahead.ltd.uk/dwr/intro.html。比較簡(jiǎn)單。dwr為我們提供了一個(gè)framework幫我們很容易的實(shí)現JavaScript和java之間的通信。
我還沒(méi)有看過(guò)dwr的源碼,具體他是怎么實(shí)現的我也不太清楚。但大致上肯定是通過(guò)xmlhttprequest來(lái)調用它的servlet然后把數據用xml打包解包了。其實(shí)我覺(jué)得這部分到不是dwr給我帶來(lái)的最方便的地方。最方便的地方應該是他的那些js的庫。
所以下面我要介紹一下它的兩個(gè)重要js對象。
DWREngine (engine.js中),DWRUtil (util.js中)。
DWREngine中的方法是基本上是關(guān)于XMLHttpRequest的。
下面中介紹一些
DWREngine.setErrorHandler(handler)
默認的錯誤處理時(shí)彈出一個(gè)對話(huà)框,你可以通過(guò)這個(gè)方法改變成你需要的表現形式。
DWREngine.setWarningHandler(handler)
改變默認的警告處理形式
DWREngine.beginBatch()
Some Remote Function…
DWREngine.endBatch()
當你有幾個(gè)遠程調用要一起進(jìn)行時(shí),就要用到這兩個(gè)方法。
如果不用這兩個(gè)方法,你就會(huì )發(fā)現你的遠程調用并不以你想象的順序進(jìn)行。
DWREngine中還有一些其它的方法,我沒(méi)有用過(guò)。你可以通過(guò)dwr的js-doc來(lái)看。如果通過(guò)文檔看不懂它是干什么用的,就看js源碼,源碼的注釋也是比較詳細的。
DWRUtil中也有一些很有用的方法。這些方法一般是編寫(xiě)js的輔助方法。
比如setValue和getValue。大多數html標簽有value屬性,這時(shí)你要獲取或者設置它的值時(shí)就用$(“someid”).value就可以了。但是有些html標記是沒(méi)有value屬性的,它的值時(shí)在標簽的中間,如<span id=”span1”>some value</span>這時(shí)你要取或設它的值的時(shí)候就用DWRUtil.setValue($(“span1”),someValue)。這樣你就可以在客戶(hù)端動(dòng)態(tài)的表現一些數據了。
還有很多很好用的方法,dwr的例子中有一些說(shuō)明,源碼中的注釋也比較詳細。
Dwr就介紹到這里吧。下一篇,我做了個(gè)table的例子。
posted on 2005-08-08 13:26
黑靈 閱讀(3313)
評論(11) 編輯 收藏 所屬分類(lèi):
AJAX 
FeedBack:2005-11-23 16:04 |
感覺(jué)dwr的xml配置還是過(guò)于煩瑣
回復 更多評論 2006-06-12 18:43 |
類(lèi)似這種框架現在已經(jīng)有了不少,如做的非常不錯的有echo2,wingS,WidgetServer等,都要比這個(gè)swilet更加完善一些。但是我并不看好這種封裝。如果你的整個(gè)項目都是用Ajax來(lái)實(shí)現的,以上框架倒是一個(gè)不錯的選擇,但是一旦遇到一些原框架中不支持的需求,擴展以來(lái)就比較麻煩了。如果要用一些MVC的Framework,如WebWork,Struts,JSF等,以上這些架構基本上是不能用的。而且我覺(jué)得學(xué)習DWR這樣的Ajax框架,學(xué)習曲線(xiàn)已經(jīng)很低了,一個(gè)正常的程序員半天時(shí)間足夠了,沒(méi)必要再封裝了,失去得靈活性太得不償失了。
回復 更多評論 2006-06-13 12:18 |
我覺(jué)得ajax只是他那個(gè)swilet的實(shí)現方式,并不是最重要的。
它主要的思想是將web開(kāi)發(fā)轉化為swing程序開(kāi)發(fā),不需要各種xml,jsp,action等配置。將傳統web的提交響應的機制轉化為組件開(kāi)發(fā)與事件處理機制。因為大家都有感受,用cs開(kāi)發(fā)程序比bs開(kāi)發(fā)簡(jiǎn)單,迅速吧。
回復 更多評論 2006-06-13 16:54 |
我也認為把組件開(kāi)發(fā)與事件處理機制的思想用到BS開(kāi)發(fā)上確實(shí)是一個(gè)不錯的方式,但是那只是一種方式,并不是完美的解決方案。JSF是這種方式在J2EE領(lǐng)域里的標準實(shí)現,但是在應用開(kāi)發(fā)過(guò)程中還是有很多問(wèn)題,并沒(méi)有比原來(lái)的方式提高開(kāi)發(fā)效率。我前一段時(shí)間看到一片文章,SUN的那群人在考慮Ajax和JSF更好的整合,要實(shí)現JSF組件通過(guò)Ajax的方式實(shí)現組件單獨更新,就像Swing那樣。我覺(jué)得如果能夠實(shí)現的話(huà),JSF就酷了。
回復 更多評論 2006-06-13 19:40 |
我覺(jué)得用組件開(kāi)發(fā)與事件處理機制的思想應該是web開(kāi)發(fā)的一個(gè)趨勢,畢竟像pb與delphi或是swing的這種開(kāi)發(fā)方式來(lái)開(kāi)發(fā),比用struts這種mvc的結構開(kāi)發(fā)要簡(jiǎn)單直接很多。asp.net與jsf都是這種思路,其他的echo2,wingS也都是這樣的思路。這樣可能會(huì )犧牲一些運行效率,但提高的是開(kāi)發(fā)效率,在某些場(chǎng)合是非常值得的。不過(guò)java的這些架構都沒(méi)有好的開(kāi)發(fā)工具支持,如果有像asp.net那樣的開(kāi)發(fā)工具支持,這種架構一定會(huì )比struts,webwork那些更好用。
我覺(jué)得jsf缺的是工具與控件,尤其是那些復雜的樹(shù)表格之類(lèi)和那些數據敏感控件。沒(méi)有這些,即使用ajax來(lái)實(shí)現,沒(méi)有好的工具,可能還是不好用。
回復 更多評論 2006-06-13 20:41 |
這點(diǎn)我也同意,其實(shí)我非常喜歡Asp.net,用VS開(kāi)發(fā)中小型系統開(kāi)發(fā)效率要比Java的解決方案高很多。JSF的學(xué)習曲線(xiàn)太高了,又沒(méi)有很好的工具支持,SunCreator還有點(diǎn)VS的意識,但是還是像玩具。至于控件其實(shí)MyFaces和ADF已經(jīng)很多了,現在也逐漸有了一些商業(yè)控件。
回復 更多評論 2006-12-12 15:52 |
我的代碼如下:
var getid = function(sortstr) { return sortstr.id };
var getName = function(sortstr) { return sortstr.sortName };
var getDelete= function(sortstr) { return "<input type=\"button\" value=\"刪除\"\/>"; };
DWRUtil.addRows("sb", sortstr, [ getName,getDelete ]);
本來(lái)想在表格里輸出一個(gè)刪除按鈕
但結果把原碼輸出來(lái)了,
請問(wèn)怎么回事,怎么解決?
回復 更多評論