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

DWR源码学习函数调用篇

阅读更多
Dwr 通过用户配置文件 dwr.xml java 类映射成一个 javascript 对象,从实现手法上看与 java 里的数据映射很相似。而 dwr 是将 JAVA 的对象映射到了 js 里,由客户端的 JS 提供给用户各类实现,而 java 代码完全在后台运行。

       DWR 函数调用里涉及到的 JS 代码: engine.js

       DWR 函数调用里涉及到的类有: AbstractDWRServlet DefaultProcessor <o:p></o:p>

用户在提交 request 以后的操作步骤请参见我 blog 里的:《 dwr 源码学习(一)》, JAVA 代码生成的映射 JS 代码其实只是一个 javascript 接口,它调用了 DWREngine._execute 这个函数,而这个函数大体只是执行了一些解析的工作,在它结尾处调用了 DWREngine.endBatch() ,然后又执行了 DWREngine._sendData(batch) ,这时我们会发现有这样一句: batch.req.open("GET", batch.path + "/exec/" + statsInfo + "?" + query, batch.async); ”很熟悉吧。 <o:p></o:p>

    下一步就到了真正的实现 js 调用 java 代码里方法的时候了,兴奋吧。其实实现也是很简单的。通过 servlet 这里实现了对各类型 request 参数的不同的匹配,还是看 AbstractDWRServlet .getPost() 这个方法:

 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);
 9         }
10         finally
11         {
12             builder.unset();
13             ServletLoggingOutput.unsetExecutionContext();
14         }
15 }
16 注意processor.handle(req, resp);
17     public void handle(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException
18     {
19         String pathInfo = req.getPathInfo();
20         String servletPath = req.getServletPath();
21 
22         if (nullPathInfoWorkaround && pathInfo == null)
23         {
24             pathInfo = req.getServletPath();
25             servletPath = HtmlConstants.PATH_ROOT;
26             log.debug("Default servlet suspected. pathInfo=" + pathInfo + "; contextPath=" + req.getContextPath() + "; servletPath=" + servletPath); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
27         }
28 
29         if (pathInfo == null ||
30             pathInfo.length() == 0 ||
31             pathInfo.equals(HtmlConstants.PATH_ROOT))
32         {
33             resp.sendRedirect(req.getContextPath() + servletPath + HtmlConstants.FILE_INDEX);
34         }
35         else if (pathInfo.startsWith(HtmlConstants.FILE_INDEX))
36         {
37             index.handle(req, resp);
38         }
39         else if (pathInfo.startsWith(HtmlConstants.PATH_TEST))
40         {
41             test.handle(req, resp);
42         }
43         else if (pathInfo.startsWith(HtmlConstants.PATH_INTERFACE))
44         {
45             iface.handle(req, resp);
46         }
47         else if (pathInfo.startsWith(HtmlConstants.PATH_EXEC))
48         {
49             exec.handle(req, resp);
50         }
51         else if (pathInfo.equalsIgnoreCase(HtmlConstants.FILE_ENGINE))
52         {
53             file.doFile(req, resp, HtmlConstants.FILE_ENGINE, HtmlConstants.MIME_JS);
54         }
55         else if (pathInfo.equalsIgnoreCase(HtmlConstants.FILE_UTIL))
56         {
57             file.doFile(req, resp, HtmlConstants.FILE_UTIL, HtmlConstants.MIME_JS);
58         }
59         else if (pathInfo.equalsIgnoreCase(HtmlConstants.FILE_DEPRECATED))
60         {
61             file.doFile(req, resp, HtmlConstants.FILE_DEPRECATED, HtmlConstants.MIME_JS);
62         }
63         else
64         {
65             log.warn("Page not found (" + pathInfo + "). In debug/test mode try viewing /[WEB-APP]/dwr/"); //$NON-NLS-1$ //$NON-NLS-2$
66             resp.sendError(HttpServletResponse.SC_NOT_FOUND);
67         }
68     }
69 

也就只有这几种类型的请求,还记得 DWREngine._sendData 吗?里面有这么一句:“ batch.req.open("GET", batch.path + "/exec/" + statsInfo + "?" + query, batch.async); ”看到他的请求路径是 exec ,对应在 processor.handle(req, resp); 这个方法里就是 exec ,在刚才的 JAVA 代码里我们已经看到过了是括号内的代码( else if (pathInfo.startsWith(HtmlConstants. PATH_EXEC )) ),而 exec 早已在 servlet 初始化的时候就已经设置为 DefaultExecProcessor ,它的函数 hadle() 就是具体对 js 调用 java 类方法的实现了。 <o:p></o:p>

DWR 是一个小型的 AJAX 框架,它的实现思路简单,其实有很多人在开发中一定也有过类似的想法。它之所以现在才出现我想大概还是要归功于异步 javascript 消息发送这样的技术成为现实。所以我又想 AJAX ,从技术上说只能是 javascript 有了一个飞跃性的进步,而 AJAX 的最终成功却要靠软件工程。 

分享到:
评论

相关推荐

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

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

    dwr案例源码

    DWR提供了异步调用的API,可以处理回调函数来处理成功或失败的情况。 7. **错误处理**:理解DWR的错误处理机制,包括网络错误、服务器端错误和安全异常等。 8. **页面集成**:了解如何在HTML页面中引入DWR的...

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

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

    DWR的基本原理以及前后台互相调用并整合SPRING的简易DEMO

    DWR简化了AJAX开发,使开发者能够像调用本地函数一样调用远程服务,极大地提高了用户体验。 在这个“DWR的基本原理以及前后台互相调用并整合SPRING的简易DEMO”中,我们将探讨DWR的核心概念和如何将它与Spring框架...

    DWR学习讲解带源码

    - **通信阶段**:当用户在浏览器中执行JavaScript函数时,请求被发送到服务器,DWR引擎处理请求并调用相应的Java方法。 - **响应阶段**:服务器返回结果,DWR将结果转换为JavaScript可以理解的格式,并在浏览器中...

    dwr学习之基础篇

    《DWR学习之基础篇——深入理解Direct Web Remoting》 Direct Web Remoting(DWR)是一种开源JavaScript库,它允许在Web浏览器和Java服务器之间进行实时、双向通信,极大地简化了AJAX(Asynchronous JavaScript and...

    DWR2.0.5源码

    - **JavaScript API**:DWR生成一组JavaScript文件,使得在浏览器中可以调用服务器端的方法,就像它们是本地函数一样。 - **映射**:DWR自动处理对象的序列化和反序列化,使得服务器端的数据可以方便地传递给客户端...

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

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

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

    通过这个简单的DWR demo,你可以学习到如何设置DWR环境,编写可被JavaScript调用的Java方法,以及在客户端进行调用的JavaScript代码编写。这将帮助你理解DWR的工作原理,并为构建更复杂的交互式Web应用打下基础。

    简单使用dwr完整例子

    这些请求通常是通过DWR的JavaScript函数触发的。 6. **编写前端页面**:在JSP或HTML页面中,引入DWR生成的JavaScript文件,并编写调用后台方法的JavaScript代码。例如,你可以创建一个按钮,点击后通过DWR调用...

    dwr小项目及资料

    DWR的核心理念是反转AJAX调用,也就是说,不仅前端可以调用后端,后端也可以主动调用前端的JavaScript函数。 标题中的“dwr小项目及资料”暗示我们这是一套关于DWR的实践项目和学习资源,可能包含了一些示例代码和...

    DWR源代码

    DWR通过在服务器上注册Java对象,使得这些对象的方法可以在JavaScript中直接调用,就像它们是本地函数一样。同时,DWR提供了安全机制,如CSRF(Cross-Site Request Forgery)防护,确保跨域请求的安全性。 2. **DWR...

    DWR 2.0M3 学习笔记

    DWR (Direct Web Remoting) 是一个开源的Java库,它允许Web应用程序在客户端和服务器之间进行实时的、异步的通信。...在学习过程中,结合源码分析可以更深入地理解DWR的工作机制,提升自己的开发技能。

    dwr 孔浩 源码

    通过研究孔浩提供的DWR源码,我们可以深入了解DWR的工作原理,学习如何优化和扩展其功能,甚至为自己的项目定制特定的解决方案。同时,对于想要深入理解AJAX和Web交互机制的开发者来说,这是一个宝贵的参考资料。

    Dwr 推例子 反转 ajax dwr dwr推群聊 dwr聊天系统源码 聊天系统 广播系统

    源码学习价值** 提供源码的项目对于学习和理解DWR的实际应用非常有价值。通过阅读和分析源码,开发者可以深入理解DWR如何与后端服务交互,以及如何实现实时通信、数据加密和持久化等关键功能。 总之,这个基于DWR...

    java_DWR递归函数实现城市的省市县三级联动

    例如,当用户在省的选择框中改变选项时,触发一个事件,通过DWR调用`getChildrenById`函数,传入当前选中的省ID,获取对应的所有城市,然后更新市的选择框。同理,市选择框的变化也会触发类似的过程,获取并更新县的...

    dwr-src.zip

    研究DWR源码可以帮助开发者了解其内部实现,提高对Ajax和服务器端通信的理解。同时,通过对源码的修改和扩展,可以定制化DWR以适应特定项目需求,或者开发出新的功能模块。 6. **示例应用**: DWR常用于创建动态...

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

    DWR的主要功能是提供一种简单而安全的方法来调用服务器端的Java方法,就像它们是本地JavaScript函数一样。这极大地简化了AJAX(异步JavaScript和XML)开发,因为它消除了手动创建和解析XML或JSON的需要。 在这个...

    基于J2EE的ajax宝典-dwr部分源码

    在"基于J2EE的ajax宝典-dwr部分源码"中,我们可以深入学习以下几个关键知识点: 1. **DWR的配置**:在J2EE应用中集成DWR,需要在web.xml中添加DWR的Servlet配置,包括设置过滤器、映射URL等,以便DWR能正确处理HTTP...

    dwr3 学习笔记<一>

    当服务器返回结果时,DWR会调用预先定义的回调函数,将结果传递给客户端。 5. **安全性与数据转换** DWR3提供了内置的安全机制,如CORS(跨源资源共享)支持和可配置的安全策略,以防止未授权的调用。此外,DWR还...

Global site tag (gtag.js) - Google Analytics