DWR 簡介
從最簡單的角度來說,DWR 是一個引擎,可以把服務器端 Java 對象的方法公開給 Javascript 代碼。使用 DWR 可以有效地從應用程序代碼中把 AJax 的全部請求-響應循環消除掉。這意味著客戶端代碼再也不需要直接處理 XMLHttpRequest 對象或者服務器的響應。不再需要編寫對象的序列化代碼或者使用第三方工具才能把對象變成 XML。甚至不再需要編寫 servlet 代碼把 AJax 請求調整成對 Java 域對象的調用。
DWR 是一個開放源碼的使用 apache 許可協議的解決方案,它包含服務器端 Java 庫、一個 DWR servlet 以及 Javascript 庫。雖然 DWR 不是 Java 平台上唯一可用的 AJax-RPC 工具包,但是它是最成熟的,而且提供了許多有用的功能。
DWR 是作為 Web 應用程序中的 servlet 部署的。把它看作一個黑盒子,這個 servlet 有兩個主要作用:首先,對於公開的每個類,DWR 動態地生成包含在 Web 頁面中的 JavaScript。生成的 Javascript 包含存根函數,代表 Java 類上的對應方法並在幕後執行 XMLHttpRequest。這些請求被發送給 DWR,這時它的第二個作用就是把請求翻譯成服務器端 Java 對象上的方法調用並把方法的返回值放在 servlet 響應中發送回客戶端,編碼成 Javascript。DWR 還提供了幫助執行常見的用戶界面任務的 JavaScript 工具函數。
關於示例
在更詳細地解釋 DWR 之前,我要介紹一個簡單的示例場景。像在前一篇文章中一樣,我將采用一個基於在線商店的最小模型,這次包含一個基本的產品表示、一個可以包含產品商品的用戶購物車以及一個從數據存儲查詢產品的數據訪問對象(DAO)。Item 類與前一篇文章中使用的一樣,但是不再實現任何手工序列化方法。圖 1 說明了這個簡單的設置:
圖 1. 說明 Cart、CatalogDAO 和 Item 類的類圖
在這個場景中,我將演示兩個非常簡單的用例。第一,用戶可以在目錄中執行文本搜索並查看匹配的商品。第二,用戶可以添加商品到購物車中並查看購物車中商品的總價。
實現目錄
DWR應用程序的起點是編寫服務器端對象模型。在這個示例中,我從編寫 DAO 開始,用它提供對產品目錄數據存儲的搜索功能。CatalogDAO.java 是一個簡單的無狀態的類,有一個無參數的構造函數。清單 1 顯示了我想要公開給 AJax 客戶的 Java 方法的簽名:
清單 1. 通過 DWR 公開的 CatalogDAO 方法
/** * Returns a list of items in the catalog that have * names or descriptions matching the search expression * @param expression Text to search for in item names * and descriptions * @return list of all matching items */ public List<Item> findItems(String expression); /** * Returns the Item corresponding to a given Item ID * @param id The ID code of the item * @return the matching Item */ public Item getItem(String id);
接下來,我需要配置 DWR,告訴它 AJax 客戶應當能夠構建 CatalogDAO 並調用這些方法。我在清單 2 所示的 dwr.XML 配置文件中做這些事:
清單 2. 公開 CatalogDAO 方法的配置
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd"> <dwr> <allow> <create creator="new" Javascript="catalog"> <param name="class" value="developerworks.ajax.store.CatalogDAO"/> <include method="getItem"/> <include method="findItems"/> </create> <convert converter="bean" match="developerworks.AJax.store.Item"> <param name="include" value="id,name,description,formattedPrice"/> </convert> </allow> </dwr>
dwr.XML 文檔的根元素是 dwr。在這個元素內是 allow 元素,它指定 DWR 進行遠程的類。allow 的兩個子元素是 create 和 convert。