DWR(直接Web遠(yuǎn)程控制)項(xiàng)目是在Apache許可下的一個(gè)開(kāi)源的解決方案,它提供了一種簡(jiǎn)單的方式使得HTML頁(yè)面上的javascript可以訪問(wèn)應(yīng)用服務(wù)器的Java對(duì)象方法,是Ajax開(kāi)發(fā)者可以方便使用的一個(gè)優(yōu)雅框架。DWR具有一套Javascript功能集,它們把從HTML頁(yè)面調(diào)用應(yīng)用服務(wù)器上的Java對(duì)象的方法簡(jiǎn)化,操控不同類型的參數(shù),同時(shí)保持了HTML代碼的可讀性。DWR實(shí)現(xiàn)的AJAX在某些方面很先進(jìn),包括動(dòng)態(tài)生成javascript代碼;隱藏http協(xié)議等。
web.xml配置:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> </servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
DWRServlet是DWR主Servlet,所有的/dwr/*所有請(qǐng)求都由這個(gè)servlet來(lái)處理。
DWRServlet init()主要做了以下工作:
1實(shí)例化DWR用到的Singleton類:AccessControl,Configuration,ConverterManager,CreatorManager,Processor
<create creator="new" javascript="JDate">
<param name="class" value="java.util.Date"/>
<exclude method="getHours"/>
<auth method="getMinutes" role="admin"/>
<auth method="getMinutes" role="devel"/>
</create>
DWR會(huì)根據(jù)此自動(dòng)生成對(duì)應(yīng)的JDate.js文件。new意味著DWR調(diào)用類的構(gòu)造函數(shù)獲得實(shí)例,還可以通過(guò)跟Spring集成達(dá)到該目的。
DWRServlet的doGet和doPost均直接調(diào)用Processor的handle方法處理,handle處理的/dwr/*請(qǐng)求包含以下幾類:
1 dwr/index.html,dwr/test/只能在debug模式下供調(diào)試用
由此,DWR的運(yùn)作流程是:
客戶端包含3類javascript腳本
web.xml配置:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> </servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
DWRServlet是DWR主Servlet,所有的/dwr/*所有請(qǐng)求都由這個(gè)servlet來(lái)處理。
DWRServlet init()主要做了以下工作:
1實(shí)例化DWR用到的Singleton類:AccessControl,Configuration,ConverterManager,CreatorManager,Processor
2 讀去配置文件:包括dwr.jar包中的dwr.xml,WEB-INF/dwr.xml,web.xml。
WEB-INF/dwr.xml文件告訴DWR哪些服務(wù)是要直接向JavaScript代碼公開(kāi)的,以DWR的test為例:<create creator="new" javascript="JDate">
<param name="class" value="java.util.Date"/>
<exclude method="getHours"/>
<auth method="getMinutes" role="admin"/>
<auth method="getMinutes" role="devel"/>
</create>
DWR會(huì)根據(jù)此自動(dòng)生成對(duì)應(yīng)的JDate.js文件。new意味著DWR調(diào)用類的構(gòu)造函數(shù)獲得實(shí)例,還可以通過(guò)跟Spring集成達(dá)到該目的。
DWRServlet的doGet和doPost均直接調(diào)用Processor的handle方法處理,handle處理的/dwr/*請(qǐng)求包含以下幾類:
1 dwr/index.html,dwr/test/只能在debug模式下供調(diào)試用
2 對(duì)dwr/engine.js,dwr/util.js,dwr/deprecated.js的請(qǐng)求調(diào)用,直接從包中讀取相應(yīng)的js文件流響應(yīng)回去,
并對(duì)相應(yīng)做緩存處理,緩存以一個(gè)hashmap實(shí)現(xiàn)。3 對(duì)dwr/interface/的請(qǐng)求調(diào)用,DWR生成跟Java對(duì)應(yīng)的javascript存根,DWR通過(guò)ConverterManager自動(dòng)調(diào)整Java和javacript的參數(shù)類型匹配。
4 客戶端javascript的實(shí)際調(diào)用,將通過(guò)handler方法的doExec執(zhí)行。由此,DWR的運(yùn)作流程是:
客戶端包含3類javascript腳本
1 java代碼的存根,即通過(guò)dwr/interface/調(diào)用,如<script type='text/javascript' src='dwr/interface/JDate.js'></script>
如上所述,該存根由DWR具體是CreatorManager和ConvertorManager根據(jù)dwr.xml的配置進(jìn)行自動(dòng)生成2 DWR核心javascript庫(kù),至少要包含<script type='text/javascript' src='dwr/engine.js'></script>,有時(shí)也需要包含util.js,util.js封裝了prototype的若干函數(shù),便于第三方j(luò)avascript調(diào)用
3 第三方j(luò)avascript,該腳本需要調(diào)用第一類存根腳本所封裝的Java代碼,第二類的engine.js等腳本為該調(diào)用提供通信支撐。這樣就達(dá)到了一個(gè)基本的RPC的目的,由于RPC本質(zhì)上是同步進(jìn)行,而AJAX的XMLHTTP為異步調(diào)用,為了實(shí)現(xiàn)異步機(jī)制,第三方j(luò)avascript可以提供一個(gè)回調(diào)函數(shù)句柄傳入存根,待存根函數(shù)返回調(diào)用該回調(diào),這樣即達(dá)到異步通信。