中科院计算所职业培训中心杨少波trainict@sohu.comDWR框架技术DWR框架技术在本讲中您能了解如下知识点为什么要提出DWR框架DWR的工作原理及各种组件DWR的主要组成部分及职责应用DWR的主要开发过程1、使用AJAX技术时的实现难度(1)使用AJAX时,要求开发者必须要对各种前台技术非常了解(2)详细学习Ajax时的“低级”编码并不是那么容易由于不同的浏览器是以稍微不同的方式实现XMLHttpRequest对象。同一浏览器(例如IE)的不同版本z在实现该对象的方式上也不同。另外对于不同的浏览器和版本对JavaScript的支持也是不同的,因此也给我们的应用开发增加了复杂度。这对于一个普通的Java程序员来说,这种要求是有点过分了!因此,如何使普通的Java程序员快速进行基于AJAX的开发呢,那么就要求我们使用一些AJAX框架,来屏蔽各种前台技术。(4)特别是类似于跨浏览器的DOM编程实现的兼容性问题这将会导致在编码和调试Javascript代码上面花费很多时间,这显然对开发者来说很不合算的。(3)XML请求和响应在客户端浏览器和服务器后端之间传输的标准化问题由于缺乏关于数据应该如何通过XML请求和响应在浏览器代码和服务器后端之间传输的标准化,因而事情更加复杂---目前只利用DOM,但DOM解析比较复杂!我们如何避免出现这样的问题?(5)直接使用XmlHttpRequest对象创建异步请求也是比较麻烦的我们的JavaScript代码不仅冗长,而且还必须考虑客户端所可能的各种版本的浏览器、以及如何获得服务器端的返回结果。设置回调识别状态等错误处理等目前在Java平台中比较好的AJAX框架,应该属DWR(DirectWebRemoting)框架。2、DirectWebRemoting(DWR)框架(2)它可以允许在JavaScript中直接访问服务器端的JavaBean组件(也就是业务组件)中的方法。(1)DWR(直接Web远程控制)项目是在Apache许可下的一个开源的AJAX技术的解决方案(3)使用DWR非常像传统的RPC机制但客户端的为JavaScript由于在DWR中采用了一种“新方法”来动态生成基于JAVA类的JavaScript代码,这样WEB开发人员就可以在JavaScript里使用Java代码-----就像它们是浏览器的本地代码(客户端代码)一样。3、DWR的工作原理说明(1)右图展示了DWR是如何简化Ajax编程基于Java类(可以为各种JavaBean)动态地生成JavaScript代码我们需要在页面中包含这些函数库我们需要在Web应用中部署该组件(2)DWR的工作原理由于JavaBean对象被远程化了----将服务器端的某个JavaBean组件(可以为业务组件或者业务实体组件)转换为JavaScript中对象,所以该数据是自动变得对运行在客户机浏览器上的JavaScript代码可用。但在幕后,DWR则自己通过向浏览器提供的XMLHttpRequest对象向其自己的运行在应用服务器上的后台组件发出异步调用。(3)DWR是一个引擎以帮助我们简化对AJAX技术的应用DWR是一种AJAX(AsynchronousJavaScriptandXML)的JAVA实现,它提供了一种能在Web浏览器端采用JavaScript语言直接调用后台业务商业组件的解决方案。同时能够动态生成JavaScript代码和隐藏http协议的细节。4、应用DWR技术所带来的主要优点(1)DWR通过JavaScript直接调用远程组件可以减少应用AJAX的Web开发的时间这特别对于那些需要和用户频繁交互的Web应用程序----DWR使得浏览器不用刷新页面就可以从远程Web服务器取得用户需的数据(本质为AJAX技术)这种无刷新页面的交互方式大大提高Web页面的响应时间。(2)具有良好的浏览器的兼容性DWR采用浏览器端的纯JavaScript实现并提供了良好的兼容性并且会自动根据浏览器类型采用最高效率的远程组件调用机制。(3)减少了在页面中的JavaScript脚本代码的数量。5、DWR中两个标准的组件(1)一个是运行在用户浏览器上的JavaScript库(如utils.js和engine.js等6、主要的JavaScript库(*.js文件)(1)engine.js和util.js(2)另一个则是运行在应用服务器上的Servlet组件注意:不同版本的DWR,该Servlet是不同的。DWR1.1版:uk.ltd.getahead.dwr.DWRServletDWR2.0版:org.directwebremoting.servlet.DwrServlet(2)在JavaScript中使用DWR的JavaScript库的方法7、DWR的实现机制及各个组件的职责(1)DWR主要组成部分我们需要在页面中包含这些函数库(2)DWR前台引擎(Engine.js)的主要职责截取每个后台组件的请求实现客户端的统一入口,将用于组件调用的JS参数对象重新包装组合;检测客户端浏览器的环境并选择最佳的数据提交方案,处理后台执行结果并通过执行回调函数通知客户(3)后台控制器(DWRServet)的主要职责完成DWR的初始化和DWR的配置参数文件的加载,以达到对后台业务组件调用的服务器端的统一入口。实现对客户端的各种不同类型的请求(如JS文件和业务调用请求)的分发最后再实现输出后端组件执行的结果(JavaScript语句)到客户端浏览器(4)业务组件执行器的主要职责根据配置文件的参数确定后台组件的访问规则和生命周期拆包由前台页面中的JavaScript所传入的参数并且包装后端服务器组件的执行结果按参数类型匹配数据类型转换器,并采用反射机制执行业务组件的对应方法以处理客户端的请求处理与其他系统的接口和协作如:SpringHibernate等(5)数据类型转换器的主要职责将一系列单个的参数转换成对应的Java对象(JavaScript--Java)将Java对象转换成JavaScript对象(Java—JavaScript)8、DWR的开发过程----详细过程请见文档中的说明(1)下载和安装DWR的系统包(2)将DWR的系统包的dwr.jar放到Web应用中的lib目录(3)在Web应用的web.xml中部署其uk.ltd.getahead.dwr.DWRServlet不同版本的DWR,该Servlet是不同的(4)通过dwr.xml文件配置我们的JavaBean组件(5)在Web页面中使用远程JavaBean中的方法(6)将出现下面的提示结果本讲的回顾孔子说:“学而不思则罔,思而不学则殆。”