DWR原理探祕

ajax 是Asynchronous JavaScript and XML的簡稱,是一種由javascript通過XmlHttpRequest與服務器交互更新數據的一種異步請求的技術,因爲通過ajax你只需傳遞需要更新的數據,而不是整個頁面,能有效的減少頁面和服務器端的數據傳輸,通過javascript更新頁面時可以做到頁面不刷新,所以ajax很適合用於局部頻繁更新的頁面。

我一直都對ajax提不起興趣,理由很簡單,也很偏激:我是一個java狂熱者,並固執的認爲java最好的用途就是在中間件上,還有java代碼能帶給系統很好的重用性和可維護性。而ajax處理的方面卻是在最不被我看上的表示層上,而表示層一般都不被我係統的考慮範圍之內,覺得這是系統的外衣,是有可能要經常變換的。所以縱是很早之前就已經知道有ajax,但一直沒有更深的去了解它。

事實上在ajax 這個概念提出來之前,我們已經在項目中採用了相同的技術,我們大多的做法是通過增加一個隱含的iFrame,通過iFrame向服務器提交請求獲取數據和頁面進行交互,這完全的實現了ajax的功能,但這種做法很繁瑣,實現起來工作量也很大,而且在代碼上也會相當的冗餘,不怎麼優美。而ajax的java 框架dwr使這一過程變得簡單,在此特別感謝Getahead IT諮詢公司的Joe Walker和他的團隊開發出DWR這樣神奇的工具並與大家分享它!

現在我們來看看dwr是怎麼處理相應的關係的

ajax是通過javascript向服務器發出請求來獲取相應的數據的,所以首先,dwr需要你在web部署了一個servlet--DWRServlet,DWRServlet在初始化的時候會去讀dwr的發佈文件/WEB-INF/dwr.xml

在解釋dwr.xml文件之前我們先來看看兩個重要的概念,creator和converter這兩個從它們的字面意義就很容易看出它們的作用
creator在dwr中主要的職責就是把用戶發佈在dwr.xml中的class進行實例化,
converter的職責是在接受請求時把客戶端的javascript對象轉換成服務器端的java對象,通過調用發佈的java bean後,在把返回的java的對象轉化成javascript的對象給客戶端調用

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創建和轉換的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創建的,其包含creator,javascript,creator也是通過init元素進行定義的,creator還有一個javascript的屬性,其定義的值就是在javascript中對應的對象名稱
convert就是配置哪些java bean是可以通過dwr轉換的,其包含converter,match屬性,coverter就是選擇轉換的converter由init中配置,match就是可以轉換的java bean

dwr 已經爲你提供了大量的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中,並把要發佈的bean和method放到creators中,

如果你使用dwr的測試頁面,你還可以得到一個以你配置的js文件,js文件對你配置的creator和method進行了映射,其中的planApp是你發佈的scriptName,get是發佈調用的class方法,p0是方法傳入的參數,callback是處理判斷成功的標誌。
planApp.get = function(p0, callback) {
    DWREngine._execute(planApp._path, 'planApp', 'get', p0, callback);
}


現在我們看看dwr在頁面上怎樣跟服務器交互,dwr爲我們提供了一個叫engine.js文件中定義一個DWREngine的javascript對象,其主要功能是處理頁面和servlet之間的數據傳遞和轉換。當中有三個函數需要特別的留意

1、_execute由界面的javascript調用根據傳入的參數進行一系列的初始化,並調用調用endBatch調用_sendData與服務器的servlet進行交互
其傳入的參數主要有
path——在/WEB-INF/web.xml配置的url-pattern,
scriptName——/WEB-INF/dwr.xml中creator的javascript的名稱,
methodName——creator的方法名,
vararg_params——傳進的值和一些控制參數

2、 _sendData dwr通過這個方法對傳入的參數生成與servlet進行交互的javascript語句,它做了很多的工作以保證你的提交是真正的有效,比如判斷客戶的瀏覽器是支持XMLHttpRequest還是支持ActiveXObject,如果兩種方式都不行它還會採取iFrame提交的方式與服務器進行交互獲取數據

3、_stateChange DWREngine在判斷數據傳輸完成之後,會根據返回的字符串構造成一個對象 

你可以通過修改下面的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的處理的方法,具體的使用就不在這裏說明。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章