在项目中需要用到ajax技术,ajax早就不是一个新鲜的技术了,现在可以说是在web开发应用中,ajax是盛行的时代!伴随着这样技术不断成熟,也涌现出不少的ajax框架,经同事介绍,说DWR是一种能够很好实现ajax的项目.故找了一些资料,做了练习,发现它有自己很大的优势.
什么是DWR?
DWR是一个Open Source的 java项目。DWR可以让JavaScript调用运行在Web服务器里面的JAVA程序。简单一点或者专业一点就是Easy AJAX for JAVA.
下面将一步一步的介绍怎么完成一个简单DEMO
从官方网站下载DWR https://dwr.dev.java.net/files/documents/2427/32252/dwr.war
把他直接放到TOMCAT_HOME/webapps 下面
从网上download dwr.war,放到tomcat服务器下,启动服务可以看下/chat/java_chat.html页面的效果,那是一个简单的聊天程序.
例子:Hello World
源代码:
java 代码
Servic.java
package helloWorld;
public class Service {
public String sayHello(String name){
return name+": Hello World!";
}
}
-
dwr.xml
- <?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
- <
dwr
>
-
<
allow
>
-
<
create
creator
=
"new"
javascrī
pt
=
"Service"
scope
=
"application"
>
-
<
param
name
=
"class"
value
=
"helloWorld.Service"
/>
-
</
create
>
-
</
allow
>
- </
dwr
>
web.xml
- <?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
- <
web-app
>
-
<
servlet
>
-
<
servlet-name
>
dwr-invoker
</
servlet-name
>
-
<
servlet-class
>
org.directwebremoting.servlet.DwrServlet
</
servlet-class
>
-
<
init-param
>
-
<
param-name
>
logLevel
</
param-name
>
-
<
param-value
>
INFO
</
param-value
>
-
</
init-param
>
-
<
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
>
- </
web-app
>
helloworld.html
- <
html
>
- <
head
>
-
<
title
>
Hello World
</
title
>
-
<
scr
īpt
type
=
'text/javascrīpt'
src
=
'../dwr/engine.js'
>
</
scr
īpt
>
-
<
scr
īpt
type
=
'text/javascrīpt'
src
=
'../dwr/interface/Service.js'
>
</
scr
īpt
>
-
<
scr
īpt
type
=
'text/javascrīpt'
src
=
'../dwr/util.js'
>
</
scr
īpt
>
-
<
scr
īpt
type
=
"text/javascrīpt"
>
- function sayHello() {
- Service.sayHello("voole",callback);
- }
- function callback(data){
- alert(data);
- }
-
</
scr
īpt
>
- </
head
>
- <
body
>
-
<
input
type
=
"button"
value
=
"Send"
ō
nclick
=
"sayHello()"
/>
- </
body
>
- </
html
>
源码浅析
dwr的设计很象webwork2的设计,隐藏http协议,扩展性,兼容性及强。
通过研究uk.ltd.getahead.dwr.DWRServlet这个servlet来研究下dwr到底是如何工作滴。
代码
- web.xml配置
- <
servlet
>
-
<
servlet-name
>
dwr-invoker
</
servlet-name
>
-
<
servlet-class
>
uk.ltd.getahead.dwr.DWRServlet
</
servlet-class
>
-
</
servlet
>
-
<
servlet-mapping
>
-
<
servlet-name
>
dwr-invoker
</
servlet-name
>
-
<
url-pattern
>
/dwr/*
</
url-pattern
>
- </
servlet-mapping
>
<script>render_code();</script>
这样所有的/dwr/*所有请求都由这个servlet来处理,它到底处理了些什么能。我们还以上面最简单的例子来看。
1、 web服务器启动,DWRServlet init()方法调用,init主要做了以下工作。
设置日志级别、实例化DWR用到的单例类(这些类在jvm中只有一个实例对象)、读去配置文件(包括dwr.jar包中的dwr.xml,WEB-INF/dwr.xml. config*.xml)。
2、请求处理
DWRServlet.doGet, doPost方法都调用processor.handle(req, resp)方法处理。Processor对象在init()方法中已经初始化了。
代码
- public
void
handle(HttpServletRequest req, HttpServletResponse resp)
-
throws
IOException
- {
- String pathinfo = req.getPathInfo();
-
if
(pathinfo ==
null
|| pathinfo.length() ==
0
|| pathinfo.equals(
"/"
))
- {
- resp.sendRedirect(req.getContextPath() + req.getServletPath() + '/' +
"index.html"
);
- }
else
-
if
(pathinfo !=
null
&& pathinfo.equalsIgnoreCase(
"/index.html"
))
- {
- doIndex(req, resp);
- }
else
-
if
(pathinfo !=
null
&& pathinfo.startsWith(
"/test/"
))
- {
- doTest(req, resp);
- }
else
-
if
(pathinfo !=
null
&& pathinfo.equalsIgnoreCase(
"/engine.js"
))
- {
- doFile(resp,
"engine.js"
,
"text/javascript"
);
- }
else
-
if
(pathinfo !=
null
&& pathinfo.equalsIgnoreCase(
"/util.js"
))
- {
- doFile(resp,
"util.js"
,
"text/javascript"
);
- }
else
-
if
(pathinfo !=
null
&& pathinfo.equalsIgnoreCase(
"/deprecated.js"
))
- {
- doFile(resp,
"deprecated.js"
,
"text/javascript"
);
- }
else
-
if
(pathinfo !=
null
&& pathinfo.startsWith(
"/interface/"
))
- {
- doInterface(req, resp);
- }
else
-
if
(pathinfo !=
null
&& pathinfo.startsWith(
"/exec"
))
- {
- doExec(req, resp);
- }
else
- {
- log.warn(
"Page not found. In debug/test mode try viewing /[WEB-APP]/dwr/"
);
- resp.sendError(
404
);
- }
- }
<script>render_code();</script>
哦。这些恍然大悟。dwr/*处理的请求也就这几种。
(1)dwr/index.html,dwr/test/这种只能在debug模式下使用,调试用。
dwr/engine.js,dwr/util.js,dwr/deprecated.js当这个请求到达,从dwr.jar包中读取文件流,响应回去。(重复请求有缓存)
(2)当dwr/interface/这种请求到来,(例如我们在index.html中的 <script type='text/javascript' src='dwr/interface/JDate.js'></script>)DWR做一件伟大的事。把我们在WEB-INF/dwr.xml中的
<create creator="new" javascript="JDate">
<param name="class" value="java.util.Date"/>
</create>
java.util.Date转化为javascript函数。
http://localhost:port/simpledwr/dwr/interface/JDate.js看看吧。
细节也比较简单,通过java反射,把方法都写成javascript特定的方法。(我觉得这些转换可以放到缓存里,下次调用没必要再生成一遍,不知道作者为什么没这样做)。
(3)dwr/exec
javascript调用方法时发送这种请求,可能是XMLHttpRequest或IFrame发送。
当然,javascript调用的方法签名与java代码一致,包括参数,还有javascript的回调方法也传到了服务器端,在服务器端很容易实现。回调方法的java的执行结果 返回类似 <script>callMethod(结果)<script>的javascript字符串,在浏览器执行。哈,一切就这么简单,巧妙。
dwr的设计构思很是巧妙。
第一、把java类转化为javascript类由dwr自动完成,只需简单的配置。
第二、应用起来极其简单。开发者不要该服务器代码就可以集成。
第三、容易测试。和webwork一样,隐藏的http协议。
第四、及强扩展性。例如与spring集成,只需修改一点代码。
第五、性能。就我与jason,等简单比较,dwr性能可能是最好的。
第六、自动把java对象转化为javascript对象,并且及易扩展。[/
分享到:
相关推荐
这个"学习dwr的一个例子"是一个实践教程,可能包含了如何设置DWR环境、创建远程Java对象、调用这些对象的方法以及处理返回的数据等步骤。 1. **DWR简介**:DWR的核心功能是通过AJAX技术实现浏览器与服务器之间的...
这个"学习dwr的试验"是一个项目,旨在通过实践来理解和掌握DWR的核心功能,特别是其在服务器推送技术上的应用,从而实现在同一个界面上实现多用户聊天和私聊功能。 首先,我们要理解DWR的工作原理。DWR在后台创建了...
通过深入学习DWR,开发者可以构建出更加高效、交互性更强的Web应用,提升用户满意度。同时,DWR的源码也是一个很好的学习AJAX和Java服务器端编程的资源。在实际开发中,结合DWR的文档和示例,可以快速上手并熟练掌握...
这个"DWR开发实例"是一个专门为学习DWR技术准备的实践项目,旨在帮助开发者理解DWR的核心功能和使用方法。 在DWR中,主要涉及以下几个关键概念: 1. **Reverse Ajax**:DWR的核心特性之一是实现了Reverse Ajax,即...
在这个“学习dwr的入门例子”中,我们将探讨如何使用DWR构建一个简单的Web应用。 首先,了解DWR的基本概念至关重要。DWR的核心功能是创建了一个在客户端和服务器端之间的桥梁,使得JavaScript可以像调用本地函数...
总的来说,这个压缩包提供了一个全面的学习DWR的资源集合,从理论知识到实践案例,覆盖了DWR的方方面面。通过深入研究这些材料,你不仅可以了解DWR的工作机制,还能学会如何在实际项目中有效地应用它,提升Web应用的...
DWR学习资料 :DWR 3.0 上传文件.txt DWR3.0反向Ajax示例.txt DWR3.0...多人聊天室.doc 反向Ajax技术实例.txt 基于DWR反向AJAX的Web监控系统.doc 深入学习DWR3.0.txt 实战dwr.doc 使用Jetty和DWR创建伸缩性Comet程序.txt
其中,你会学习到如何在项目中引入DWR框架,配置DWR的XML文件,创建并注册Remote Objects,以及如何在客户端调用这些远程对象的方法。此外,教程可能还会介绍DWR的自动更新机制,使得页面无需刷新就能获取服务器端的...
**Ajax学习——DWR的参考书和实用案例学习总结** DWR(Direct Web Remoting)是一种优秀的开源框架,专门用于简化Web应用...结合参考书和实际案例,深入学习DWR,不仅可以提升技能,也能更好地理解和应用Ajax技术。
6. **学习DWR的好处** - **提升效率**:DWR简化了AJAX开发,减少了前端与后端之间的沟通成本。 - **增强用户体验**:通过实时交互和无刷新更新,提升用户对Web应用的满意度。 - **跨平台支持**:DWR可以与各种...
这个实例为学习DWR提供了一个基础平台,你可以在此基础上深入理解DWR的工作原理,以及如何将它应用于实际项目中,比如扩展登录功能,添加注册模块,或者与其他业务逻辑集成。同时,这也是一个实践数据库操作、Java...
### DWR JavaScript函数整理知识点详解 #### 一、概述 本文档主要收集并整理了一系列JavaScript函数,这些函数主要用于客户端表单验证以及数据合法性检查。通过这些函数,可以有效地提高前端开发效率,确保用户输入...
- 该中文文档将详细介绍DWR的安装、配置、使用方法以及常见问题的解决,是学习DWR的重要参考资料。 通过深入学习这份DWR中文文档,开发者不仅可以掌握DWR的基本用法,还能了解到如何在实际项目中有效利用DWR提升...
在学习DWR的过程中,理解以下概念至关重要: 1. **配置**:DWR的配置主要包括在Web应用的`web.xml`中设置过滤器和Servlet,以及在服务器端定义允许的Java类和方法。 2. **安全设置**:确保只允许特定的JavaScript和...
总的来说,这个资源对于想要学习DWR,并希望在实际项目中结合Spring、Struts2和Hibernate使用的开发者来说非常有价值。通过视频和文档,你可以深入理解DWR的工作原理,以及如何在三大框架中无缝集成DWR,提高开发...
在"Dwr demo - Dwr简单使用"这个项目中,你可以通过以下步骤了解和学习DWR的基本用法: 1. **环境准备**:首先确保你有Eclipse IDE,并且已经安装了Java Development Kit (JDK)。由于DWR是一个Java库,所以你需要一...
7. **错误处理**:学习DWR提供的错误处理机制,如何捕获并处理客户端和服务器端的异常。 8. **集成与调试**:理解如何将DWR与其他前端框架(如jQuery或AngularJS)集成,并使用DWR的内置调试工具进行问题排查。 9....
通过深入学习DWR3.0,您可以掌握创建高度交互、实时更新的Web应用的技能,同时了解如何有效地利用AJAX技术提高用户界面的响应性和效率。在实践中,结合DWR的文档和社区资源,您将能够更好地理解和应用这些概念,提升...
通过深入学习DWR,你可以提升Web应用的用户体验,创建更富于动态性的功能,如实时聊天、在线编辑、动态图表等。同时,DWR还提供了自动类型转换、错误处理和安全性机制,使得开发过程更为便捷和安全。
6. **DWR使用技巧**:深入学习DWR,你需要掌握如何配置DWR的Context、Servlet、以及在HTML和JavaScript中如何使用DWR API。例如,理解并使用`dwr.engine`对象来调用远程方法,使用`Batch`功能进行批量调用,以及错误...