DWR入门简介

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)


 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值