DWR(全称:Direct Web Remoting)是一个JavaEE模型的一个AJAX框架,通过配置和指定回调JavaScript函数并可直接调用服务端后台业务方法,
并得到是一个WEB远程调用框架.利用DWR框架可以让AJAX开发变得更加简单.DWR可以在客户端利用JavaScript直接调用服务端的Java方法并返
回值给JavaScript就好像直接本地客户端调用一样(DWR根据Java类来动态生成JavaScrip代码).它的最新版本DWR3.0添加许多特性如:支持Dom
Trees的自动配置,支持Spring(通过配置可直接远程调用,从Spring Bean中获取业务对象),更好浏览器支持,还支持一个可选的commons-
logging日记操作.
该项目主页:http://www.getahead.ltd.uk/dwr/
目前该项目的正式版3.0以发布,可以到些去选择需要的版本进行下载:
http://directwebremoting.org/dwr/download.html
有了包那么下面我们来实现一个简单的例子来说明在实际应用中的方法,首先我按四大步来划分
1、调用服务端后台业务对象返回字符串
2、调用服务端后台业务对象并返回一个 Bean 对象
3、调用服务端后台业务对象返回列表
4、与SPRING进行集成,并同时实现以上3项同样业务
实现部分:
新建一个WEB工程,将下载的dwr.jar拷到项目的lib目录中,能后在WEB-INF目录下新建一个dwr.xml 文件,在web.xml 中添加一个DWR的请求控制
,接下来我会对dwr.xml中进行配置生成业务对象方式,我将不会加以注释详细说明,详细说明我将放在文章的最后面
<servlet> <servlet-name>dwr</servlet-name> <servlet-class> org.directwebremoting.servlet.DwrServlet </servlet-class> <init-param> <param-name>Debug</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dwr</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping>
再添加一个Users.java
package com.dwrtest.service; /** * <p> * 创 建 人:ChenTao * <p> * 创建日期:2009-5-26 上午9:04:44 * <p> */ public class Users { private Integer userId; private String userName; private String password; //get... set... 方法略 }
上面二个文件在全局中都会使用到,下面声明将不对这二个文件描述
好了我们先来实现第一步:
一、返回字符串
先新建一个Dao.java
package com.dwrtest.dao.impl; import java.util.ArrayList; import java.util.List; import com.dwrtest.dao.IDao; import com.dwrtest.service.Users; public class Dao implements IDao{ public String login1(String userName, String password) { if("ctojxzsycztao".equals(userName) && "ctojxzsycztao".equals(password)){ return "登录成功!"; } return "登录失败!"; } }
新建一个DwrService.java,代码如下:
package com.dwrtest.service; import com.dwrtest.dao.IDao; import com.dwrtest.dao.impl.Dao; /** * <p> * 创 建 人:ChenTao * <p> * 创建日期:2009-5-26 上午09:38:51 * <p> */ public class DwrService { private IDao dao = new Dao(); public IDao getDao() { return dao; } public void setDao(IDao dao) { this.dao = dao; } public String login1(String userName,String password){ return dao.login1(userName, password); } }
修改dwr.xml 文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd"> <dwr> <allow> <create creator="new" javascript="dwrService"> <param name="class" value="com.dwrtest.service.DwrService"/> </create> </allow> </dwr>
最后创建一个dwrStr.jsp
<%@ page language="java" contentType="text/html;charset=UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Dwr Test</title> <script type="text/javascript" src="dwr/util.js"></script> <script type="text/javascript" src="dwr/engine.js"></script> <script type="text/javascript" src="dwr/interface/dwrService.js"></script> <script type="text/javascript"> <!--\\ function login(){ dwrService.login1(document.getElementById("userName").value,document.getElementById ("passWord").value,cellBackStr); } // 处理返回的字符串 function cellBackStr(str){ DWRUtil.setValue("div",str); } --> </script> <style type="text/css"> <!-- .FONT{font-size : 12px;} --> </style> </head> <body> <div id="div" class="FONT"></div> <table border=0 class="FONT"> <tr> <td class="FONT">userName:</td> <td class="FONT"><input type="text" id="userName" name="userName"></td> </tr> <tr> <td class="FONT">passWord:</td> <td class="FONT"><input type="text" id="passWord" name="passWord"></td> </tr> <tr> <td colspan=2> <input type="button" value="login" onclick="login();"> </td> </tr> </table> </body> </html>
大家看到上面的实现和配置都非常简单,易懂、易学,现在我们来看下第二步
二、返回Bean对象
首先在 Dao.java 与 DwrService.java文件中添加一个方法 login2
Dao.java 中的 login2 方法
public Users login2(String userName, String password) { if ("ctojxzsycztao".equals(userName) && "ctojxzsycztao".equals(password)) { Users users = new Users(); users.setUserId(1); users.setUserName("chentao"); users.setPassword("chentao"); return users; } return null; }
DwrService.java 中的login2方法
public Users login2(String userName, String password) { return dao.login2(userName, password); }
同样需要修改 dwr.xml 文件,修改后的内容如下:
<dwr> <allow> <create javascript="dwrService" creator="new"> <param name="class" value="dwrService" /> </create> <convert converter="bean" match="com.dwrtest.service.Users"> <param name="include" value="userId,userName,password"/> </convert> </allow> </dwr>
最后再抒写一个 dwrBean.jsp 文件:
<%@ page language="java" contentType="text/html;charset=UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Dwr Test</title> <script type="text/javascript" src="dwr/util.js"></script> <script type="text/javascript" src="dwr/engine.js"></script> <script type="text/javascript" src="dwr/interface/dwrService.js"></script> <script type="text/javascript"> <!--\\ function loginRObject(){ dwrService.login2(document.getElementById("userName").value,document.getElementById ("passWord").value,cellBackBean); } // 处理返回的实体对象 function cellBackBean(bean){ DWRUtil.setValue("div","用户名:"+bean.userName+"\n 密 码:"+bean.password); } --> </script> <style type="text/css"> <!-- .FONT{ font-size : 12px; } --> </style> </head> <body> <div id="div" class="FONT"></div> <table border=0 class="FONT"> <tr> <td class="FONT">userName:</td> <td class="FONT"><input type="text" id="userName" name="userName"></td> </tr> <tr> <td class="FONT">passWord:</td> <td class="FONT"><input type="text" id="passWord" name="passWord"></td> </tr> <tr> <td colspan=2> <input type="button" value="login" onclick="loginRObject();"> </td> </tr> </table> </body> </html>
运行下看看吧!
三、返回列表对象
同样我们先来修改Dao.java 和 DwrService.java 二个文件添加方法 listByUsersAll:
Dao.java:
public List<Users> listByUsersAll() { List<Users> list = new ArrayList<Users>(); Users users = new Users(); users.setUserId(1); users.setUserName("chentao"); users.setPassword("chentao"); list.add(users); users = new Users(); users.setUserId(2); users.setUserName("chen"); users.setPassword("chen"); list.add(users); return list; }
DwrService.java:
public List<Users> listByUsersAll() { return dao.listByUsersAll(); }
同样修改dwr.xml 文件:
<dwr> <allow> <create javascript="dwrService" creator="new"> <param name="class" value="dwrService" /> </create> <convert converter="bean" match="com.dwrtest.service.Users"> <param name="include" value="userId,userName,password"/> </convert> </allow> <signatures> <![CDATA[ import java.util.List; import com.dwrtest.service.DwrService; import com.dwrtest.service.Users; ]]> </signatures> </dwr>
同样需要写一个JSP来显示 dwrList.jsp
<%@ page language="java" contentType="text/html;charset=UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Dwr Test</title> <script type="text/javascript" src="dwr/util.js"></script> <script type="text/javascript" src="dwr/engine.js"></script> <script type="text/javascript" src="dwr/interface/dwrService.js"></script> <script type="text/javascript"> <!--\\ function rList(){ dwrService.listByUsersAll(cellBackList); } // 处理返回的列表对明 function cellBackList(list){ var div = document.getElementById("div"); var str = ""; str = "<table>"; str += "<tr><td class='FONT'>用户ID</td><td class='FONT'>用户名</td><td class='FONT'>密码</td</tr>"; for(var i in list){ var bean = list[i]; str += "<tr><td class='FONT'>"+bean.userId+"</td><td class='FONT'>"+bean.userName+"</td><td class='FONT'>"+bean.password+"</td</tr>"; } str += "</table>"; div.innerHTML = str; } --> </script> <style type="text/css"> <!-- .FONT{ font-size : 12px; } --> </style> </head> <body> <div id="div" class="FONT"></div> <input type="button" value="返回列表" onclick="rList();"> </body> </html>
实现基本上以完成:运行下看看吧!
四、与SPRING集成
接下来我将来介绍下与SPRING集成的一些方法:我们首先需要加入SPRING LIB 到工程目录下,在 MyEclipse 中可直接添加SPRING环境,修改
DwrService.java 中的 Dao 创建方式:
private IDao dao; public IDao getDao() { return dao; } public void setDao(IDao dao) { this.dao = dao; }
applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring- beans-2.0.xsd"> <bean id="dao" class="com.dwrtest.dao.impl.Dao"> </bean> <bean id="dwrService" class="com.dwrtest.service.DwrService"> <property name="dao" ref="dao"></property> </bean> </beans>
最后需要修改dwr.xml:修改后的dwr.xml如下:
<dwr> <allow> <!-- creator指明为该实体由spring来创建, param 则指向的是applicationContext.xml 的的 bean id --> <create javascript="dwrService" creator="spring"> <param name="beanName" value="dwrService" /> </create> <convert converter="bean" match="com.dwrtest.service.Users"> <param name="include" value="userId,userName,password"/> </convert> </allow> <signatures> <![CDATA[ import java.util.List; import com.dwrtest.service.DwrService; import com.dwrtest.service.Users; ]]> </signatures> </dwr>
可以看到修改后的dwr.xml 与前面的有所不同 在 create 元素中属性creator值改成spring ,参数param 也改为了 beanName,下面就着重来介
绍下该文件:
dwr:为配置文件的根元素
allow:该元素中包含了暴露给javascript访问的东西
create:标签中指定javascript中可以访问的java类,并定义DWR应当如何获得要进行远程的类的实例。
creator="new"属性指定java类实例的生成方式,new意味着DWR应当调用类的默认构造函数来获得实例,
其他的还有spring方式,通过与IOC容器Spring进行集成来获得实例等等。
javascript="dwrService"表示实体转换成javascript语言后以这个来命名,页面中可以通过该名进行引用
<param>标签指定要公开给javascript的java类名。
<include>标签指定要公开给javascript的方法。不指定的话就公开所有方法。
<exclude>标签指定要防止被访问的方法。
convert:<creator>标签负责公开用于Web远程的类和类的方法,
<convertor>标签则负责这些方法的参数和返回类型。
convert元素的作用是告诉DWR在服务器端Java 对象表示和序列化的JavaScript之间如何转换数据类型。
DWR自动地在Java和JavaScript表示之间调整简单数据类型。这些类型包括Java原生类型和它们各自的封装类表示,
还有String、Date、数组和集合类型。DWR也能把JavaBean转换成JavaScript 表示,但是出于安全性的原因,
要求显式的配置,<convertor>标签就是完成此功能的。converter="bean"属性指定转换的方式采用JavaBean命名规范,
match="com.dwrtest.service.Users"属性指定要转换的javabean名称,<param>标签指定要转换的JavaBean属性。
singnatures:标签是用来声明java方法中List、Set或者Map参数所包含的确切类,以便java代码作出判断。
在JSP中使用时需要先对dwr提供的二个JS和生成的一个JS进行引用
<script type="text/javascript" src="dwr/util.js"></script> <script type="text/javascript" src="dwr/engine.js"></script> <script type="text/javascript" src="dwr/interface/dwrService.js"></script>
其中 dwrService.js 为引用由DWR通过配置生成的JS文件
下面附带示例程序源代码,有需要的可以下载看看