`
lszone
  • 浏览: 5383 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

DWR源码学习

    博客分类:
  • Ajax
阅读更多
DWR源码学习(一)
DWR一个外国人实现的很有前途的AJAX框架。
多余的话就不说了,请看DWR的例子程序:
web.xml
 1<?xml version="1.0" encoding="ISO-8859-1"?>
 2<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
 3
 4<web-app id="dwr">
 5
 6  <display-name>DWR (Direct Web Remoting)</display-name>
 7  <description>A demo of how to call Java on the server directly from Javascript on the client</description>
 8
 9  <servlet>
10    <servlet-name>dwr-invoker</servlet-name>
11    <display-name>DWR Servlet</display-name>
12    <description>Direct Web Remoter Servlet</description>
13    <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
14    <!--
15    <init-param>
16      <param-name>config</param-name>
17      <param-value>WEB-INF/dwr.xml</param-value>
18    </init-param>
19    -->
20    <init-param>
21      <param-name>debug</param-name>
22      <param-value>true</param-value>
23    </init-param>
24    <init-param>
25      <param-name>scriptCompressed</param-name>
26      <param-value>false</param-value>
27    </init-param>
28    <load-on-startup>1</load-on-startup>
29  </servlet>
30
31  <servlet-mapping>
32    <servlet-name>dwr-invoker</servlet-name>
33    <url-pattern>/dwr/*</url-pattern>
34  </servlet-mapping>
35
36</web-app>


servlet(uk.ltd.getahead.dwr.DWRServlet)里:

 1     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException
 2     {
 3         try
 4         {
 5             builder.set(req, resp, getServletConfig(), getServletContext(), container);
 6             ServletLoggingOutput.setExecutionContext(this);
 7 
 8             processor.handle(req, resp);//该方法对所有request路径/dwr/*有效,在引用JS的时候,使用这个路径执行dwr生成的javascript代码

    finally
11         {
12             builder.unset();
13             ServletLoggingOutput.unsetExecutionContext();
14         }
15     }


index.html
 1 <?xml version="1.0" encoding="ISO-8859-1" ?>
 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
 3 <html xmlns="http://www.w3.org/1999/xhtml">
 4 <head>
 5   <title>DWR - Test Home</title>
 6   <script type='text/javascript' src='dwr/interface/Test.js'></script>
 7   <script type='text/javascript' src='dwr/engine.js'></script>
 8   <script type='text/javascript' src='dwr/util.js'></script>
 9   <script>
10     function init() {
11       // This turns off the no-javascript message
12       document.getElementById("start").style.display = "none";
13       // This checks for file: URLs and loading problems
14       if (window.DWREngine == null || window.DWRUtil == null) {
15         document.getElementById("file").style.display = "block";
16         return;
17       }
18       // DWR setup
19       DWREngine.setErrorHandler(function(message) { alert(message); });
20       DWREngine.setWarningHandler(function(message) { alert(message); });
21       DWRUtil.useLoadingMessage();
22       // Turn on the generic error div
23       $("error").style.display = "block";
24       // Load a message from the server
25       Test.getInsert(load);
26     }
27 
28     function load(data) {
29       $("error").style.display = "none";
30       DWRUtil.setValue("reply", data);
31       $("reply").style.display = "block";
32     }
33   </script>
34 </head>
35 
36 <body onload="init()">
37 .这一部分经过了SERVLET处理:
  <script type='text/javascript' src='dwr/interface/Test.js'></script>
  <script type='text/javascript' src='dwr/engine.js'></script>
  <script type='text/javascript' src='dwr/util.js'></script>dwrservlet.doPost方法内processor.handle(req, resp)这个方法如下:
 1     public void handle(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException
 2     {
 3         String pathInfo = req.getPathInfo();
 4         String servletPath = req.getServletPath();
 5 
 6         if (nullPathInfoWorkaround && pathInfo == null)
 7         {
 8             pathInfo = req.getServletPath();
 9             servletPath = HtmlConstants.PATH_ROOT;
10             log.debug("Default servlet suspected. pathInfo=" + pathInfo + "; contextPath=" + req.getContextPath() + "; servletPath=" + servletPath); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
11         }
12 
13         if (pathInfo == null ||
14             pathInfo.length() == 0 ||
15             pathInfo.equals(HtmlConstants.PATH_ROOT))
16         {
17             resp.sendRedirect(req.getContextPath() + servletPath + HtmlConstants.FILE_INDEX);
18         }
19         else if (pathInfo.startsWith(HtmlConstants.FILE_INDEX))
20         {
21             index.handle(req, resp);
22         }
23         else if (pathInfo.startsWith(HtmlConstants.PATH_TEST))
24         {
25             test.handle(req, resp);
26         }
27         else if (pathInfo.startsWith(HtmlConstants.PATH_INTERFACE))
28         {
29             iface.handle(req, resp);//这个方法是我们要关注的
             }
     。。。。。。。
     } iface.handle(req, resp);//这个方法是我们要关注的,来自DefaultInterfaceProcessor
 1     public void handle(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
 2     {
 3         String pathinfo = req.getPathInfo();
 4         String servletpath = req.getServletPath();
 5         if (pathinfo == null)
 6         {
 7             pathinfo = req.getServletPath();
 8             servletpath = HtmlConstants.PATH_ROOT;
 9         }
10         String scriptname = pathinfo;
11         scriptname = LocalUtil.replace(scriptname, HtmlConstants.PATH_INTERFACE, HtmlConstants.BLANK);
12         scriptname = LocalUtil.replace(scriptname, HtmlConstants.EXTENSION_JS, HtmlConstants.BLANK);
13         Creator creator = creatorManager.getCreator(scriptname);
14 
15         //resp.setContentType("text/javascript");
16         PrintWriter out = resp.getWriter();
17         out.println();
18 
19         out.println("function " + scriptname + "() { }"); //从这里开始DWR自动生成javascript
             String   path = overridePath;
22         if (path == null)
23         {
24             path = req.getContextPath() + servletpath;
25         }
26         out.println(scriptname + "._path = '" + path + "';"); //$NON-NLS-1$ //$NON-NLS-2$
27 
28         Method[] methods = creator.getType().getMethods();
29         for (int i = 0; i < methods.length; i++)
30         {
31             Method method = methods[i];
32             String methodName = method.getName();
33 
34             // We don't need to check accessControl.getReasonToNotExecute()
35             // because the checks are made by the doExec method, but we do check
36             // if we can display it
37             String reason = accessControl.getReasonToNotDisplay(req, creator, scriptname, method);
38             if (reason != null && !allowImpossibleTests)
39             {
40                 continue;
41             }
42 
43             // Is it on the list of banned names
44             if (jsutil.isReservedWord(methodName))
45             {
46                 continue;
47             }
48 
49             out.print('\n');
50             out.print(scriptname + '.' + methodName + " = function("); //$NON-NLS-1$
51             Class[] paramTypes = method.getParameterTypes();
52             for (int j = 0; j < paramTypes.length; j++)
53             {
54                 if (!LocalUtil.isServletClass(paramTypes[j]))
55                 {
56                     out.print("p" + j + ", "); //$NON-NLS-1$ //$NON-NLS-2$
57                 }
58             }
59             out.println("callback) {"); //$NON-NLS-1$
60 
61             out.print("    DWREngine._execute(" + scriptname + "._path, '" + scriptname + "', '" + methodName + "\', "); //实现javascript调用java内的方法
                 for (int j = 0; j < paramTypes.length; j++)
63             {
64                 if (LocalUtil.isServletClass(paramTypes[j]))
65                 {
66                     out.print("false, "); //$NON-NLS-1$
67                 }
68                 else
69                 {
70                     out.print("p" + j + ", "); //$NON-NLS-1$ //$NON-NLS-2$
71                 }
72             }
73             out.println("callback);"); //$NON-NLS-1$
74 
75             out.println('}');
76         }
77 
78         out.flush();
79     }


DWR例子程序下载地址:http://www.blogjava.net/Files/javajohn/dwr.rar
分享到:
评论

相关推荐

    dwr源码运行即可

    要运行DWR源码,你需要: 1. **环境准备**:确保你有一个Java开发环境,如JDK已经安装,并且配置好相应的环境变量。 2. **导入项目**:将压缩包中的源码导入到IDE(如Eclipse、IntelliJ IDEA)中,创建一个新的...

    DWR源码(eclipse源码)

    这份"DWR源码(eclipse源码)"是一个学习DWR实现和原理的宝贵资源,特别是对于初学者来说。 **DWR的核心功能:** 1. **异步通信**:DWR通过AJAX(Asynchronous JavaScript and XML)技术实现页面的无刷新更新,提高...

    dwr源码实例下载,dwr 源码 验证

    在描述中提到的"自己写的dwr源码实例"意味着这个压缩包中可能有一个由个人开发的、基于DWR的项目,展示了如何使用DWR进行客户端和服务器端的通信。这个实例对于初学者来说是一个很好的学习资源,可以帮助他们理解DWR...

    dwr案例源码

    本案例源码提供了对DWR技术的实践演示。 DWR的核心功能包括: 1. **AJAX通信**:DWR通过XMLHttpRequest对象实现AJAX(Asynchronous JavaScript and XML)通信,使得页面无需刷新即可与服务器交互。 2. **反向AJAX**...

    dwr分页源码,dwr分页源码

    总的来说,DWR分页源码的分析和学习可以帮助开发者更好地理解和实现Ajax分页,提升Web应用的用户体验。通过深入研究这些代码,我们可以学习到DWR与Ajax的集成、服务器端数据处理以及前端交互设计等方面的知识。

    dwr源码.rar_DWR源代码

    DWR源码分析将帮助我们深入理解其内部机制,为自定义扩展或优化提供可能。 首先,"dwr-version.properties"文件通常包含了DWR的版本信息,这有助于我们在研究时确定所使用的具体版本,以便对照官方文档和社区资源。...

    DWR学习讲解带源码

    本讲解将深入探讨DWR的核心概念、工作原理以及如何通过实例进行学习。 1. **DWR的基本概念** DWR的核心思想是创建一个JavaScript到Java的桥梁,使得前端可以像操作本地对象一样操作远程服务器上的Java对象。这主要...

    Dwr源码示例,包含调用java方法返回不同的类型

    总的来说,这个"Dwr源码示例"提供了一个学习DWR基本用法的平台,涵盖了从设置环境到实际调用Java方法的全过程,对于理解DWR如何在Web应用中工作,以及如何处理不同类型的数据,是非常有价值的。通过实践这个示例,你...

    DWR2.0.5源码

    开发者可以通过阅读这些源码学习到关于Web服务端编程、HTTP协议、JSON或XML序列化等知识。 3. **Java5**:这部分可能是专门为Java 5兼容性编写的代码或者配置。Java 5引入了许多新的特性,如泛型、枚举、注解等,...

    dwr源码示例,可以运行,包含基本的功能

    在这个"**dwr源码示例,可以运行,包含基本的功能**"中,我们可以深入理解DWR的工作原理和常见用法。 首先,DWR的核心特性是提供了安全、高效的AJAX(异步JavaScript和XML)通信方式,使得前端开发者无需了解复杂的...

    DWR-jar包+源码

    Direct Web Remoting ...总的来说,这个压缩包提供了完整的DWR运行环境和源码,对于开发基于AJAX的Web应用,或深入学习DWR的工作原理,都是非常宝贵的资源。无论是初学者还是经验丰富的开发者,都可以从中受益匪浅。

    dwr反转AJAX聊天源码

    通过学习和研究这个源码,开发者可以了解到如何使用DWR库实现服务器向客户端的实时数据推送,掌握DWR的基本配置和API使用,同时也能理解如何设计和实现一个简单的聊天系统。这对于理解Ajax通信、提升Web开发技能,...

    dwr和ssh的集成源码

    这个集成源码可能会包含如上的配置文件、Java类、Action类、JavaScript文件等,通过阅读和实践,学习者可以了解如何在实际项目中将这两个强大的工具集结合在一起,提升Web应用的性能和交互性。 总的来说,这个集成...

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

    开发者可以通过解压war文件查看源码,学习DWR的内部实现。 ### 实用案例 学习DWR时,实践是最好的老师。通过实际案例,可以理解DWR如何处理异步请求、如何与服务器通信以及如何处理响应数据。例如,创建一个动态...

    DWR2.0 中文手册

    `ajax框架:dwr》实战(包括整合).pdf`这本书籍应该包含了实际项目中的应用案例和整合技巧,是学习DWR 2.0实战经验的重要资源。 通过深入学习DWR 2.0,开发者可以构建出交互性强、响应速度快的Web应用,同时降低前后...

    一个DWR最简单的例子,不错的哦!

    这个“一个DWR最简单的例子”为我们提供了一个直观的学习DWR如何工作的起点。 首先,DWR的核心概念是远程方法调用(Remote Method Invocation, RMI)。在传统的Web应用中,JavaScript主要处理前端交互,而服务器端...

    dwr分页源码!

    DWR(Direct Web Remoting)是一个Java库,它允许JavaScript在客户端与服务器端进行交互,实现了AJAX...通过研究这个源码,开发者可以学习到如何利用DWR进行前后端通信,实现高效且用户体验良好的分页功能。

    简单使用dwr完整例子

    Direct Web Remoting (DWR) 是一个开源Java库,它允许Web应用程序在浏览器和服务器之间进行实时、异步通信,从而实现类似AJAX的功能。在这个"简单使用DWR完整例子"中,我们将深入理解DWR的基本概念、配置、以及如何...

    dwr与ssh框架整合源码

    【标题】"dwr与ssh框架整合源码"所涉及的知识点主要集中在Web开发领域,特别是Java后端技术栈的应用。DWR(Direct Web Remoting)是一个开源的Java库,它使得JavaScript可以与服务器端的Java对象直接交互,实现动态...

Global site tag (gtag.js) - Google Analytics