DWR--AJAX更方便

附spring整合DWR(包含struts1,spring,hibernate整合置):

http://blog.csdn.net/jiabeis/archive/2010/05/26/5626121.aspx

 

最近了解了一个有用的AJAX工具,看了网上的文章这里有一些摘抄和自己的总结,和大家分享:

什么是DWR(Direct Web Remote)?
DWR是一种AJAX解决方案!
DWR包括一个java库,以及一套javascript,使得我们可以用一种非常简单的方式,在页面上使用javascript直接调用后台的java对象!
DWR架构
DWR的javascript库包括几个部分:dwr的javascript引擎(即对AJAX调用的封装)、dwr提供的一些非常有用的辅助javascript函数库、以及dwr自动帮我们生成的专门用于调用后台JavaBean方法的javascript库!
Dwr在运行的时候,动态生成一个javascript库,这个库是对后台javabean调用的封装,我们可以直接使用这个库来实现直接调用JavaBean的目的!
注意:是在运行的时候动态生成!

 

下面我们来看看如何安装和使用(基于DWR2.x版本):
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="#" οnclick="sayHello()">Test1</a> 
</body> 
</html>  

注意:这里的服务器处理类,可以是任何的javaBean,而无需是一个Servlet.服务器支持spring整合和struts等框架

  
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>  

注意:这里的引入的js文件也都是动态生成的。
前面两个都是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" οnclick="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或名称”)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值