`
wlh269
  • 浏览: 448950 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

dwr的使用和分析

阅读更多
1.下载dwr.jar,将其加入web-inf/lib目录
2.修改web.xml文件,添加DWRServlet的映射

<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
    <init-param>
      <param-name>debug</param-name>
      <param-value>true</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>dwr-invoker</servlet-name>
    <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

3.配置dwr,即在WEB-INF目录下,添加dwr.xml文件,让dwr知道在运行的时候应该给哪些JavaBean生成相应的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 creator="new" javascript="test1">
      <param name="class" value="com.bjsxt.dwr.Test1"/>
    </create>
  </allow>
</dwr>
这个配置的意思是,要创建的是Test1对象的javascript库,而且这个库的名字叫test1,同时,这也是我们在JSP页面上调用这个对象的时候所使用的名称,
dwr.xml也支持spring:
<?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 creator="spring" javascript="aclManager">
      <param name="beanName" value="aclManager"/><!--Spring配置文件中的bean:aclManager -->
    </create>
  </allow>
  </dwr>


请看下面的JavaBean代码和JSP实例:

4、下面是Test1这个JavaBean的源代码:package com.bjsxt.dwr;


public class Test1 {

public String sayHello(String name){
return "你好,"+name;
}

}

5、在JSP中的使用!

<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<script type="text/javascript" src="dwr/engine.js"></script>
<script type="text/javascript" src="dwr/util.js"></script>
<script type="text/javascript" src="dwr/interface/test1.js"></script>
<title>Insert title here</title>
<script type="text/javascript">
function sayHello(){
test1.sayHello("李四ddd",
function(data){
alert(data);
}
);
}
</script>
</head>
<body>
<a href="#" onclick="sayHello()">Test1</a>
</body>
</html>



 
DWR原理
通过前面五章学习,对DWR整体有所了解,但是我仍然对核心细节不是很清楚。我最后的办法就是单步调试,调试之后将所有东西串一串,DWR的原理就清楚了,搞清楚核心生产线,其他全是辅助的,没必要再分析了。老外聪明啊,服。
   我们以DWR的第一个样例为例Dynamically Text
   1,在index.html里面我们嵌入
     <script type='text/javascript' src='../dwr/engine.js'> </script>
     <script type='text/javascript' src='../dwr/util.js'> </script>
     <script type='text/javascript' src='../dwr/interface/Demo.js'> </script>
    前面两个都是DWR系统默认需要加载的,Demo.js是Demo.java所对应的。按理论,只要在web.xml和dwr.xml配置好,那么我们就可以在客户端操作Demo.js,类似于操作服务器端的Demo.java。
HTML source:
<p>
Name:
<input type="text" id="demoName"/>
<input value="Send" type="button" onclick="update()"/>
<br/>
Reply: <span id="demoReply"></span>
</p>

Javascript source:
function update() {
var name = dwr.util.getValue("demoName");
Demo.sayHello(name, function(data) {
dwr.util.setValue("demoReply", data);
});
}

Java source:
package org.getahead.dwrdemo.simpletext;
public class Demo {
public String sayHello(String name) {
return "Hello, " + name;
}
}

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>
<create creator="new" javascript="Demo">
<param name="class" value="org.getahead.dwrdemo.simpletext.Demo"/>
</create>
</allow>
</dwr>
在浏览器第一次加载本页面时,浏览器第一步发现<script type='text/javascript' src='../dwr/engine.js'> </script>,根据web.xml关于dwr的配置,系统会激发Servlet的POST方法,向客户端输出engine.js文件流,这个文件你可以在IE的缓存里面发现,当然,程序会在最后输出一刻比较客户端是否已经存在该文件,如果要输出的文件流大小和和该文件大小一致,就不输出了,同样util.js、Demo.js也是这么输出的。那么看看Demo.js文件里面的内容如下:
if (typeof this['Person'] != 'function') {
  function Person() {
    this.address = null;
    this.phoneNumber = null;
    this.name = null;
    this.id = 0;
    this.salary = 0;
  }
}

// Provide a default path to dwr.engine
if (typeof this['dwr'] == 'undefined') this.dwr = {};
if (typeof dwr['engine'] == 'undefined') dwr.engine = {};

if (typeof this['Demo'] == 'undefined') this.Demo = {};

Demo._path = '/dwr/dwr';

Demo.sayHello = function(p0, callback) {
  return dwr.engine._execute(Demo._path, 'Demo', 'sayHello', p0, callback);
};

Demo.getInclude = function(callback) {
  return dwr.engine._execute(Demo._path, 'Demo', 'getInclude', callback);
};
    这样我们就知道了,实际上Demo.java类的sayHello方法已经被解释到Demo.js中了,只不过后面的调用还不是很清楚而已。
继续!
public String sayHello(String name) {
return "Hello, " + name;
}
翻译成
       Demo._path = '/dwr/dwr';
Demo.sayHello = function(p0, callback) {
  return dwr.engine._execute(Demo._path, 'Demo', 'sayHello', p0, callback);
};
  在调用engine.execute()方法时,最终采用无刷新访问服务器技术。
采用该技术的关键问题是两个参数,一个是url,往什么地方发送;一个是doc,发送什么内容
通过跟踪engine.js我们知道
url=/dwr/dwr/call/plaincall/Demo.sayHello.dwr
发送内容如下:
callCount=1
windowName=DWR-442B435899
c0-scriptName=Demo
c0-methodName=sayHello
c0-id=0
c0-param0=string:Joe
batchId=1
page=/dwr/simpletext/index.html
httpSessionId=
scriptSessionId=1CC3A.0A3

实际上url=/dwr/dwr/call/plaincall/Demo.sayHello.dwr,转向的是DwrServlet,DwrServlet实际上获取了两部分信息,一部分是url,根据这个能够解析到我们的目标java类、方法,另外一部分是发送信息包,实际上这就是SayHello所需要的参数输入信息,最后,返回数据,这些数据格式通过response返回,在engine.js中对应于return batch.reply;通过解析返回对象,采用javascirpt将数据动态刷新到页面。

   至此,dwr的核心原理,基本清晰



让我们简单看一下这个JSP文件:首先引入DWR中的两个核心javascript库:engine.js和util.js,它们分别是dwr中的核心引擎库和辅助工具函数库!
第三个引入的dwr/interface/test1.js,实际上这个文件并不存在,这是由dwr在运行的时候动态生成的!test1这个名称,跟dwr.xml文件中配置的对应对象的javascript属性一致!
而且,我们在使用的时候,直接使用test1这个名称,作为这个对象的引用。直接调用这个对象的方法:sayHello,这个方法的名称必须与JavaBean中的方法名称一致!
sayHello方法有一个参数,同时返回一个值。我们可以直接传递参数,同时指定一个javascript函数来处理这个返回值(如上例所示)。

如何传递参数
如果要调用的方法有参数,则将参数放在前面
如何处理返回值
定义一个函数来处理返回值,这个函数有一个参数,就是JavaBean方法的返回值
设置异步/同步模式
默认情况下,DWR以异步的方式跟服务器通信,即可以同时向服务器发送请求,如果想要改为同步的方式,可以调用:dwr.engine.setAsync(false);
获得对某个页面元素对象的引用
$(“元素的ID或名称”)


分享到:
评论
3 楼 cathong 2010-01-05  

很不错,是看过的写的比较详细的,准备借鉴下
2 楼 120153216 2009-10-27  
也辛苦的哦。
1 楼 gaozi131 2009-10-26  
好文章 让我对DWR了解更深了  尤其是对其工作原理 谢谢

相关推荐

    dwr源码分析

    dwr前端源码分析、dwr协议分析、dwr入门实例

    DWR的技术分析与界面开发

    内含各种文档文件,如DWR的xml配置文件说明,DWR学习笔记,DWR技术分析,DWR开发培训,WEB界面开发规范,还有一些重要控件的代码分析和文档说明,如树控件。

    DWR 实例 + DWR 深入 (源代码分析).doc

    DWR 实例 + DWR 深入 (源代码分析).doc dwr学习的实例

    DWR笔记 DWR.xml配置文件说明书 DWR技术分析

    DWR笔记 DWR.xml配置文件说明书 DWR技术分析

    DWR与界面开发

    DWR.xml配置文件说明书,DWR技术分析,DWR开发培训,WEB界面开发规范

    DWR中文手册 指导DWR部署,使用

    本书通过对一些有趣实用的Web开发项目进行由浅入深的分析,引导开发人员了解基于DWR的Ajax在实际应用中的各种方法和技术,并帮助开发人员从传统的开发方式逐步平稳地转换到Ajax开发方式中。 本书适合具有一定Web开发...

    dwr开发、技术分析、配置使用

    dwr是对ajax的一种实现,使用简单,封装比较好能够与现在的系统非常好的嵌入,实现异步通讯局部刷新的功能

    Spring 2.0 + Struts 1.2 + Hibernate 3.2 + DWR 2.0 的JavaEE应用示例

    找到demo目录中的.sql数据库脚本文档,首先使用查询分析器创建演示所需要的数据库、表和测试数据 3. 使用MyEclipse 5.5把该应用布置到Tomcate的webapp目录下 4. 使用demo\布置之后lib替换被布置到Tomcat下的lib ...

    dwr 分页技术 案例分析

    包含有数据库脚本,导入即可使用,功能十分的强大,对于初学者可能有点难度,希望有意者有点耐心。看了绝对不会后悔。

    dwr开发相关资料文档

    本压缩包含web界面开发,dwr学习,dwr技术分析,dwr笔记等共八个文件

    论文研究-基于MAP和DWR的页面数据传递的分析与实现 .pdf

    基于MAP和DWR的页面数据传递的分析与实现,王晓琳,,本文首先简单介绍了Java中的Map类型,了解它在Java中的具体应用,以及基于Ajax实现的web远程调用框架DWR,并给出了在web应用中它的简单配

    利用dwr实现图形的动态显示

    平时开发遇到的问题: 原来的applet技术:applet显示图形...利用ajax的dwr框架实现图形分析:读取数据/图形分析生成等全部的服务器端查询执行(包括sql语句,大量数据处理等), 最后返回给一个图形的路径,然后在客户端显示

    DWR实战 pdf

    本书通过对一些有趣实用的web开发项目进行由浅入深的分析,引导开发人员了解基于dwr的ajax在实际应用中的各种方法和技术,并帮助开发人员从传统的开发方式逐步平稳地转换到ajax开发方式中。  本书适合具有一定web...

    dwr与界面开发(内含树,右键菜单,日期的js组件和帮助文档)

    dwr配置说明.doc dwr笔记.doc dwr技术分析.doc dwr开发培训.ppt dwr学习.doc web界面开发规范.doc 树,右键菜单,日期控件组件js,事例及帮助文档。

    DWR,Struts,Hibernate和Spring的J2EE架构开发大全

    基于J2EE轻量级框架的管理信息系统的分析和设计.pdf 基于JMS的企业即时通讯系统的设计与实现.pdf 基于Spring_Hibernate_Struts的高校设备招标评标管理信息系统.pdf 基于Spring+Struts+Hibernate的轻型架构实现生产...

    一套完整的dwr ajax框架综合资料

    此资料包括了DWR.xml配置文件说明书.doc、DWR笔记.doc、DWR技术分析.doc、DWR开发培训.ppt、DWR学习.doc、WEB界面开发规范.doc等综合资料...

    ext 与 dwr 的结合

    根据&lt;dwr作为数据源的extjs grid crud解决方案&gt;中的分析整理的源代码 博文链接:https://lib.iteye.com/blog/150208

Global site tag (gtag.js) - Google Analytics