DWR(Direct Web Remoting)是一个用于改善web页面与java类交互的远程服务器端Ajax开源框架。(JavaScript访问java类中的方法)
1. 配置web.xml
<!-- 配置dwr处理器 -->
<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>
2. 完成需要被调用的类,即被调用者
User.java
package lynn;
public class User {
// 登陆ID,主键唯一
private String id;
// 姓名
private String name;
// 口令
private String password;
// 电子邮件
private String email;
//各属性的get和set方法
... ...
UserDAO.java
package lynn;
import java.util.HashMap;
import java.util.Map;
public class UserDAO {
// 存放保存的数据
private static Map<String, User> dataMap = new HashMap<String, User>();
// 持久用户
public boolean save(User user) {
if (dataMap.containsKey(user.getId()))
return false;
System.out.println("下面开始保存用户");
System.out.println("id:" + user.getId());
System.out.println("password:" + user.getPassword());
System.out.println("name:" + user.getName());
System.out.println("email:" + user.getEmail());
dataMap.put(user.getId(), user);
System.out.println("用户保存结束");
return true;
}
// 查找用户
public User find(String id) {
return (User) dataMap.get(id);
}
}
3.配置dwr.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
<allow>
<create creator="new" javascript="DWRUserAccess">
<param name="class" value="lynn.DWRUserAccess" />
</create>
<convert converter="bean" match="lynn.User" />
</allow>
</dwr>
1)<allow>标签中包括可以暴露给javascript访问的东西。
2)<create>标签中指定javascript中可以访问的java类,并定义DWR应当如何获得要进行远程的类的实例。
creator="new"属性指定java类实例的生成方式,new意味着DWR应当调用类的默认构造函数来获得实例,其他的还有spring方式,通过与IOC容器Spring进行集成来获得实例等等。javascript=" DWRUserAccess"属性指定javascript代码访问对象时使用的名称,即所要生产的js的名称,必须与html中导入的js名称一致。
<param>标签指定要公开给javascript的java类名。
<include>标签指定要公开给javascript的方法。不指定的话就公开所有方法。
<exclude>标签指定要防止被访问的方法。
3)<creator>标签负责公开用于Web远程的类和类的方法,<convertor>标签则负责这些方法的参数和返回类型。
convert元素的作用是告诉DWR在服务器端Java 对象表示和序列化的JavaScript之间如何转换数据类型。DWR自动地在Java和JavaScript表示之间调整简单数据类型。这些类型包括Java原生类型和它们各自的封装类表示,还有String、Date、数组和集合类型。DWR也能把JavaBean转换成JavaScript 表示,但是出于安全性的原因,要求显式的配置,<convertor>标签就是完成此功能的。converter="bean"属性指定转换的方式采用JavaBean命名规范,match="lynn.user"属性指定要转换的javabean名称,标签指定要转换的JavaBean属性。
4.完成html,即调用者
test.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>DWR测试</TITLE>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<script src="dwr/engine.js"></script>
<script src="dwr/util.js"></script>
<script src="dwr/interface/DWRUserAccess.js"></script>
</HEAD>
<SCRIPT LANGUAGE="JavaScript">
function saveFun(data) {
if (data) {
alert("注册成功!");
} else {
alert("登陆ID已经存在!");
}
}
function OnSave() {
var userMap = {};
userMap.id = regForm.id.value;
userMap.password = regForm.password.value;
userMap.name = regForm.name.value;
userMap.email = regForm.email.value;
DWRUserAccess.save(userMap, saveFun);
}
function findFun(data) {
if (data == null) {
alert("无法找到用户:" + queryForm.id.value);
return;
}
alert("找到用户,nid:" + data.id + ",npassword:" + data.password + ",nname:"
+ data.name + ",nemail:" + data.email);
}
function OnFind() {
DWRUserAccess.find(queryForm.id.value, findFun);
}
</SCRIPT>
<BODY>
<B>用户注册</B>
<br>
------------------------------------------------
<Br>
<form name="regForm">
登陆ID:
<input type="text" name="id">
<br>
口 令:
<input type="password" name="password">
<br>
姓 名:
<input type="text" name="name">
<br>
电子邮件:
<input type="text" name="email">
<br>
<input type="button" name="submitBtn" value="提交" onclick="OnSave()">
<br>
</form>
<br>
<br>
<B>用户查询</B>
<br>
------------------------------------------------
<Br>
<form name="queryForm">
登陆ID:
<input type="text" name="id">
<br>
<input type="button" name="submitBtn" value="提交" onclick="OnFind()">
<br>
</form>
<br>
</BODY>
</HTML>
1)必须导入
<script src="dwr/engine.js"></script>
<script src="dwr/util.js"></script>
<script src="dwr/interface/DWRUserAccess.js"></script>
其中engine.js和util.js都在dwr-2.0.3-src.zip的java/org/dwrwebremoting/目录下。DWRUserAccess.js是自动生产的,注意路径必须是*/interface/*.js。
2)调用java方法
function saveFun(data) {
if (data) {
alert("注册成功!");
} else {
alert("登陆ID已经存在!");
}
}
function OnSave() {
var userMap = {};
userMap.id = regForm.id.value;
userMap.password = regForm.password.value;
userMap.name = regForm.name.value;
userMap.email = regForm.email.value;
DWRUserAccess.save(userMap, saveFun);
}
DWR组件名称.调用的java方法名称(方法参数,方法的返回值)
5.DWR和Spring的整合
需要更改的地方:
1)Web.xml中添加
<!--初始化WebApplicationContext-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
注意applicationContext.xml的路径
2)applicationContext.xml中配置bean
<bean id="DWRUserAccess" class="lynn.DWRUserAccess"></bean>
3)修改dwr.xml
<dwr>
<allow>
<create creator="spring" javascript="DWRUserAccess">
<param name="beanName" value="DWRUserAccess" />
</create>
<convert converter="bean" match="lynn.User" />
</allow>
</dwr>
creator的值可以是new、spring、struts。
<param>标签配置被调用的bean。