`
寻找出路的苍蝇
  • 浏览: 34400 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

DWR应用初探

阅读更多

    因工作需要,最近对DWR进行了探索性使用。在使用之前DWR的大名早就如雷贯耳了,但也只是仅闻其名而已,当时只知道它可通过JS直接调用JAVA对象方法,其它就一概不知了。实际应用DWR一段时后,对其了解比较深入,不禁被其优异的异步传输特性所折服,它能完全满足我在项目中应用AJAX的需求。

    GBP是我们的框架名称,它基于SSH,提供代码生成、基础组件调用等平台功能。在我们框架中引入DWR后,DWR代替struts充当控制层,用于接收用户请求,调用后台逻辑进行处理,最后将处理数据返回客户端。DWR全程处理从客户端到服务器端的所有传输细节。

下面是我在框架中使用DWR的一个初步总结,公布出来与大家共享。其中有很多内容是从网上查找资料学习到的,有些地方甚至是直接引用原文。

DWR 是什么

     DWR 是一个可以允许你去创建 AJAX WEB 站点的 JAVA 开源库,它可以通过浏览器端的 Javascript 代码去调用服务器端的 Java 代码,看起来就像是 Java 代码运行在浏览器上一样。 DWR 是一个完整的异步 AJAX 框架,它隐藏了 XMLHttpRequest 对象,程序员在开发过程中不需要接触 XMLHttpRequest 对象就可以向服务器发送异步请求并通过回调方式处理服务器的返回值。

    DWR 包含两个主要部分:

  •   运行在服务器端的 servlet 控制器 (DwrServlet) ,它负责接收请求,调用相应业务逻辑进行处理,向客户端返回响应。

 

  •   运行在浏览器端的 Javascript ,它负责向服务器端发送请求,接收响应,动态更新页面。

 

    DWR 工作原理是通过动态把 Java 类生成为 Javascript 。它的代码就像 Ajax 魔法一样,你感觉调用就像发生在浏览器端,但是实际上代码调用发生在服务器端, DWR 负责数据的传递和转换。这种从 JavaScript Java 的远程调用功能的方式使 DWR 用起来有种非常像 RMI 或者 SOAP 的常规 RPC 机制,而且 DWR 的优点在于不需要任何的网页浏览器插件就能运行在网页上。

    Java 从根本上讲是同步机制,然而 Ajax 却是异步的。所以你调用远程方法时,当数据已从网络上返回的时候,你要提供有回调 (callback) 来接收数据。

 

    DWR 动态在浏览器端生成一个 AjaxService JavaScript 类,以匹配服务器端 AjaxService Java 类。由 eventHandler 去调用它,然后 DWR 处理所有的远程细节,包括转换所有的参数以及将返回的 Java 对象映射成 Javascript 对象。在示例中,先在 eventHandler 方法里调用 AjaxService getOptions() 方法,然后通过回调 (callback) 方法 populateList(data) 得到返回的数据,其中 data 就是 String[]{"1", "2", "3"} ,最后再使用 DWR utility data 加入到下拉列表。

 

为什么使用 DWR

    GBP 是建立在 Struts+Spring+Hibernate 之上的 MVC 框架,它的控制层是由 Struts 负责的,而视图层则是通过 JSP 页面呈现。

   

    由上可知,当前台页面向服务器发送一个请求时, struts 调用业务逻辑处理该请求获得处理数据,然后导航到配置的页面上显示结果数据。由此可见, struts 处理请求后一般是跳转到新的页面,浏览器需要进行页面刷新。这与目前流行的通过异步 AJAX 局部刷新页面的方式相比,界面的用户体验显然要差很多。当然 struts 也能实现 AJAX 异步调用,但目前 GBP 系统中对 AJAX 的使用方式比较原始零碎,没有一套完整成熟的规范来约束。而在 GBP 中引入 DWR 的直接目的正是为了正确使用 AJAX ,为 AJAX 异步调用建立一套规范。

    在 GBP 架构中可以用 DWR 来代替 Struts 做为控制器,用户请求通过 DWR 进行处理并发送响应。

    异步调用过程中, DWR 通过 JSP 页面上的 JS 代码可以直接调用业务处理逻辑的 Java 代码,这个调用过程看起来如下图所示:

 

    使用 DWR 时通过在浏览器端调用 JS 对象的方法就可以触发服务器 JAVA 对象的相应方法,并且自动完成 JS 对象与 JAVA 对象之间的数据类型转换,看起来就像是 Java 代码直接在浏览器上执行一样。其实在 JS 对象并不是直接操作 JAVA 对象的,这之间有一个控制器层, JS 方法调用时将请求发送到 DWR 控制器 DwrServlet ,然后通过 DwrServlet 调用相应的 JAVA 对象。完整的调用过程如下所示:

 

    与 Struts 相比, DwrServlet 接收到模型返回的处理数据后并不是导航到一个新的页面,而是将这些 JAVA 对象数据转化为 JS 对象数据然后发送到调用页面上,在页面上可以通过 JS 操纵 CSS DOM 等方式来局部更新页面。由此可见, DWR 通过异步 AJAX 方式的实现了页面的局部刷新效果,可以取得非常友好的界面体验。                     

       DWR 提供了一种使用 AJAX 的正确规范的方式。 DWR XMLHttpRequest 对象进行封装和隐藏,程序员在开发过程中只需要调用普通的 JS 方法就可以实现 AJAX 的异步调用功能,并且能够方便地处理返回值。因此在 GBP 框架中引入 DWR 可以有效解决滥用 AJAX 的问题,并且可以提高页面响应速度。另外,实践说明,使用 DWR 比使用 Struts 的开发效率更高。

如何使用 DWR

    在 GBP 框架中引入 DWR DWR 可以作为接收并处理用户请求的控件器存在,与目前系统中的 struts 处于同一层次。如此一来,程序员使用 DWR 的方式几乎与目前的 Struts 一致,学习成本较低,易于快速上手。下面以系统监控为例详细说明如何在 GBP 中使用 DWR

3.1    编写服务器端的 JAVA

    在 GBP 框架中, DWR 应该与 Struts 处于同一层次,它不是直接调用业务逻辑 BO ,而是根据统一编号调用相应 service ,再由 service 调用业务处理逻辑。类似 Struts 层的业务 Action DWR 也存在一个“业务 Action ”,系统监控对应的 DWR 业务 Action com.jiuqi.GBP.action.sysapp.msc.MscControl 类,该类的具体代码如下:

    类似于 Struts 中一个 Action 对应一个 ActionForm ,一般地,在 DWR 中,一个业务 form (相当于 Struts ActionForm )需要对应一个 DWR 的业务 Action 。系统监控模块通过 QueryConditionExtForm 封装所有的查询指标,因此只需一个 DWR 的业务 Action 即可处理所有请求。 MscControl 类通过 doService 方法可以实现一般情况下对 service 的调用,而 doQuery 方法则专用于分页查询。不同于 Struts 的业务 Action 一个请求必须对应一个方法并且需要在配置文件中提供导航配置的情况,使用 DWR 时上述两个方法可以处理系统监控模块的所有请求而且无需导航配置,代码数量大大减少。当然,实际项目开发过程中, DWR Action 可能需要对前台提交的参数做一些特殊处理,此时只需在 Action 中新起一个专门方法即可。

3.2   编写浏览器端的 Javascript 脚本

    以系统监控系统日志查询为例,了解一下 DWR 是如何通过 Javascript 脚本发送请求的。

    在系统日志查询主界面上点击“查询”按钮时触发如下 JS 脚本:

     其中 JS 对象 mscCtrl 就是 Java MscControl 类的 JS 映射,浏览器端 mscCtrl doQuery 方法的调用,通过 DwrServlet 处理转化为服务器端 MscControl 实例对 doQuery 方法的调用,实现查询请求处理。传入的最后一个参数 query_meta_obj 就是用于回调的 JS 对象,它接收服务器返回的数据传给回调函数进行处理, query_meta_obj 对象还封装了发送 DWR 请求时的其它参数。 query_meta_obj 对象代码如下:

 

    其中 callback 属性就是回调函数,用于接收查询结果数据,刷新列表显示结果:

    可以看到, DWRUtil.addRows 方法实现了对查询结果列表的更新。

    浏览器端对 DWR 的操作过程总结如下:

    可以看到, DWR 的处理流程很清晰,对开发人员而言,容易产生困难的地方可能就在回调处理方面,实现 DWR 回调需要一定的 JS 编码经验。脚本文件 /script/util/dwrutil.js 提供了一些通用的回调处理方法,可以作为参考。

3.3   配置文件

    DWR 的运行需要配置文件的支持。在 GBP 中引入 DWR ,首先需要修改 web.xml 文件并引入 DWR 本身的配置文件 dwr-GBP.xml ,还需要在 Spring 的配置文件中声明服务器端对象的 bean

    1 、在 web.xml DWR 作为一个 servlet 进行配置:

  <servlet> 
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<load-on-startup>5</load-on-startup>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<!-- Annotation -->
<init-param>
<param-name>classes</param-name>
<param-value>java.lang.Object</param-value>
</init-param>
<init-param>
<param-name>logLevel</param-name>
<param-value>DEBUG</param-value>
</init-param>
<init-param>
<param-name>config-user</param-name>
<param-value>WEB-INF/files/dwr-gbp.xml</param-value>
</init-param>
</servlet>

 

  配置其 URL 映射方式:

<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

 

2 、在 DWR 配置文件 dwr-gbp.xml 中描述浏览器端与服务器端对象的转换关系:

<dwr>
<allow>
<convert converter="bean" match="com.xxx.gbp.formbean.form.*" />
<create creator="spring" javascript="mscCtrl">
<param name="beanName" value="mscControl" />
<include method="doService"/>
<include method="doQuery"/>
</create>
</allow>
</dwr>

上述配置表明,浏览器端对象为 mscCtrl ,服务器端对象是一个 Spring bean ,名为 mscControl ,故需要在 Spring 配置文件中声明。

 

结论: DWR 是否适合 GBP

    使用 DWR 的优点:

²  规范化应用 AJAX ,紧跟业界技术潮流;

²  提高界面响应速度,增强用户体验;

²  简化前台开发流程,减少代码量,提高开发效率;

²  GBP 的集成比较容易;

 

    DWR 是一个异步 AJAX 框架,非常适合处理异步类请求。但它并不是万能的,在有些方面使用 DWR 并不合适:

 

<!---->Ø  <!---->确实需要通过 Form 方式提交请求,如保存照片信息时;

<!---->Ø  <!---->处理文件上传下载请求;

<!---->Ø  <!---->处理导入导出请求;

<!---->Ø  <!---->构造树结构时,目前也无法用 DWR 改造;

 

    DWR 的优点十分明显,但在处理与 Servlet 耦合度比较高的请求时存在困难。

    另外, DWR 在高并发及大数据量情况下的表现尚未经过测试,我对此并不是很放心。

    综合 DWR 的优点与缺点,考虑到 GBP 的现有架构,推荐在 GBP 中引入 DWR 框架,做为控制层与 Struts 并存,开发过程中以 DWR 为主,以 Struts 为辅,充分发挥 DWR 的优势,在 DWR 不擅长的地方用 Struts 处理。

    推荐指数: ★★★★★

    技术难度: ★★☆☆☆

 

 

 

 

 

参考资料:

DWR 中文文档V0.9---- 方佳玮

Www.iteye.com 网站相关资料

 

分享到:
评论
4 楼 figcs2ut 2009-02-03  
文章写的很好,全面,学习啦!
3 楼 daoyongyu 2008-12-03  
好文章,学习了!
2 楼 niitstar 2008-11-21  
好文章。。。不过现在还没学dwr
1 楼 mmt 2008-04-27  
好文章,正在学习dwr,感谢分享!

相关推荐

    DWR3.0应用

    **DWR3.0应用详解** DWR (Direct Web Remoting) 是一种JavaScript库,它允许Web应用程序在客户端和服务器之间进行实时通信,无需刷新页面。DWR3.0是其一个重要版本,提供了对现代浏览器的支持,包括新版的Opera,但...

    dwr应用实例

    Direct Web Remoting (DWR) 是一个开源的Java库,它允许JavaScript在浏览器端与服务器端的Java对象进行交互,从而实现动态Web应用程序。DWR通过AJAX技术提供了一种简单的方法来创建富客户端界面,使得用户可以在不...

    DWR应用简单Demo

    **DWR(Direct Web Remoting)**是一种Java技术,它允许Web应用程序在客户端浏览器和服务器之间进行实时的、异步的数据交换。这个技术的核心理念是提供一种方式,使得JavaScript可以直接调用服务器端的Java方法,就...

    dwr应用时请注意(初学者)

    dwr-2.0RC1.jar文件,替换从官方网站下载下来的dwr.jar包,并且不需要依赖其它的任何jar包(官方网站的dwr.jar包还依赖commons-logging-1.0.4.jar,即必须配置log4j) 博文链接:...

    dwr应用开发jar包dwr.jar,DWR教程

    Direct Web Remoting (DWR) 是一个开源Java库,它允许Web应用程序在浏览器和服务器之间进行实时通信,绕过传统的Ajax限制。DWR通过提供一套简单的API,使得开发者可以轻松地在JavaScript和Java之间调用方法,实现了...

    AJAX框架DWR简单应用

    在提供的“AJAX框架DWR简单应用.pdf”文件中,你可能会找到关于如何设置DWR环境、编写Java接口、配置DWR配置文件、在前端JavaScript中使用DWR,以及示例代码和实际运行效果的详细教程。这个文件是学习和理解DWR工作...

    dwr,dojo框架应用实例

    DWR 是一个开源JavaScript库,允许Web应用程序在客户端和服务器之间进行实时通信,即实现Ajax(异步JavaScript和XML)功能。它简化了JavaScript与Java后端服务的交互,让开发者能够调用服务器上的方法,就像它们是...

    DWR技术的应用

    在本文中,我们将详细介绍DWR技术的应用,包括其配置方法和具体应用案例。 首先,需要了解DWR的运行机制。在使用DWR时,通常会有一个JavaScript文件被包含在HTML页面中。这个脚本文件会加载DWR引擎,并允许页面中的...

    dwr应用

    【标题】:“DWR应用” DWR(Direct Web Remoting)是一种开源JavaScript库,它允许在客户端的浏览器和服务器端的Java代码之间进行实时、安全的双向通信。DWR简化了Ajax开发,使得Web应用程序可以像桌面应用一样...

    DWR应用示例源代码,很好地说明了dwr工作原理

    DWR(Direct Web Remoting)是一种Java库,用于在Web应用程序中实现JavaScript和服务器端Java对象之间的双向通信。它提供了一种简单的方式来调用服务器端的方法,就像它们是本地JavaScript函数一样,极大地增强了Web...

    dwr应用(模仿百度搜索引擎)java版

    【DWR应用:模仿百度搜索引擎】是一个基于Java的项目,旨在展示Direct Web Remoting (DWR)技术在创建异步Web应用程序中的应用。DWR是一种开源框架,它允许JavaScript与服务器端的Java代码进行实时交互,实现了AJAX...

    非常实用的ajax和dwr应用的实例

    DWR是一种开源Java库,它为Web应用程序提供了Ajax支持。DWR允许JavaScript直接调用服务器端的Java方法,就像它们是本地函数一样,简化了Ajax开发过程。DWR提供了自动化的JSON(JavaScript Object Notation)和XML...

    Ajax之dwr框架应用

    DWR(Direct Web Remoting)是一个开源JavaScript库,它允许Web应用程序在客户端和服务器之间进行实时的、异步的数据交换,极大地增强了用户界面的交互性。这个“Ajax之dwr框架应用”示例是一个很好的起点,帮助...

    dwr dwrdwr

    dwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwr

    ISO7742DWR 应用指南.pdf

    《ISO7742DWR应用指南》是针对硬件工程师的一份重要参考资料,特别是涉及到数字隔离器设计的领域。此指南详细介绍了TI公司提供的不同系列的数字隔离器,包括ISO78xx、ISO77xx、ISO73xx以及ISO71xx系列,这些隔离器...

    DWR的学习资料,DWR学习必备

    DWR(Direct Web Remoting)是一种Java库,用于在Web应用程序中实现实时的JavaScript到服务器端Java对象的通信。这个技术允许开发者在浏览器中直接调用服务器端的方法,极大地简化了AJAX(Asynchronous JavaScript ...

Global site tag (gtag.js) - Google Analytics