DWR学习笔记.docx

上传人:b****5 文档编号:4705987 上传时间:2022-12-07 格式:DOCX 页数:12 大小:290.28KB
下载 相关 举报
DWR学习笔记.docx_第1页
第1页 / 共12页
DWR学习笔记.docx_第2页
第2页 / 共12页
DWR学习笔记.docx_第3页
第3页 / 共12页
DWR学习笔记.docx_第4页
第4页 / 共12页
DWR学习笔记.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

DWR学习笔记.docx

《DWR学习笔记.docx》由会员分享,可在线阅读,更多相关《DWR学习笔记.docx(12页珍藏版)》请在冰豆网上搜索。

DWR学习笔记.docx

DWR学习笔记

1 DWR是什么

    DWR是一个可以允许你去创建AJAXWEB站点的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"},最后再使用DWRutility把data加入到下拉列表。

 

2 为什么使用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的开发效率更高。

3 如何使用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进行配置:

Xml代码

1.  
  

2.  

3.  

4.  

5.dwr-invoker 
  

6.  

7.  

8.  

9.org.directwebremoting.servlet.DwrServlet 
  

10.  

11.  

12.  

13.5
  

14.  

15.  

16.  

17.
  

18.  

19.  

20.  

21.    debug
  

22.  

23.  

24.  

25.    true
  

26.  

27.  

28.  

29.
  

30.  

31.  

32.  

33.

-- Annotation -->
  

34.  

35.  

36.  

37. 
  

38.  

39.  

40.  

41.    classes 
  

42.  

43.  

44.  

45.    java.lang.Object 
  

46.  

47.  

48.  

49.
  

50.  

51.  

52.  

53. 
  

54.  

55.  

56.  

57.    logLevel 
  

58.  

59.  

60.  

61.    DEBUG 
  

62.  

63.  

64.  

65.
  

66.  

67.  

68.  

69.
  

70.  

71.  

72.  

73.    config-user
  

74.  

75.  

76.  

77.    WEB-INF/files/dwr-gbp.xml
  

78.  

79.  

80.  

81.
  

82.  

83.  

84.  

85.   

 

dwr-invoker

 

org.directwebremoting.servlet.DwrServlet

 

5

 

 

debug

 

true

 

 

--Annotation-->

 

 

classes

 

java.lang.Object

 

 

 

logLevel

 

DEBUG

 

 

 

config-user

 

WEB-INF/files/dwr-gbp.xml

 

 

 

 配置其URL映射方式:

dwr-invoker

/dwr/*

 

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

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

 

4 结论:

DWR是否适合GBP?

   使用DWR的优点:

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

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

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

✧ 与GBP的集成比较容易;

 

   DWR是一个异步AJAX框架,非常适合处理异步类请求。

但它并不是万能的,在有些方面使用DWR并不合适:

 

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

Ø∙处理文件上传下载请求;

Ø∙处理导入导出请求;

Ø∙构造树结构时,目前也无法用DWR改造;

 

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

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

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

   推荐指数:

★★★★★

   技术难度:

★★☆☆☆

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 交规考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1