1.1简介
DWR主要分为二部分
A:一个运行在服务器端的Java类,它接受浏览器端请求,调用业务逻辑层(调用DAO数据访问层得到相应数据进行处理)并向浏览器发回响应.
B:一个运行在浏览器端的Javascript,它向Java类发送请求接受服务器端返回的数据,局部更新网页数据,达到页面无刷新的效果.
DWR的工作原理
DWR动态把Java类生成Javascript,让你在Javascript中调用Java类的相关方法(它由eventHandler去调用它,由DWR处理所有远程细节,包括倒置
(converting)所有的参数以及返回Javascript和Java之间的值)DWR主要作用是负责数据传递和转换.
Java本身是同步的,而Ajax是异步的,所以你有调用时要提供callback的函数.
1.2 DWR的Hello World
我的开发环境:
操作系统 : XP Professional版本 2002 Service Pack2
开发工具 : MyEclipse6.0
应用服务器: Tomcat6.0.16
编译环境 : JDK1.6.6
1.2.1 将DWR引入你的工程
1)将dwr.jar复制到工程WebRoot的WEB-INF/lib目录下
2)将dwr-2-src.zip\java\org\directwebremoting内的engine.js和util.js复制到WEB应用js文件夹下.
有相应的警告内容如下:
20行 :
if (dwr == null) var dwr = {};
Multiple annotations found at the line: -Use '==='to compare with 'null',-1 changed line
作了这样的修改:
var dwr;
if (null == dwr){
dwr = {};
}
警告消失!接下来二行作相应的修改就行了呀
我的理解:myeclipse6.0的Javascript做的相当规范.这点细节都不会放过!不过这是Java强类型语言的规范,应用在Javascript编译检查.
所以我们在编译程序时要养成好的编程习惯:1)先声明变量,再使用. 2)在做if判断时常量要放在左边,变量放在右边,并且注意空格不要忘写了.
52 ~ 54行:
dwr.engine.setTextHtmlHandler = function(handler){
dwr.engine._textHtmlHandler = handler;
}
警告如下:
Expected';'and instead saw 'dwr'.
处理方式:在末尾加上分号就行了,如下:
dwr.engine.setTextHtmlHandler = function(handler){
dwr.engine._textHtmlHandler = handler;
};
记住:上面其实就是dwr的一个变量声明,末尾一定要加上分号.
153行: if (dwr.engine._activeReverseAjax)return;
警告如下:Expected'{'and instead saw 'return'',
记住:在做判断时一定要加上括号{},这是个好的编程习惯.
380行的警告有点意思:
for (var i = 0; i < arguments.length - 3; i++) {
//
}
把i++改成i=i+1或者i+=1就消除了警告.
其它警告类似就不做处理了.
1.2.2 编辑配置文件
1)web.xml
以下是我的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">
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class> org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name> //在开发阶段设置调试模式为true,发布时为false
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
2)dwr.xml
注意事项:dwr.xml与web.xml文件同在WEB-INF目录下.
最简单的方式是:在dwr-2-src.zip下的web\WEB-INF找到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>
//配置相应的Java类
</allow>
</dwr>
在工程中有警告提示内容如下:
The file cannot be validated as the host "getahead.org" is currently unreachable.
但我它换成dwr10.dtd内容就消除了警告.
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr10.dtd">
myeclipse6还不能对dwr2进行有效的验证,在myeclipse6安装目录下的myecipse6\myeclipse\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_6.0.0.zmyeclipse60020070820\catalog-dtd中可以看到myeclipse6只有dwr10.dtd文件,没有dwr20.dtd文件,找到dwr20.dtd文件复制进来就行了.也可在工程中引入就可以了,在WEB-INF文件夹上右键 New XML(Basic Templates--->Next--->命名:dwr.xml--->Next--->选择首选项: Create XML file from a DTD file--->单击Import files...按钮选择路径到dwr-2-src.zip下找到DWR文件夹--->确定--->在引入进来的文件中勾选dwr20.dtd前复选框.在选择Browse...以便dwr.xml文件保存在工程中的位置-->WEB-INF--->Next--->OK
在WEB-INF目录下创建了一个dwr.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr SYSTEM "dwr20.dtd" >
<dwr>
</dwr>
在WEB-INF目录下的dwr20.dtd不能删除,否则dwr.xml报找不到dwr20.dtd警告.
3)编写第一个.jsp文件
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>DWR2 Hello World</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<!--
其中的${pageContext.request.contextPath}代表取得当前工程根路径,这个一定要加上,否则DWR报一个service未定义错误
这句话也代替了在Jsp页面引入Java代码,增强了代码的可维护性:相当于(request.getContextPath()),其中的/dwr/interface/service.js
是DWR自动生成的,service名字要与dwr.xml配置文件中的名字要一致.engine.js与util.js是DWR提供的增强功能,通常都引入.
user.js为用户自定义的js函数./dwr/是在web.xml文件中定义的映射路径.
-->
<script type='text/javascript' src='${pageContext.request.contextPath}/dwr/interface/service.js'></script>
<script type='text/javascript' src='${pageContext.request.contextPath}/dwr/engine.js'></script>
<script type='text/javascript' src='${pageContext.request.contextPath}/dwr/util.js'></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/user/user.js"></script>
</head>
<body>
<div align="center">
<input type="text" name="name" id="name"/>
<input type="button" id="test" value="测试" onClick="test();">
</div>
</body>
</html>
4)编辑user.js文件
function test(){
var name = document.getElementById("name").value;
//service在dwr.xml定义的名字
service.sayhello(name,showName);
}
function showName(data){
alert(data);
}
5)编写Java类文件
package net.lzd.dwr2.test;
public class Service {
public String sayhello(String name){
return "Hello World "+name;
}
}
6)添加dwr.xml中的Java类与页面的Javascript之间的映射
<?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 javascript="service" creator="new">
<param name="class" value="net.lzd.dwr2.test.Service"/>
<include method="sayhello"/>
</create>
</allow>
</dwr>
注意事项:如引入的是dwr20.dtd文件的声明,你在dwr.xml没有相应提示,你可把其中的2改为1,就有相应的提示功能如下:
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://getahead.org/dwr/dwr10.dtd">
运行时改为dwr20.dtd文件声明就行了,当然用dwr10.dtd文件也可.
7)调试DWR
http://localhost/DWR2_HelloWorld/dwr就可进行方法测试.
如你没有修改Tomcat 6.0\conf中的server.xml的
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
在启动页面就是:http://localhost:8080/DWR2_HelloWorld/dwr
修改其中的port=80就可在运行页面时省略端口号如:
http://localhost/DWR2_HelloWorld/dwr,进入调试页面如下:
Classes known to DWR:
service (net.lzd.dwr2.test.Service) 点击service进入方法测试页面,这种结果是我们在web.xml中的设置debug为true起的作用.
Methods For: service (net.lzd.dwr2.test.Service)
To use this class in your javascript you will need the following script includes:
<script type='text/javascript' src='/DWR2_HelloWorld/dwr/interface/service.js'></script>
<script type='text/javascript' src='/DWR2_HelloWorld/dwr/engine.js'></script>
In addition there is an optional utility script:
<script type='text/javascript' src='/DWR2_HelloWorld/dwr/util.js'></script>
Replies from DWR are shown with a yellow background if they are simple or in an alert box otherwise.
The inputs are evaluated as Javascript so strings must be quoted before execution.
There are 10 declared methods:
//这个是我们写的测试方法.你可在括号内输入数据点击边上的 Execute按钮就可得到测试结果.
sayhello( );
//以上为一个Java类本身的方法,这个我们可以不关心.
wait( );
(Warning: overloaded methods are not recommended. See below)
(Warning: wait() is excluded: Method access is denied by rules in dwr.xml. See below)
wait( , );
(Warning: overloaded methods are not recommended. See below)
(Warning: wait() is excluded: Method access is denied by rules in dwr.xml. See below)
wait( );
(Warning: overloaded methods are not recommended. See below)
(Warning: wait() is excluded: Method access is denied by rules in dwr.xml. See below)
hashCode( );
(Warning: hashCode() is excluded: Method access is denied by rules in dwr.xml. See below)
getClass( );
(Warning: No Converter for java.lang.Class. See below)