DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站。它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样。
一、引入DWR裤架的步骤
(1)添加dwr.jar和commons-logging.jar到WEB-INF/lib目录下
(2)修改web.xml 添加DWRServlet配置信息
(3)在WEB-INF目录下面添加dwr.xml文件
(4)在html或者JSP页面中通过JS代码调用服务器段的java方法
二、下面通过一个demo来熟悉如何在工程里面使用dwr框架
(1)下面是该demo的工程结构
(1)修改web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 配置DWR -->
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
</web-app>
(3)添加dwr.xml文件
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
<allow>
<!--配置js段能够方法的java类-->
<create creator="new" javascript="DwrDemo">
<param name="class" value="cn.gov.zjport.dwr.DwrDemo" />
</create>
<!--配置服务器段的javabean和前段javascript对象之间的转换-->
<convert match="cn.gov.zjport.dwr.Person" converter="bean"></convert>
</allow>
</dwr>
(4)修改index.jsp文件,引入dwr需要的js文件
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>Dwr Demo</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<script type='text/javascript' src='/DwrDemo/dwr/engine.js'></script><!--引入dwr的engine.js文件 核心文件-->
<script type='text/javascript' src='/DwrDemo/dwr/util.js'></script><!--dwr提供的工具文件-->
<script type='text/javascript' src='/DwrDemo/dwr/interface/DwrDemo.js'></script><!--dwr自动生成的js文件 这三个文件会缓存在前段浏览器里面-->
<script type="text/javascript">
function dwrdemo() {
//调用服务器段的DwrDemo类的getServerData方法,serverReturn是回调方法
DwrDemo.getServerData(serverReturn);
}
function serverReturn(data) {
dwr.util.setValue("val", data);
}
function dwrdemo1() {
DwrDemo.getPerson(serverReturn1);
}
function serverReturn1(data) {
dwr.util.setValue("val1", data.name+":"+data.age+":"+data.address);
}
</script>
</head>
<body>
<button name="btn" οnclick="dwrdemo()" title="click me">click
me</button>
返回值:<input type="text" id="val" name="val">
<button name="btn1" οnclick="dwrdemo1()">获得用户</button>
用户信息:<input type="text" id="val1" name="val1">
</body>
</html>
DwrDemo.js文件:
if (typeof dwr == 'undefined' || dwr.engine == undefined) throw new Error('You must include DWR engine before including this file');
(function() {
if (dwr.engine._getObject("DwrDemo") == undefined) {
var p;
p = {};
p._path = '/DwrDemo/dwr';
/**
* @param {function|Object} callback callback function or options object
*/
p.getServerData = function(callback) {
return dwr.engine._execute(p._path, 'DwrDemo', 'getServerData', arguments);
};
/**
* @param {function|Object} callback callback function or options object
*/
p.getPerson = function(callback) {
return dwr.engine._execute(p._path, 'DwrDemo', 'getPerson', arguments);
};
dwr.engine._setObject("DwrDemo", p);
}
})();
(5)编写后台对应的业务类DwrDemo.class
package cn.gov.zjport.dwr;
public class DwrDemo {
public String getServerData() {
return "Message from server";
}
public Person getPerson(){
Person person = new Person() ;
person.setName("张三") ;
person.setAge(32) ;
person.setAddress("杭州下城区") ;
return person ;
}
}
package cn.gov.zjport.dwr;
public class Person {
private String name ;
private int age ;
private String address ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
(6)运行结果
当点击 click me和获得用户这两个按钮的时候,前段的js会想DWRServlet发送请求,DWRServlet拦截到请求以后会通过反射的方式调用具体的java类里面的方法。并将结果返回到前段。由此可见DWRServlet是dwr框架后台的一个核心控制类负责处理前段的请求。