| ajax是Asynchronous JavaScript and XML的簡(jiǎn)稱(chēng),是一種由javascript通過(guò)XmlHttpRequest與服務(wù)器交互更新數據的一種異步請求的技術(shù),因為通過(guò)ajax你只需傳遞需要更新的數據,而不是整個(gè)頁(yè)面,能有效的減少頁(yè)面和服務(wù)器端的數據傳輸,通過(guò)javascript更新頁(yè)面時(shí)可以做到頁(yè)面不刷新,所以ajax很適合用于局部頻繁更新的頁(yè)面。 我一直都對ajax提不起興趣,理由很簡(jiǎn)單,也很偏激:我是一個(gè)java狂熱者,并固執的認為java最好的用途就是在中間件上,還有java代碼能帶給系統很好的重用性和可維護性。而ajax處理的方面卻是在最不被我看上的表示層上,而表示層一般都不被我系統的考慮范圍之內,覺(jué)得這是系統的外衣,是有可能要經(jīng)常變換的。所以縱是很早之前就已經(jīng)知道有ajax,但一直沒(méi)有更深的去了解它。 事實(shí)上在ajax 這個(gè)概念提出來(lái)之前,我們已經(jīng)在項目中采用了相同的技術(shù),我們大多的做法是通過(guò)增加一個(gè)隱含的iFrame,通過(guò)iFrame向服務(wù)器提交請求獲取數據和頁(yè)面進(jìn)行交互,這完全的實(shí)現了ajax的功能,但這種做法很繁瑣,實(shí)現起來(lái)工作量也很大,而且在代碼上也會(huì )相當的冗余,不怎么優(yōu)美。而ajax的java 框架dwr使這一過(guò)程變得簡(jiǎn)單,在此特別感謝Getahead IT咨詢(xún)公司的Joe Walker和他的團隊開(kāi)發(fā)出DWR這樣神奇的工具并與大家分享它! 現在我們來(lái)看看dwr是怎么處理相應的關(guān)系的 ajax是通過(guò)javascript向服務(wù)器發(fā)出請求來(lái)獲取相應的數據的,所以首先,dwr需要你在web部署了一個(gè)servlet--DWRServlet,DWRServlet在初始化的時(shí)候會(huì )去讀dwr的發(fā)布文件/WEB-INF/dwr.xml 在解釋dwr.xml文件之前我們先來(lái)看看兩個(gè)重要的概念,creator和converter這兩個(gè)從它們的字面意義就很容易看出它們的作用 creator在dwr中主要的職責就是把用戶(hù)發(fā)布在dwr.xml中的class進(jìn)行實(shí)例化, converter的職責是在接受請求時(shí)把客戶(hù)端的javascript對象轉換成服務(wù)器端的java對象,通過(guò)調用發(fā)布的java bean后,在把返回的java的對象轉化成javascript的對象給客戶(hù)端調用 dwr.xml有兩個(gè)主要的元素:init,arrow init是用來(lái)定義你可以使用的converter和creator它們都有一個(gè)id和class的屬性:id是一個(gè)標志可以在arrow元素中被引用于配置create和convert的,class是具體的類(lèi),的其定義樣式如下: <creator id="new" class="uk.ltd.getahead.dwr.create.NewCreator"/> <converter id="bean" class="uk.ltd.getahead.dwr.convert.BeanConverter"/> arrow是用于定義你允許dwr創(chuàng )建和轉換的java bean,包含兩種類(lèi)型:create和convert。其標簽樣式如下: <create creator="new" javascript="planApp"> <param name="class" value="com.ionglobal.erp.app.PlanApp" /> </create> <convert converter="servlet" match="javax.servlet.ServletConfig"/> create就是配置哪些類(lèi)是可以由dwr創(chuàng )建的,其包含creator,javascript,creator也是通過(guò)init元素進(jìn)行定義的,creator還有一個(gè)javascript的屬性,其定義的值就是在javascript中對應的對象名稱(chēng) convert就是配置哪些java bean是可以通過(guò)dwr轉換的,其包含converter,match屬性,coverter就是選擇轉換的converter由init中配置,match就是可以轉換的java bean dwr 已經(jīng)為你提供了大量的creator和converter如:jsf,none,new,pageflow,spring,script,struts這幾種creator,和null,enum,primitive,bignumber,string,array,map,collection, date,dom,dom4j,jdom,xom,servlet,bean,object,hibernate這幾種convertor 如果你覺(jué)得dwr提供的creator和converter還不能滿(mǎn)足你的需求時(shí)還可以定制自己的creator和converter把它們部署到dwr.xml中,并把要發(fā)布的bean和method放到creators中, 如果你使用dwr的測試頁(yè)面,你還可以得到一個(gè)以你配置的js文件,js文件對你配置的creator和method進(jìn)行了映射,其中的planApp是你發(fā)布的scriptName,get是發(fā)布調用的class方法,p0是方法傳入的參數,callback是處理判斷成功的標志。 planApp.get = function(p0, callback) { DWREngine._execute(planApp._path, 'planApp', 'get', p0, callback); } 現在我們看看dwr在頁(yè)面上怎樣跟服務(wù)器交互,dwr為我們提供了一個(gè)叫engine.js文件中定義一個(gè)DWREngine的javascript對象,其主要功能是處理頁(yè)面和servlet之間的數據傳遞和轉換。當中有三個(gè)函數需要特別的留意 1、_execute由界面的javascript調用根據傳入的參數進(jìn)行一系列的初始化,并調用調用endBatch調用_sendData與服務(wù)器的servlet進(jìn)行交互 其傳入的參數主要有 path——在/WEB-INF/web.xml配置的url-pattern, scriptName——/WEB-INF/dwr.xml中creator的javascript的名稱(chēng), methodName——creator的方法名, vararg_params——傳進(jìn)的值和一些控制參數 2、 _sendData dwr通過(guò)這個(gè)方法對傳入的參數生成與servlet進(jìn)行交互的javascript語(yǔ)句,它做了很多的工作以保證你的提交是真正的有效,比如判斷客戶(hù)的瀏覽器是支持XMLHttpRequest還是支持ActiveXObject,如果兩種方式都不行它還會(huì )采取iFrame提交的方式與服務(wù)器進(jìn)行交互獲取數據 3、_stateChange DWREngine在判斷數據傳輸完成之后,會(huì )根據返回的字符串構造成一個(gè)對象 你可以通過(guò)修改下面的javascript語(yǔ)句獲取返回的javascript對象和你的頁(yè)面進(jìn)行交互顯示
<script type='text/javascript'> var reply0 = function(data) ...{ if (data != null && typeof data == 'object') alert(DWRUtil.toDescriptiveString(data, 2)); else DWRUtil.setValue('d0', DWRUtil.toDescriptiveString(data, 1)); } </script>
在util.js文件定義了一個(gè)DWRUtil對象,里面主要有對select的處理和table的處理的方法,具體的使用就不在這里說(shuō)明。 |