`
bicashy
  • 浏览: 159644 次
社区版块
存档分类
最新评论

学习DWR

阅读更多

        在项目中需要用到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!";   
      }   
       
     }   
     
    1.   

dwr.xml

  1. <? xml   version = "1.0"   encoding = "UTF-8" ?>   
  2. < dwr >   
  3.    < allow >        
  4.      < create   creator = "new"  javascrī pt = "Service"   scope = "application" >   
  5.        < param   name = "class"   value = "helloWorld.Service" />   
  6.      </ create >   
  7.    </ allow >   
  8. </ dwr >   

web.xml

  1. <? xml   version = "1.0"   encoding = "UTF-8" ?>   
  2. < web-app >   
  3.    < servlet >   
  4.      < servlet-name > dwr-invoker </ servlet-name >   
  5.      < servlet-class > org.directwebremoting.servlet.DwrServlet </ servlet-class >   
  6.      < init-param >   
  7.        < param-name > logLevel </ param-name >   
  8.        < param-value > INFO </ param-value >   
  9.      </ init-param >   
  10.      < init-param >   
  11.        < param-name > debug </ param-name >   
  12.        < param-value > true </ param-value >   
  13.      </ init-param >   
  14.    </ servlet >   
  15.    < servlet-mapping >   
  16.      < servlet-name > dwr-invoker </ servlet-name >   
  17.      < url-pattern > /dwr/* </ url-pattern >   
  18.    </ servlet-mapping >      
  19. </ web-app >   

helloworld.html

  1. < html >   
  2. < head >   
  3.   < title > Hello World </ title >   
  4.   < scr īpt  type = 'text/javascrīpt'   src = '../dwr/engine.js' >   </ scr īpt >   
  5.   < scr īpt  type = 'text/javascrīpt'   src = '../dwr/interface/Service.js' >   </ scr īpt >   
  6.   < scr īpt  type = 'text/javascrīpt'   src = '../dwr/util.js' >   </ scr īpt >   
  7.   < scr īpt  type = "text/javascrīpt" >   
  8.       function sayHello() {   
  9.        Service.sayHello("voole",callback);   
  10.       }   
  11.    function callback(data){   
  12.     alert(data);   
  13.    }   
  14.   </ scr īpt >   
  15. </ head >   
  16. < body >   
  17.   < input   type = "button"   value = "Send"  ō nclick = "sayHello()"   />   
  18. </ body >   
  19. </ html >   

源码浅析
dwr的设计很象webwork2的设计,隐藏http协议,扩展性,兼容性及强。

通过研究uk.ltd.getahead.dwr.DWRServlet这个servlet来研究下dwr到底是如何工作滴。

 

代码
  1. web.xml配置   
  2. < servlet >   
  3.      < servlet-name > dwr-invoker </ servlet-name >   
  4.      < servlet-class > uk.ltd.getahead.dwr.DWRServlet </ servlet-class >   
  5.    </ servlet >   
  6.    < servlet-mapping >   
  7.      < servlet-name > dwr-invoker </ servlet-name >   
  8.      < url-pattern > /dwr/* </ url-pattern >   
  9. </ 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()方法中已经初始化了。

代码
  1. public   void  handle(HttpServletRequest req, HttpServletResponse resp)   
  2.          throws  IOException   
  3.     {   
  4.         String pathinfo = req.getPathInfo();   
  5.          if (pathinfo ==  null  || pathinfo.length() ==  0  || pathinfo.equals( "/" ))   
  6.         {   
  7.             resp.sendRedirect(req.getContextPath() + req.getServletPath() + '/' +  "index.html" );   
  8.         }  else   
  9.          if (pathinfo !=  null  && pathinfo.equalsIgnoreCase( "/index.html" ))   
  10.         {   
  11.             doIndex(req, resp);   
  12.         }  else   
  13.          if (pathinfo !=  null  && pathinfo.startsWith( "/test/" ))   
  14.         {   
  15.             doTest(req, resp);   
  16.         }  else   
  17.          if (pathinfo !=  null  && pathinfo.equalsIgnoreCase( "/engine.js" ))   
  18.         {   
  19.             doFile(resp,  "engine.js" "text/javascript" );   
  20.         }  else   
  21.          if (pathinfo !=  null  && pathinfo.equalsIgnoreCase( "/util.js" ))   
  22.         {   
  23.             doFile(resp,  "util.js" "text/javascript" );   
  24.         }  else   
  25.          if (pathinfo !=  null  && pathinfo.equalsIgnoreCase( "/deprecated.js" ))   
  26.         {   
  27.             doFile(resp,  "deprecated.js" "text/javascript" );   
  28.         }  else   
  29.          if (pathinfo !=  null  && pathinfo.startsWith( "/interface/" ))   
  30.         {   
  31.             doInterface(req, resp);   
  32.         }  else   
  33.          if (pathinfo !=  null  && pathinfo.startsWith( "/exec" ))   
  34.         {   
  35.             doExec(req, resp);   
  36.         }  else   
  37.         {   
  38.             log.warn( "Page not found. In debug/test mode try viewing /[WEB-APP]/dwr/" );   
  39.             resp.sendError( 404 );   
  40.         }   
  41.     }  

<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的一个例子"是一个实践教程,可能包含了如何设置DWR环境、创建远程Java对象、调用这些对象的方法以及处理返回的数据等步骤。 1. **DWR简介**:DWR的核心功能是通过AJAX技术实现浏览器与服务器之间的...

    学习dwr的试验

    这个"学习dwr的试验"是一个项目,旨在通过实践来理解和掌握DWR的核心功能,特别是其在服务器推送技术上的应用,从而实现在同一个界面上实现多用户聊天和私聊功能。 首先,我们要理解DWR的工作原理。DWR在后台创建了...

    学习dwr详细笔记

    通过深入学习DWR,开发者可以构建出更加高效、交互性更强的Web应用,提升用户满意度。同时,DWR的源码也是一个很好的学习AJAX和Java服务器端编程的资源。在实际开发中,结合DWR的文档和示例,可以快速上手并熟练掌握...

    DWR 开发实例是用来学习DWR的一个实例

    这个"DWR开发实例"是一个专门为学习DWR技术准备的实践项目,旨在帮助开发者理解DWR的核心功能和使用方法。 在DWR中,主要涉及以下几个关键概念: 1. **Reverse Ajax**:DWR的核心特性之一是实现了Reverse Ajax,即...

    学习dwr的入门例子

    在这个“学习dwr的入门例子”中,我们将探讨如何使用DWR构建一个简单的Web应用。 首先,了解DWR的基本概念至关重要。DWR的核心功能是创建了一个在客户端和服务器端之间的桥梁,使得JavaScript可以像调用本地函数...

    DWR的学习资料,DWR学习必备

    总的来说,这个压缩包提供了一个全面的学习DWR的资源集合,从理论知识到实践案例,覆盖了DWR的方方面面。通过深入研究这些材料,你不仅可以了解DWR的工作机制,还能学会如何在实际项目中有效地应用它,提升Web应用的...

    DWR学习资料

    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框架,配置DWR的XML文件,创建并注册Remote Objects,以及如何在客户端调用这些远程对象的方法。此外,教程可能还会介绍DWR的自动更新机制,使得页面无需刷新就能获取服务器端的...

    Ajax学习——DWR的参考书和实用案例学习总结

    **Ajax学习——DWR的参考书和实用案例学习总结** DWR(Direct Web Remoting)是一种优秀的开源框架,专门用于简化Web应用...结合参考书和实际案例,深入学习DWR,不仅可以提升技能,也能更好地理解和应用Ajax技术。

    DWR框架学习资料...

    6. **学习DWR的好处** - **提升效率**:DWR简化了AJAX开发,减少了前端与后端之间的沟通成本。 - **增强用户体验**:通过实时交互和无刷新更新,提升用户对Web应用的满意度。 - **跨平台支持**:DWR可以与各种...

    dwr学习实例+dwr完整包(简单登陆,完整版,下载可直接跑)

    这个实例为学习DWR提供了一个基础平台,你可以在此基础上深入理解DWR的工作原理,以及如何将它应用于实际项目中,比如扩展登录功能,添加注册模块,或者与其他业务逻辑集成。同时,这也是一个实践数据库操作、Java...

    学习DWR JavaScript函数整理

    ### DWR JavaScript函数整理知识点详解 #### 一、概述 本文档主要收集并整理了一系列JavaScript函数,这些函数主要用于客户端表单验证以及数据合法性检查。通过这些函数,可以有效地提高前端开发效率,确保用户输入...

    DWR中文文档DWR

    - 该中文文档将详细介绍DWR的安装、配置、使用方法以及常见问题的解决,是学习DWR的重要参考资料。 通过深入学习这份DWR中文文档,开发者不仅可以掌握DWR的基本用法,还能了解到如何在实际项目中有效利用DWR提升...

    (总)DWR学习下载

    在学习DWR的过程中,理解以下概念至关重要: 1. **配置**:DWR的配置主要包括在Web应用的`web.xml`中设置过滤器和Servlet,以及在服务器端定义允许的Java类和方法。 2. **安全设置**:确保只允许特定的JavaScript和...

    dwr基础_dwr兼容三大框架+视频

    总的来说,这个资源对于想要学习DWR,并希望在实际项目中结合Spring、Struts2和Hibernate使用的开发者来说非常有价值。通过视频和文档,你可以深入理解DWR的工作原理,以及如何在三大框架中无缝集成DWR,提高开发...

    dwr demo dwr简单使用

    在"Dwr demo - Dwr简单使用"这个项目中,你可以通过以下步骤了解和学习DWR的基本用法: 1. **环境准备**:首先确保你有Eclipse IDE,并且已经安装了Java Development Kit (JDK)。由于DWR是一个Java库,所以你需要一...

    DWR 视频教程 使用DWR开发AJAX For JavaEE

    7. **错误处理**:学习DWR提供的错误处理机制,如何捕获并处理客户端和服务器端的异常。 8. **集成与调试**:理解如何将DWR与其他前端框架(如jQuery或AngularJS)集成,并使用DWR的内置调试工具进行问题排查。 9....

    DWR3.0自己学习时的资料(jar包帮助文档等)

    通过深入学习DWR3.0,您可以掌握创建高度交互、实时更新的Web应用的技能,同时了解如何有效地利用AJAX技术提高用户界面的响应性和效率。在实践中,结合DWR的文档和社区资源,您将能够更好地理解和应用这些概念,提升...

    DWR学习与DWR.xml配置说明

    通过深入学习DWR,你可以提升Web应用的用户体验,创建更富于动态性的功能,如实时聊天、在线编辑、动态图表等。同时,DWR还提供了自动类型转换、错误处理和安全性机制,使得开发过程更为便捷和安全。

    好资料 学习资料DWR

    6. **DWR使用技巧**:深入学习DWR,你需要掌握如何配置DWR的Context、Servlet、以及在HTML和JavaScript中如何使用DWR API。例如,理解并使用`dwr.engine`对象来调用远程方法,使用`Batch`功能进行批量调用,以及错误...

Global site tag (gtag.js) - Google Analytics