DWR学习笔记Word文档下载推荐.docx
《DWR学习笔记Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《DWR学习笔记Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
![DWR学习笔记Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-12/7/8f711c89-da43-4ed2-8468-515fae3b046c/8f711c89-da43-4ed2-8468-515fae3b046c1.gif)
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.
<
servlet>
BR>
2.
3.
4.
5.<
servlet-name>
dwr-invoker<
/servlet-name>
6.
7.
8.
9.<
servlet-class>
org.directwebremoting.servlet.DwrServlet<
/servlet-class>
10.
11.
12.
13.<
load-on-startup>
5<
/load-on-startup>
14.
15.
16.
17.<
init-param>
18.
19.
20.
21.
param-name>
debug<
/param-name>
22.
23.
24.
25.
param-value>
true<
/param-value>
26.
27.
28.
29.<
/init-param>
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.
/servlet>
<
<
--Annotation-->
配置其URL映射方式:
servlet-mapping>
url-pattern>
/dwr/*<
/url-pattern>
/servlet-mapping>
2、在DWR配置文件dwr-gbp.xml中描述浏览器端与服务器端对象的转换关系:
dwr>
allow>
convertconverter="
bean"
match="
com.xxx.gbp.formbean.form.*"
/>
createcreator="
spring"
javascript="
mscCtrl"
>
paramname="
beanName"
value="
mscControl"
includemethod="
doService"
/>
doQuery"
/create>
/allow>
/dwr>
上述配置表明,浏览器端对象为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处理。
推荐指数:
★★★★★
技术难度:
★★☆☆☆