- 浏览: 183345 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
delu577025500:
f — 表示返回数据列,如“snd1l1yr”。更详细的参见附 ...
连接雅虎财经API获取股票信息 -
kizz:
您好,请问如何计算压缩的时间。
利用ant.jar进行解压缩 -
yangxiutian:
想查查新版的struts2的工作原理 网上全是旧版的
struts2 StrutsPrepareAndExecuteFilter 源码分析 -
695165987:
KM文件夹 怎么下载上面的文件夹啊,一个个的下载很累啊~大哥知 ...
sap portal KM 文件夹布局配置 -
nurenok:
postInit(dispatcher, filterCo ...
struts2 StrutsPrepareAndExecuteFilter 源码分析
原文:http://www.blogjava.net/Supershen/archive/2008/01/18/176207.html
DWR
DWR(Direct Web Remoting)是一个WEB远程调用框架.利用这个框架可以让AJAX开发变得很简单.利用DWR可以在客户端利用JavaScript直接调用服务端的Java方法并返回值给JavaScript就好像直接本地客户端调用一样(DWR根据Java类来动态生成JavaScrip代码).它的最新版本DWR0.6添加许多特性如:支持Dom Trees的自动配置,支持Spring(JavaScript远程调用spring bean),更好的浏览器支持,还支持一个可选的commons-logging日记操作.它通过反射,将java翻译成javascript,然后利用回调机制,轻松实现了javascript调用Java代码。
其大概开发过程如下:
Ø 编写业务代码,该代码是和dwr无关的。
Ø 确认业务代码中哪些类、哪些方法是要由javascript直接访问的。
Ø 编写dwr组件,对步骤2的方法进行封装。
Ø 配置dwr组件到dwr.xml文件中,如果有必要,配置convert,进行java和javascript类型互转。
Ø 通过反射机制,dwr将步骤4的类转换成javascript代码,提供给前台页面调用。
Ø 编写网页,调用步骤5的javascript中的相关方法(间接调用服务器端的相关类的方法),执行业务逻辑,将执行结果利用回调函数返回。
Ø 在回调函数中,得到执行结果后,可以继续编写业务逻辑的相关javascript代码。
例子
先介绍下相关的Java类
User: 用户类,
public class User {
private String id;
private String name;
private String password;
private String email;
//以下包含getXXX和setXXX方法
}
UserDAO:实现User的数据库访问,这里作为一个演示,编写测试代码
public class UserDAO {
private static Map dataMap = new HashMap();
public boolean save(User user) {
if (dataMap.containsKey(user.getId())){
return false;
}else{
return true;
}
}
public User find(String id) {
return (User)dataMap.get(id);
}
}
DWRUserAccess:DWR组件,提供给javascript访问的。
public class DWRUserAccess {
UserDAO userDAO = new UserDAO();
public boolean save(User user) {
return userDAO.save(user);
}
public User find(String id) {
return userDAO.find(id);
}
}
注意,DWRUserAccess是供DWR调用的,是DWR组件,因此需要将DWRUserAccess类配置到dwr中。
在web.xml中配置
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<display-name>DWR Servlet</display-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>scriptCompressed</param-name>
<param-value>false</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>
以上的配置可以拦截所有指向dwr的请求。
WEB-INF下新建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="test.DWRUserAccess"/>
</create>
<convert converter="bean" match="test.User"/>
</allow>
</dwr>
Ø creater="new"表示每调用一次DWRUserAccess时,需要重新new一个类;
Ø javascript="DWRUserAccess",表示提供给前台页面调用的javascirpt文件是DWRUserAccess.js。
Ø convert元素用于数据类型转换,即java类和javascript之间相互转换,因为和前台交换的是User对象,因此需要对此使用bean转换,我们将在后面介绍这个类。
编写测试的HTML页面 test.html
<HTML>
<HEAD>
<TITLE>DWR测试</TITLE>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<script src="/oblog312/dwr/engine.js"></script>
<script src="/oblog312/dwr/util.js"></script>
<script src="/oblog312/dwr/interface/DWRUserAccess.js"></script>
</HEAD>
<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>
<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>
解释
<script src="/oblog312/dwr/engine.js"></script>
<script src="/oblog312/dwr/util.js"></script>
这两个是dwr提供的,用户可以不必关心,只需要导入即可
<script src="/oblog312/dwr/interface/DWRUserAccess.js"></script>
是我们编写的DWRUserAccess类,经dwr反射后,生成的javascript代码,它和DWRUserAccess.java是对应的,供用户调用,实际上我们就是通过这个js文件去调用服务器端的DWRUserAccess类的。
我们来看下OnSave函数,首先它构造一个map,将表单数据都设置到map中,然后调用DWRUserAccess.save(userMap, saveFun),执行save操作。大家可以注意到,服务器端的DWRUserAccess中的save方法是这样的:boolean save(User user),其参数是一个User对象,返回一个boolean值;而客户端的方法是这样的:save(userMap,saveFun),第一个参数userMap是javascirpt中的map对象,在这里相当于服务器端的User对象(在服务器端执行时,会通过convert转换成User对象),前面我们提到dwr是利用回调函数来返回执行结果的,第二个参数saveFun即是一个回调函数。在函数function saveFun(data)中,data是执行结果,这里是一个bool值,非常简单的,我们通过判断data是否为真,可以知道用户名是否重复,用户是否注册成功。
看一下OnFind查找函数,执行结果在回调函数findFun(data)中,因为服务器端返回的是一个User对象,通过convert,将会转换成javascript的一个map对象,于是在findFun中,通过data.id、data.name、data.password、data.email我们可以轻松的访问到这个User对象。
发表评论
-
DWR 2
2011-06-21 13:05 1082后续: 1. 拦截器 uk.ltd.get ... -
log4j.properties的路径问题
2011-06-20 11:59 5440log4j.properties如果放在web-inif/cl ... -
Class.forName
2011-06-19 19:55 1197Class.forName(xxx.xx.xx) 返回 ... -
myeclipse优化 Maven
2011-06-18 09:11 82121.禁用myeclipse updating indexes ... -
ThreadLocal学习2
2011-06-10 13:15 1166典型实例 Hiberante的HibernateSessio ... -
【转】ThreadLocal学习一
2011-06-10 11:05 1357我们知道Spring通过各种D ... -
java 动态代理 proxy InvocationHandler
2011-06-09 16:27 5394一篇杂文,写到哪就说到哪。在一些框架中有所谓的截面(aop), ... -
httpUrlConnection参数详解
2011-06-02 12:54 13497// 设置是否向httpUrlConnection输出,因为这 ... -
HttpURLConnection使用代理服务器
2011-06-02 11:48 2531目前网络上最流行的协 ... -
连接雅虎财经API获取股票信息
2011-06-02 11:29 24684一直想自己做个简单的股票系统,来记录股票的价格。在网上看了下, ... -
java字符串split方法的诡异
2011-06-01 18:01 976String str = "#123" ... -
eclipse插件
2011-05-30 14:05 813正则表达式插件 http://regex-util.sourc ... -
Hibernate annotation学习笔记1
2011-05-19 17:16 1一系列笔记所使用的数据库表关系图 -
利用ant.jar进行解压缩
2011-05-19 16:22 4131package com.zoucq; import java ... -
JSPWiki的安装
2011-05-19 15:02 2381平时喜欢用word,excel文档保存一些知识点,日子久了就发 ... -
quartz监听器
2011-05-18 15:32 6903Quartz主要包含三个组件job,trigger,sched ... -
junit4新框架hamcrest的assertThat
2011-05-18 13:13 7410assertThat JUnit4.4引入了Hamcrest ... -
junit3与junit4的区别
2011-05-18 13:00 8743Junit4最大的亮点就是引入了注解(annotation), ... -
quartz日记4-触发器
2011-05-17 17:16 1104SimpleTrigger 如果需要计 ... -
quartz日记3-quartz的基本类
2011-05-17 16:46 688Quartz的几个核心的接口和类为: Job接口:自 ...
相关推荐
dwr 1 jar dwr 1 jar
- DWR 1.x是其早期版本,引入了基本的远程方法调用(RMI)概念到Web应用,使开发者能够轻松地创建动态交互的页面。 - 此版本可能包含了基本的AJAX支持,允许异步更新部分网页而无需整个页面刷新。 - 它可能提供了...
这个压缩包包含了DWR的三个主要版本:DWR1.0、DWR2.0和DWR3.0的jar包,这些jar包是运行DWR应用的核心组件。 DWR1.0: DWR1.0是DWR项目的早期版本,主要目标是简化Web应用中的异步通信。在这个版本中,DWR提供了一个...
Ext 2.0.1 和 DWR 1是两个在Web开发中常用的技术框架,用于构建富客户端应用程序。本实例主要是介绍如何结合这两者来创建一个实时编辑的表格,而无需借助数据库,非常适合初学者入门。 Ext是一个JavaScript库,专为...
【Ext 2.0.1】与【DWR 1】是本文介绍的重点技术,它们在AJAX应用中被用于创建一个实时编辑的表格。AJAX(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。在本...
在这种情况下,`dwr-invoker1`Servlet会处理`/dwr1/*`的请求,并使用`dwr1.xml`作为配置文件。 在DWR中,Java方法的调用非常直观。例如,假设有一个名为`UserService`的Java类,其中有一个`getUserInfo`方法,可以...
DWR 2.0版本是在DWR 1.x基础上的升级,改进了性能和易用性,同时也增加了更多的特性。 DWR的核心功能是将Java对象暴露给JavaScript,使得在不刷新页面的情况下,前端可以调用后端的方法,更新页面数据。这种通信...
<param-value>WEB-INF/dwr1.xml <param-name>config-2 <param-value>WEB-INF/dwr2.xml ``` - 如果有多个Servlet,每个Servlet可以有自己的`dwr.xml`配置,如: ```xml <servlet-name>dwr-invoker1 ...
如果使用的是DWR 1.x版本,则`servlet-class`应为`uk.ltd.getahead.dwr.DWRServlet`。虽然1.x版本与2.x版本兼容,但推荐使用较新版本。 ##### 创建`dwr.xml` `dwr.xml`文件定义了DWR可以创建和远程调用的类,以及...
这里,`config-1`和`config-2`是参数名,它们的值分别指向`dwr1.xml`和`dwr2.xml`。没有指定的`config-`参数默认会读取`WEB-INF/dwr.xml`。 - **多个Servlet,每个Servlet对应一个或多个`dwr.xml`**:如果你有多...
DWR2.0是DWR的一个版本,它在DWR1.x的基础上做了很多改进,增强了性能和易用性。而Spring框架则是一个广泛使用的轻量级Java企业级应用开发框架,它提供了一种模块化和灵活的方式来构建和管理应用程序。 在DWR2.0中...
<param-value>WEB-INF/dwr1.xml <param-name>config-2 <param-value>WEB-INF/dwr2.xml ``` - **多个Servlet,每个Servlet对应一个或多个`dwr.xml`**:你可以为每个Servlet配置不同的`dwr.xml`文件,如: ```...
<param-value>WEB-INF/dwr1.xml <param-name>config-2 <param-value>WEB-INF/dwr2.xml ``` ###### 3.2 多个servlet,各自对应一个或多个dwr.xml文件 当项目复杂度增加时,可能需要为不同的功能模块创建独立的...
1、 建立dwr.xml 配置文件 任何一个dwr.xml的文件都需要包含DWR DOCTYPE的声明行,格式如下: <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" ...
dwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwr
DWR2.0是DWR的一个重要版本,它在DWR1.x的基础上进行了许多改进和增强。 DWR的核心功能在于提供了一个安全、简单的API,使得JavaScript可以直接调用服务器端的Java方法,就像它们是本地函数一样。这种技术被称为...
1. **在`web.xml`中配置DWR** 在项目的`web.xml`文件中添加DWR的配置,这包括定义DWR Servlet以及其映射路径。具体配置如下: ```xml <servlet-name>dwr-invoker <servlet-class>uk.ltd.getahead.dwr....
在这个例子中,`dwr-invoker1`Servlet关联了`dwr1.xml`配置文件,并开启了调试模式。 在`dwr.xml`配置文件中,你可以定义哪些Java类和方法可以被客户端访问。例如: ```xml ``` 这将允许在JavaScript中...