176142998

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  116 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks
  DWR(直接Web远程控制)项目是在Apache许可下的一个开源的解决方案,它提供了一种简单的方式使得HTML页面上的javascript可以访问应用服务器的Java对象方法,是Ajax开发者可以方便使用的一个优雅框架。DWR具有一套Javascript功能集,它们把从HTML页面调用应用服务器上的Java对象的方法简化,操控不同类型的参数,同时保持了HTML代码的可读性。DWR实现的AJAX在某些方面很先进,包括动态生成javascript代码;隐藏http协议等。

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/*所有请求都由这个servlet来处理。
DWRServlet init()主要做了以下工作:
1实例化DWR用到的Singleton类:AccessControl,Configuration,ConverterManager,CreatorManager,Processor
2 读去配置文件:包括dwr.jar包中的dwr.xml,WEB-INF/dwr.xml,web.xml。
WEB-INF/dwr.xml文件告诉DWR哪些服务是要直接向JavaScript代码公开的,以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会根据此自动生成对应的JDate.js文件。new意味着DWR调用类的构造函数获得实例,还可以通过跟Spring集成达到该目的。

DWRServlet的doGet和doPost均直接调用Processor的handle方法处理,handle处理的/dwr/*请求包含以下几类:
1 dwr/index.html,dwr/test/只能在debug模式下供调试用
2 对dwr/engine.js,dwr/util.js,dwr/deprecated.js的请求调用,直接从包中读取相应的js文件流响应回去,
并对相应做缓存处理,缓存以一个hashmap实现。
3 对dwr/interface/的请求调用,DWR生成跟Java对应的javascript存根,DWR通过ConverterManager自动调整Java和javacript的参数类型匹配。
4 客户端javascript的实际调用,将通过handler方法的doExec执行。

由此,DWR的运作流程是:
客户端包含3类javascript脚本
1 java代码的存根,即通过dwr/interface/调用,如<script type='text/javascript' src='dwr/interface/JDate.js'></script>
如上所述,该存根由DWR具体是CreatorManager和ConvertorManager根据dwr.xml的配置进行自动生成
2 DWR核心javascript库,至少要包含<script type='text/javascript' src='dwr/engine.js'></script>,有时也需要包含util.js,util.js封装了prototype的若干函数,便于第三方javascript调用
3 第三方javascript,该脚本需要调用第一类存根脚本所封装的Java代码,第二类的engine.js等脚本为该调用提供通信支撑。这样就达到了一个基本的RPC的目的,由于RPC本质上是同步进行,而AJAX的XMLHTTP为异步调用,为了实现异步机制,第三方javascript可以提供一个回调函数句柄传入存根,待存根函数返回调用该回调,这样即达到异步通信。
posted on 2008-08-12 16:41 飞飞 阅读(615) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: