Dwr入门

DWR Direct Web Remoting )是一个用于改善 Web 页面与 Java 类交互的远程服务器端 Ajax 开源框架, DWR 可以动态生成基于 Java 类的 JavaScript 代码,对于公开的每个类, DWR 帮我们做好了创建对象、发送数据、接受响应等许多繁琐的工作,大大节省了客户端代码和工作量。比如它可以将 java 程序中的某个 XxxBus 转换成 js 中的一个对象,并将 XxxBus 中的某个方法如 getXXX() 转换成 js 中的一个名为 XxxBus.getXXX() function 。同时,它可以将 java 中的值对象或其它数据包转换成 js 中的对象。

Ok ,来用 DWR 做一个 Demo

1 、首先我们需要下载 Dwr.jar ,同时因为 DWR 需要 commons logging.jar ,所以最终我们需要在 web/lib 下放入 dwr.jar commons-logging-1.0.4.jar

2 、将 Dwr 注册到 Web 容器中去,在 web.xml 中添加配置

	<!-- 配置DWR的核心Servlet -->
	<listener>
		<listener-class>org.directwebremoting.servlet.DwrListener</listener-class>
	</listener>
	<servlet>
		<!-- 指定DWR核心Servlet的名字 -->
		<servlet-name>dwr-invoker</servlet-name>
		<!-- 指定DWR核心Servlet的实现类 -->
		<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
		<!-- 指定DWR核心Servlet处于调试状态,一般部署设为false -->
		<init-param>
			<param-name>debug</param-name>
			<param-value>true</param-value>
		</init-param>
		<!-- 设置使用反向Ajax技术 -->
		<init-param>
			<param-name>activeReverseAjaxEnabled</param-name>
			<param-value>true</param-value>
		</init-param>
		<init-param>
			<param-name>jsonpEnabled</param-name>
			<param-value>true</param-value>
		</init-param>
		<!-- DWR2.0 加入了JDK5的注释(annotations).DwrServlet初始化的时候会去检查注释的类,找不到就抱错了。如果你不用annotations也可以忽略掉这个错误。不过看起来总是不爽。解决方案如下 -->
		<init-param>
			<param-name>classes</param-name>
			<param-value>java.lang.Object</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<!-- 指定核心Servlet的URL映射 -->
	<servlet-mapping>
		<servlet-name>dwr-invoker</servlet-name>
		<url-pattern>/dwr/*</url-pattern>
	</servlet-mapping>
 

 

3 、创建 dwr 配置文件( dwr.xml ,和 web.xml 同级)

         这个配置文件主要规定了 DWR 能够创建和转换的类

<!DOCTYPE dwr PUBLIC
    "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd">

<dwr>

	<!-- allow部分定义了DWR能够创建和转换的类。 -->
	<!-- 每一个在类中被调用的方法需要一个<create …>有若干类型的creator,使用“new”关键字或者Spring 框架等。 -->
	<!-- new:Java用“new”关键字创造对象,是DWR默认的creator -->
	<allow>
		<!--dwr3提供的一个日志审核过滤器 -->
		<filter class="org.directwebremoting.filter.AuditLogAjaxFilter" />

		<!--在浏览器里给你创建的对象命名。避免使用JavaScript保留字。这个名字将在页面里作为js被导入 -->
		<create creator="new" javascript="service">
			<param name="class" value="com.iflytek.dwr.AjaxService" />
			<!-- exclude表示不包含sayHello,include表示包含-->
			<!-- <exclude method="sayHello" /> -->
		</create>
		<!-- 如果你在参数中传入JAVASCRIPT中的是一个对象类型,则需要转换成javascript支持的Bean类型 -->
		<convert converter="exception" match="java.lang.Exception" />
		<convert converter="bean" match="java.lang.StackTraceElement" />
	</allow>

</dwr>
 

 

注意上面的 create createor 指定的为 new ,则该类下必须要有一个无参的构造方法。

match 用于告诉 DWR 你将需要把 Java 中的哪些类转换成 JS

 

构建一个实体类 User.java

package com.iflytek.dwr;

import java.util.Date;

/**
 * @author xudongwang 2011-11-30
 * 
 *         Email:[email protected]
 * 
 */
public class User {

	private String name = "";
	private int age;
	private Date[] appointments;

	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 Date[] getAppointments() {
		return appointments;
	}

	public void setAppointments(Date[] appointments) {
		this.appointments = appointments;
	}

}

 后台java代码AjaxService.java

package com.iflytek.dwr;

/**
 * @author xudongwang 2011-11-29
 * 
 *         Email:[email protected]
 * 
 */
public class AjaxService {
	public AjaxService() {
		System.out.println("执行构造方法");
	}

	public String sayHello(String yourName) {
		// 可以是访问数据库的复杂代码
		return "欢迎使用DWR应用示例,您输入的用户名为: " + yourName;
	}

	public String IsUsing(String yourName) {
		return "IsUsing方法" + yourName;
	}


	public User user = new User();

	public void doSomethingWithUser(User user) {
		System.out.println("dddddd");
		this.user = user;
		// Some Java code that does something with User user.
		System.out.println("进入到doSomethingWithUser方法里");
		System.out.println(user.getName() + "---" + user.getAge());
	}
}
 

前台代码dwr.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">


<title>DWR3.0Demo</title>
<!-- jsp文件中必须引入几个js,它们都是隐含存在的,不用考虑它们在哪儿。其中engine.js和util.js是固定的。另外的一个js的名称就是dwr.xml中配置的类名。这些js的路径基本是:app_root/dwr/....模式的,一定要写对。 -->
<script src="dwr/interface/service.js"></script>
<script src="dwr/util.js"></script>
<script src="dwr/engine.js"></script>

<script type="text/javascript">
	function firstDwr() {
		//callBackHello用来callBack返回的数据
		service.sayHello(document.myform.user.value, callBackHello1);

	}
	//这样可以指定一些额外的调用选项如指定超时,错误处理等
	function secondDwr() {
		service.IsUsing(document.myform.user.value, {
			callback : function(str) {
				alert(str);
			},
			timeout : 5000,
			errorHandler : function(message) {
				alert("Oops:" + message);
			}
		});
	}
	//关于回调函数的说明

	/* 	如果第一个或最后一个是一个函数,那么它就是回调函数,没有元数据对象,并且其他参数都是Java的方法参数。
	  另外,如果最后一个参数是一个对象,这个对象中有一个callback成员,并且它是个函数,那么这个对象就是元数据对象,其他的都是Java方法参数。
	  另外,如果第一个参数是 null ,我们就假设没有回调函数,并且其他的都是Java方法参数。尽管如此,我们会检查最后一个参数是不是null,如果是就发出警告。
	  最后如果最后一个参数是null,那么就没有callback函数。
	  另外,发出错误信号是个糟糕的请求格式。 */

	function callBackHello1(data) {
		alert(data);
	}
	function thirdDwr() {
		var myUser = {
			name : "Fred Bloggs",
			age : 42,
			appointments : [ new Date(), new Date("1 Jan 2008") ]
		};
		service.doSomethingWithUser(myUser);
	}
</script>
</head>
<body>
	<form name="myform">
		<input type="text" name="user"> <input type="button"
			name="button" value="方法1_简单的回调函数" onclick="firstDwr()"> <input
			type="button" name="button" value="方法2_调用元数据对象" onclick="secondDwr()">
		<input type="button" name="button"
			value="Creating JavaScript objects to match Java objects"
			onclick="thirdDwr()">
	</form>
</body>
</html>

 

以上只是简单说了一下 Dwr ,做到能够明白 Dwr 是个什么玩意,以后在项目中实践过,再做深入总结。

 

 

猜你喜欢

转载自xdwangiflytek.iteye.com/blog/1751188
dwr