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。