接触DWR有一段时间了,但是只是学会了怎么用,项目上能实现功能就得了,一直不知道它的实现原理,今天晚上花时间了解了一下它的实现原理。
1、首先,DWR是通过Servlet是实现的,所以我们在web.xml中需要配置一个DWRServlet类。这样所有的/dwr/*所有请求都由这个servlet来处理。
这里添加一段在stackoverflow上面看到的解释DWR的回答,写的非常到位。
In the simplest terms, DWR is an engine that exposes methods of server-side Java objects to JavaScript code. Effectively, with DWR, you can eliminate all of the machinery of the Ajax request-response cycle from your application code. This means your client-side code never has to deal with an XMLHttpRequest object directly, or with the server's response. You don't need to write object serialization code or use third-party tools to turn your objects into XML. You don't even need to write servlet code to mediate Ajax requests into calls on your Java domain objects.
DWR is deployed as a servlet within your Web application. Viewed as a black box, this servlet performs two major roles: First, for each exposed class, DWR dynamically generates JavaScript to include in your Web page. The generated JavaScript contains stub functions that represent the corresponding methods on the Java class and also performs XMLHttpRequests behind the scenes. These requests are sent to the DWR servlet, which, in its second role, translates the request into a method call on a server-side Java object and sends the method's return value back to the client side in its servlet response, encoded into JavaScript. DWR also provides JavaScript utility functions that help perform common UI tasks.
2、DWR给我们做了一件伟大的事情,就是将Java转换为了JavaScript,这一步通过dwr.xml配置文件实现。dwr.xml中有两个重要的概念需要说一下:
creator在dwr中主要的职责就是把用户发布在dwr.xml中的class进行实例化,这样js中就可以使用这个对象调用Java类中的方法了,实现了客户端和服务器端的通信;
DWR提供的creator包括:jsf,none,new,pageflow,spring,script,struts
最常用的就是new,也就是实例化一个对象。
converter的职责是在接受请求时把客户端的javascript对象转换成服务器端的java对象,通过调用发布的java bean后,在把返回的java的对象转化成javascript的对象给客户端调用。
DWR提供的converter包括:null,enum,primitive,bignumber,string,array,map,collection, date,dom,dom4j,jdom,xom,servlet,bean,object,hibernate
如果DWR提供的creator和convertor不能满足需求,用户也可以自己创建自己的creator和convertor,只要将其发布在dwr.xml中就行了。
理解了这两个概念就可以很容易的看懂dwr.xml的配置了。
3、接下来看一下解析之后的文件:
由于配置了/dwr路径,web.xml中配置的DWR的DwrServlet会处理请求,然后将engine.js以流的形式发送给浏览器,同时它还会自动生成Hello.js ,并同样以流的形式发送给浏览器,这两个文件都可以在浏览器的缓存里找到。这两个文件在工程中是找不到的,如果不明白DWR的原理,很容易去工程的路径下找文件,可以怎么也找不到。(我开始的时候就是 )
以上次DWR用法中的Hello为例子,在浏览器中访问目录/dwr/interface/Hello.js(如果去看更里面的servlet的代码,就可以发现/interface/是要求配置成这样的,固定的)可以看到解析后的代码:
if (typeof dwr == 'undefined' || dwr.engine == undefined) throw new Error('You must include DWR engine before including this file');
(function() {
if (dwr.engine._getObject("Hello") == undefined) {
var p;
p = {};
p._path = '/DWRDemo1/dwr';
/**
* @param {class java.lang.String} p0 a param
* @param {function|Object} callback callback function or options object
*/
p.sayHello = function(p0, callback) {
return dwr.engine._execute(p._path, 'Hello', 'sayHello', arguments);
};
/**
* @param {function|Object} callback callback function or options object
*/
p.getName = function(callback) {
return dwr.engine._execute(p._path, 'Hello', 'getName', arguments);
};
/**
* @param {class java.lang.String} p0 a param
* @param {function|Object} callback callback function or options object
*/
p.setName = function(p0, callback) {
return dwr.engine._execute(p._path, 'Hello', 'setName', arguments);
};
dwr.engine._setObject("Hello", p);
}
})();
看到代码中有这样一句话:
(1)if (typeof dwr == 'undefined' || dwr.engine == undefined) throw new Error('You must include DWR engine before including this file');
这就是为什么我们再写引用js的时候一定要将.engine写在最前面。engine.js和util.js,它们分别是dwr中的核心引擎库和辅助工具函数库!我们这里没有用到util.js的方法,可写可不写。util.js有一些处理table及select的方法,所以在实现中涉及到这两项是要把这个引用加上,或者为了保险起见可以每次将这两个引用都写在前面。
(2)从代码中可以看到,DWR引擎将dwr.xml中配置的javascript="Hello"映射为一个对象,将Java类的方法映射为了Js中的函数。其中每个函数都调用了_execute方法,这个方法完成初始化工作,其传入的参数有:
path——在/WEB-INF/web.xml配置的url-pattern,
scriptName——/WEB-INF/dwr.xml中creator的javascript的名称,
methodName——creator的方法名,
vararg_params——传进的值和一些控制参数
同样,在目录dwr/engine.js下也可以看到相应的代码,太长就不贴出来了。
4、调用DWR生成的.js函数:
调用方式:
.methodName(param1,...paramn,callback(msg));
callback是回调函数,用来回调java方法执行的结果。
这个回调方法是传到服务器端的,在服务器端很容易实现。回调方法的java的执行结果,返回类似 <script>callMethod(结果)<script>的javascript字符串,在浏览器执行。
至此,就完成了整个DWR的实现过程。
分享到:
相关推荐
spring-dwr-2.0.xsd spring 与 DWR进行配置
struts2与dwr结合的工具之一,这个是新从官方网站下载的,与大家分享,希望对你们有效。
\第五部分ajax\第15章 AJAX--dwr开发及应用\第15章 AJAX--dwr开发及应用.ppt )
下面我们将详细探讨这三个组件以及它们如何协同工作。 EXT是一个基于JavaScript的UI库,它提供了丰富的用户界面组件,如数据网格、表格、图表等,使得Web应用能够提供类似于桌面应用的交互体验。EXT的强项在于其...
ExtJS 是一个流行的JavaScript库,用于构建富客户端的Web应用程序,而DWR(Direct Web Remoting)则是一种在客户端JavaScript和服务器端Java之间进行实时通信的技术。这篇博客文章"Extjs--DWR做的动态树"可能探讨了...
Direct Web Remoting (DWR) 是一个开源Java库,它允许Web应用程序在客户端...通过学习DWR中文文档,开发者可以深入了解DWR的工作原理和最佳实践,从而在实际项目中高效地利用DWR实现Ajax功能,提升Web应用的用户体验。
AJAX-DWR下拉框级联是Web开发中一种常见的交互设计,主要用于提高用户体验,使得用户在选择某个选项时,相关联的下拉框能够自动更新其内容,以适应不同的场景需求。在这个实验中,我们将重点探讨如何使用AJAX和DWR...
了解DWR的工作原理,可以通过阅读其源码来深入学习。DWR的源码结构清晰,注释丰富,是学习远程调用和Ajax技术的好材料。 总结来说,DWR是一个强大的服务器端Ajax框架,它简化了Java与JavaScript之间的通信,提高了...
Direct Web Remoting (DWR) 是一个开源的Java库,它允许Web应用程序在客户端JavaScript和服务器端Java之间进行实时通信。...这个"HelloWorld-Dwr"示例是一个很好的起点,帮助初学者理解DWR的基本工作原理和配置过程。
Struts2-DWR带进度条文件上传是一种在Web应用程序中实现大文件上传并显示实时进度条的技术组合。Struts2是一个流行的Java MVC框架,用于构建企业级Web应用,而DWR(Direct Web Remoting)是一个JavaScript库,允许在...
【服务器推技术与DWR中的push机制】 在Web开发中,传统的Ajax技术主要是基于“拉”(Pull)模型,即浏览器(Browser)发起请求,服务器(Server)被动响应。然而,这种模型无法满足实时性需求,例如股票行情、即时...
1. **DWR工作原理** DWR的核心在于提供了一种安全的跨域通信机制,使得JavaScript可以直接调用服务器端的Java方法,而无需传统的HTTP请求。它通过XMLHttpRequest对象实现异步通信,同时通过JSON或JavaScript Object...
Direct Web Remoting (DWR) 是一个开源Java库,它允许...通过实际操作,你可以逐步熟悉DWR的工作原理,从而在实际项目中灵活运用。无论是开发富互联网应用(RIA)还是提升现有Web应用的功能,DWR都是一个强大的工具。
本示例"ext-dwr-spring集成Demo"就是一种将三个重要技术组件——EXT、Direct Web Remoting (DWR) 和Spring框架融合的实践。EXT是一个强大的JavaScript库,用于构建富客户端BS(Browser-Server)架构的应用;DWR则...
struts2-dwr-plugin-2.1.6.jar
接下来,我们将详细探讨这三个技术的核心概念、工作原理以及它们之间的关系。 **Struts2** 是一个基于 MVC(Model-View-Controller)设计模式的开源 Java 框架,用于简化 Java Web 应用程序的开发。Struts2 结合了 ...
**AJAX的工作原理:** 1. **用户交互**:用户在前端界面上进行操作。 2. **创建XMLHttpRequest对象**:JavaScript创建一个XMLHttpRequest对象,这是AJAX的基础。 3. **打开连接**:使用XMLHttpRequest对象的open()...
### DWR在AJAX中的应用及注意事项 #### 一、DWR简介与配置 DWR(Direct Web Remoting)是一种简化Ajax开发的技术框架,它可以让JavaScript像调用本地方法一样直接调用服务器端的方法,从而简化了前端和后端之间的...
3. **DWR的工作流程** - **初始化**: 在服务器端部署DWR并配置好映射。 - **页面加载**: 浏览器加载HTML页面,该页面包含DWR的JavaScript库和初始化脚本。 - **调用远程方法**: 前端JavaScript通过DWR API调用...
ajax-dwr_spring,太棒了.