DWR

DWR(Direct Web Remoting)是Java和JavaScript相結合的開源庫,通過它可以簡單、容易地構建Ajax程序,開發者無需瞭解 XMLHttpRequest的編碼細節。通過客戶端的JavaScript採用看似調用瀏覽器本地代碼的方法來調用服務器端的代碼,這即是DWR中“直 接”的含義。DWR的顯著特徵就是提供服務端代碼視爲瀏覽器中JavaScript代碼的方法。本質上DWR就是一種RPC(Remote Procedure Call,遠程過程調用)。RPC的基本概念可以追溯到1976年(RFC707),並於1981年由施樂公司首次用於商業應用,當前流行的Java RMI、Microsoft .NET Remoting、Web Service,以及稍早些的CORBA都沿用了1976年建立的RPC基本概念,同時RPC還是Sun NFS的基礎。所謂RPC就是一種在一個地址空間上執行的代碼,執行另一個地址空間或共享網絡上子程序或者過程的機制。調用方程序員在實現該機制時不需要 自己編寫實現遠程交互的代碼。無論調用對象實在本地還是遠程都編寫同樣的代碼。遠程調用或遠程方法調用與RPC含義相同,前者是在面向對象環境下的叫法。

RPC的體系結構如下圖所示:

在RPC中,客戶端發出調用,藉助某種代理存根函數或對象,通過底層RPC庫發出請求,被調用代碼在另一臺計算機上,請求會通過一些網絡協議發送到 遠程計算機,在RPC庫中,服務端組件接收請求,通過代理存根對象(實現中這個代理存根常常省略,其功能被服務端RPC組件合併)傳遞到目的地,服務代碼 執行後,結果按相反流程返回。對調用者而言,遠程代碼接口等同於本地進程空間所運行代碼的接口,遠程交互透明地進行。

具體到DWR的是現機理可以參照下圖。

其中populateList()是回調函數,它將作爲參數傳遞給getOptions(),當getOptions()的遠程調用結果返回後,此 函數會被自動調用,以處理返回數據。顯然本地getOptions()函數相對於服務端getOptions()多了一個回調函數參數,藉助此參數就實現 了異步處理過程。

在服務端DWR的主體是DWRServlet類,它將基於Java類自動生成JavaScript對象。具體生成過程是:

如果下載到瀏覽器的HTML頁面中包含如下腳本

<script type="text/javascript" src="[WEBAPP] /dwr/interface/AjaxService.js"> </script>

那麼瀏覽器解析執行頁面時會像相應的URI發出請求,在服務端web.xml配置中,該URI是映射到DWRServlet的。

 

------- web.xml -------------

DWRServlet收到請求會依據dwr.xml中配置的映射關係自動檢查Java類your.java.AjaxService,並生成代表該類的JavaScript文件,返回給瀏覽器,此文件包含的JavaScript對象即爲客戶端代理存根。

 

------- dwr.xml -------------

與DWRServlet相對應,客戶端的DWR核心是engine.js,它通過嵌入HTML頁面中的腳本

<script src='/[YOUR-WEBAPP]/dwr/engine.js'></script>

被瀏覽器下載到本地。engine.js中包含的JavaScript庫用於將來自於動態生成的代理存根的調用組裝爲服務器上真正的對象,負責完成 遠程通信和調用過程。engine.js會輸出DWREngine對象,通過它用戶可以配置客戶端同服務端通信的具體方式,比如:同步還是異步、採用 Http傳輸方法、rpcType、超時等參數。

此外HTML頁面中通常還會嵌入<script src='/[YOUR-WEBAPP]/dwr/util.js'></script>,util腳本作爲工具集將輔助對數據的處理,比如動態刷新頁面。

綜上,具體到DWR技術而言,RPC的基本工作流程可以描述如下:

發佈了49 篇原創文章 · 獲贊 8 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章