轉載請注明原文地址:http://www.cnblogs.com/ygj0930/p/6686115.html
一:DWR的用途
DWR(Direct Web Remoting)是一個Web遠程調用框架,會根據java類動態生成javascript代碼。
二:DWR實現Ajax的原理
DWR是基於遠程過程調用的組件,可以在瀏覽器端遠程調用服務端的業務函數,並獲取返回結果。而我們知道,瀏覽器端是不能直接運行Java代碼的,但是可以運行JavaScript代碼。DWR的作用就是:把服務端的業務函數轉化成JS函數,然后在頁面導入js文件,像使用普通JS函數一樣調用。而頁面在觸發該函數時,就向服務端發出請求,服務器根據轉換映射關系調用相應業務函數,並把結果返回個頁面端的JS函數調用處。這樣沒有引發頁面跳轉,所以也是Ajax。
三:DWR使用步驟
(1)下載dwr.jar(核心包)、commons-logging-1.0.4.jar(依賴包),並放置在web項目WEB-INF/lib下面。
下載地址:http://download.csdn.net/detail/qq_28745795/9847205
(2)在web.xml中配置DWR組件,DWR相當於是一個servlet;
<servlet> <servlet-name>MyDWR</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>MyDWR</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping>
(3)定義異步處理函數類AjaxService,在其中定義一系列函數進行業務處理並返回結果;
(4)在與web.xml同目錄下創建dwr.xml,配置AjaxService類的哪些方法、哪個DTO通過DWR“轉換”成JS函數、JS對象給前端使用;
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd"> <dwr> <allow> <filter class="org.directwebremoting.filter.AuditLogAjaxFilter" /> <!-- AjaxService類的轉換 --> <create creator="new" javascript="_AjaxService_js">//轉換得到的JS對象名,供前端調用方法時使用 <param name="class" value="demo.AjaxService" /> <include method="ajax1"/>//把哪些函數進行轉換,配置方法名即可 <include method="ajax2"/> <include method="ajax3"/> </create> (上面的內容,我們只需寫 javascript、value、include三者內容即可,其他照抄) <!-- 實體類的轉換:把一個DTO轉換成JS對象供前端使用,一般很少用 --> <convert converter="bean" match="model.AjaxDTO"> <param name="include" value="username,name" />//把DTO的哪些屬性提取出來轉換成一個JS對象 </convert> </allow> </dwr>
<create>標簽中指定javascript中可以訪問的java類,並定義DWR應當如何獲得要進行遠程的類的實例。
creator="new"屬性指定java類實例的生成方式,new意味着DWR應當調用類的默認構造函數來獲得實例。
javascript=""屬性指定javascript代碼進行函數調用時使用的對象名稱。
<param>標簽指定要公開給javascript的java類名。
<include>標簽指定要公開給javascript的方法。不指定的話就公開所有方法。
<convertor>標簽負責配置方法的參數和返回類型。告訴DWR在服務器端Java 對象表示和序列化的JavaScript對象之間如何轉換。
converter="bean"屬性指定轉換的方式采用JavaBean命名規范
match=""屬性指定要轉換的javabean相對路徑下名稱
<param>標簽指定要轉換的JavaBean的屬性,可以不把所有屬性都轉換,自己定制。
(5)最最關鍵的一步:在WebRoot下,新建一個文件夾叫dwr,然后從dwr.jar中找到engine.js和util.js 或 從 http://download.csdn.net/detail/qq_28745795/984719 下載這兩個js文件,放入dwr文件夾中。
(6)在前端頁面代碼中導入DWR的JS引擎以及上面dwr.xml中AjaxService轉換得到的JS函數文件,就可在js中通過轉換后的函數名直接調用方法了。
<!-- 導入dwr的JS引擎與工具 --> <script type="text/javascript" src="/項目名/dwr/engine.js"></script> <script type="text/javascript" src="/項目名/dwr/util.js"></script>
<script type="text/javascript" src="/項目名/dwr/interface/_AjaxService_js.js"></script>//這個只是這樣寫,實際上是運行期間服務器通過dwr動態生成的
四:頁面中調用轉換后方法:傳參與回調
1:傳參調用:通過 轉換后對象名.方法名(參數列表,回調函數名) 的格式進行函數調用
AjaxService_js.ajaxMethodName(parameters,callback);
2:回調接收結果:定義回調函數,回調函數的形參接收上面函數調用的返回值
function callback(data){
//data就是函數調用返回值,進行處理。在JS中,函數的形參變量是根據實際值來決定類型的,所以這里的data可以接收返回的普通類型、JavaBean、集合類等 }