DWR(Direct Web Remoting)的简称是DWR,它的实现是基于Ajax的,可实现无刷新的效果。这个框架最大的优点就是可以在JS中调用Java方法,传递参数,并且可以得到返回值,它是开源(Apache)的产品。为什么要使用DWR,我们首先介绍基本AJAX流程,从中可以看到引入DWR会带来什么好处。
1、AJAX的基本介绍
Ajax (Asynchronous JavaScript And XML)描述了一种使用混合了HTML(或XHTML)和层叠样式表作为表达信息,来创建交互式的Web应用的开发技术;文档对象模型(DOM)、JavaScript、动态地显示和与表达信息进行交互;并且XMLHttpRequest对象与Web服务器异步地交换和处理数据。
使用AJAX,我们可以开发出有很好交互性的B/S程序,同时AJAX局部和异步刷新的特性也大大减小了对服务器和网络的压力。对于非AJAX的B/S程序来说HTML、DOM、JS同样是不可或缺的关键技术,因此引入AJAX技术主要是增加了对于XMLHttpRequest对象的使用。关于AJAX更多的介绍以及相关重要的实现代码,请参见我的博客:http://blog.csdn.net/smszhuang168/article/details/7742402。
2、DWR框架基本介绍
从最简单的角度来说,DWR 是一个引擎,可以把服务器端 Java 对象的方法公开给 JavaScript 代码。使用 DWR 可以有效地从应用程序代码中把 Ajax 的全部请求-响应循环消除掉。这意味着客户端代码再也不需要直接处理 XMLHttpRequest 对象或者服务器的响应。不再需要编写对象的序列化代码或者使用第三方工具才能把对象变成 XML。甚至不再需要编写 servlet 代码把 Ajax 请求调整成对 Java 域对象的调用。
DWR 是作为 Web 应用程序中的 servlet 部署的。把它看作一个黑盒子,这个 servlet 有两个主要作用:首先,对于公开的每个类,DWR 动态地生成包含在 Web 页面中的 JavaScript。生成的 JavaScript 包含存根函数,代表 Java 类上的对应方法并在幕后执行 XMLHttpRequest。这些请求被发送给 DWR,这时它的第二个作用就是把请求翻译成服务器端 Java 对象上的方法调用并把方法的返回值放在 servlet 响应中发送回客户端,编码成 JavaScript。DWR的标准流程如下图所示:
页面触发eventHandler()事件,事件内部调用了AjaxService.getOptions方法,当调用完成后,利用服务端返回的数据用客户端的populateList()方法进行数据展现。
我们通过一个简单的DWR示例来说明如何使用DWR。
第一步:下载DWR包。
需要将DWR的jar文件拷入Web应用的WEB-INF/lib目录中(可在http://getahead.org/dwr下载)
第二步:配置web.xml文件。
在web.xml文件的<web-app></web-app>标签中,添加如下配置:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
第三步:配置dwr.xml文件。
在你的Application的WEB-INF下新建dwr.xml文件,内容如下:
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTDDirect Web Remoting 2.0//EN" "http://getahead.ltd.uk/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="new" javascript="Pict" scope="application">
<param name="class" value="bean.Pict"/>
<includ emethod="method1" />
</create>
</allow>
</dwr>
大概解释一下:
creator="new"属性指定java类实例的生成方式。"new"意味着DWR应该调用类的默认构造函数来获得类的实例,一般我们用这个就可以搞定了。
javascript="Pict"指定JavaScript代码访问Java对象的时候使用的名称。
标签指定要公开给JavaScript的java类名。
<include>标签指定要公开给JavaScript的方法,不指定的话公开所有的方法。
第四步:在JS中调用
1). 引入JavaScript脚本
<script language="javascript1.2" src="dwr/interface/Pict.js"></script>
<script language="javascript1.2" src="dwr/util.js"></script>
<script language="javascript1.2" src="dwr/engine.js"></script>
注释:
其中第一个导入的标签脚本必须是手动写入,名字和<create>标签中的属性JavaScript的值相等,其后缀为.js。你只要在这里手动写入就可以了,实际由dwr根据配置文件自动生成其内容。util.js和engine.js是dwr自带的脚本文件。
2). 编写调用java方法的JS函数
比如:下面是一个没有参数,没有返回值的函数调用
Function callJava(){
Pict.method1();
}
如果无参数,有返回值如下:
Function callJava(){
Pict.method1(retu); //retu称之为回调函数,实际就是将返回值赋给了这个函数。
}
Function retu(data){
Alert(data); //这里的data的值才是实际上的方法method1的返回值。
}
如果有参数,也有返回值,可直接在方法中加入到回调函数的前面即可
总结:
通过上面的示例程序,我们可以看到使用DWR开发B/S程序给我们带来了很大的便利,但任何技术都有不足之处,对这些不足之处我们也要充分了解,有助于我们更好的理解DWR的适用范围,发挥它的优点。
对于框架的学习,如果不是专门做框架的开发,我们完全可以不去深入的研究,站到巨人的肩膀上,学会使用前人的智慧的结晶即可。