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