文档章节

由dwr不支持重载的方法探究dwr的运行机制

白志华
 白志华
发布于 2015/10/18 10:55
字数 854
阅读 2
收藏 0
点赞 0
评论 0

       上篇博文中简单分享了一个dwr的小例子。在做小例子的过程中,发现了一个有趣的现象:dwr不支持重载的方法。

       java代码:

package com.tgb.dwr;

/**
 * dwr使用测试
 * @author Admin
 *
 */
public class DwrTest {

	public String hello(){
		return "Hello!";
	}

	public String hello(String name){
		return "Hello,"+name;
	}
	
}

       js代码:

<script type="text/javascript">
function test1(){
	
	//尝试调用无参的hello
	T1.hello(
		function(data){
			alert(data);
		}
	);

	//尝试调用有参的hello,参数为Arron
	T1.hello("Arron",
			function(data){
				alert(data);
			}
		);
}

</script>

       执行效果如图:


       本来以后应该弹出2个弹出框,先是Hello!,再是Hello,Arron。结果却是这样。然后把java代码中的2个方法调换了一下位置,则只弹了“Hello!”的提示框。


       这是为什么呢?难道对于java代码中的同名方法,只解析最后一个??想想也不太可能,肯定都解析了。为了弄明白原因,那么需要从dwr的实现机制下手了。


      (1)部署阶段:

       读dwr.xml,在该xml文件中定义的Javascript——T1,它对应的类为如DwrTest,通过反射生成T1.js,其中DwrTest中的方法也就是调用后台类的方法


      (2)运行阶段:

触发事件调用一个方法test1——>

从自己的js中调用了上面的T1.js中的方法hello——>

调用客户端的AJAX引擎发出请求——>


以上三步都是由客户端完成,后面的都是有服务器端来完成:


Web容器先接到请求,找上下文路径:/dwr/匹配dwr中对应的servlet (在web.xml配置的)——>

读dwr.xml;根据js名匹配creator定义;依据creator方法通过反射创建实例(每次调用都会创建一个实例);调用方法,得到返回值——>

out出去——>

回调处理——>

调用客户端的回调处理(本实例是直接alert结果)。


      每触发一下事件,最后都会反射一个新的实例,这个可以在java代码中加上下面的代码进行测试:

static long count = 0;
	public DwrTest(){
		count++;
		System.out.println("实例个数为:"+count);
	}

      这就是dwr的处理流程了。最重要的就是这个dwr.xml,生成的js靠的是它,后台调用反射的实例也是基于它的。


      从dwr的处理流程来看,要想探究上面提到的不支持重载的方法,那么就需要看一下客户端生成的js文件。通过查看网页编码,然后打开引用的js文件——“dwr/interface/T1.js”。内容就展现出来了:

// Provide a default path to dwr.engine
if (dwr == null) var dwr = {};
if (dwr.engine == null) dwr.engine = {};
if (DWREngine == null) var DWREngine = dwr.engine;

if (T1 == null) var T1 = {};
T1._path = '/dwr_test/dwr';
T1.hello = function(p0, callback) {
  dwr.engine._execute(T1._path, 'T1', 'hello', p0, callback);
}
T1.hello = function(callback) {
  dwr.engine._execute(T1._path, 'T1', 'hello', callback);
}

       可以看到T1.hello有2条赋值语句,这就是关键所在了。dwr是按照java类方法的定义顺序依次绑定方法的,所以调用T1.hello,只能执行最后绑定的方法。


       dwr虽然很方便,但是由于使用了js,那么js可能出现的问题,都是它可能出现的问题。dwr还需要继续努力,而我们也要在遇到问题时,适当的刨刨根,问问底,才能真正的了解它,使用它。


版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/xiaoxian8023/article/details/25036953

共有 人打赏支持
白志华
粉丝 29
博文 265
码字总数 57524
作品 0
长沙
程序员
Ajax框架DWR入门

Direct Web Remoting DWR allows Javascript in a browser to interact with Java on a server and helps you manipulate web pages with the results. DWR is Easy Ajax for Java 官方网站:......

zting科技
2017/01/12
0
0
在 Spring Web MVC 环境下使用 DWR

DWR 简介 目前 Ajax 的开发框架有很多,使用这些框架可以简化 Ajax 的开发。DWR (Direct Web Remoting) 是一个用于改善 Web 页面与 Java 类交互的远程服务器端 Ajax 开源框架。DWR 可以动态生...

红薯
2011/01/12
1K
1
dwr3实现消息精确推送详细步骤

最近项目中需要用到推送消息,找了很久终于找到一篇不错的文章,方便以后查看就转载了,也分享给大家,希望能帮到有需要的人。 第一、在项目中引入dwr.jar,然后在web.xml中进行配置,配置如...

开源真好耶
2016/01/06
47
1
DWR反转与spring3相结合的comet方式有没有很好得解决方案???

如果用spring3的 DwrServelt配置反转mananger 报: No bean named 'dwrConfiguration' is defined 原因不明,猜测是由于dwr版本问题造成的。DWR反转与spring3相结合的comet方式没有很好得解决...

JavaOlder
2013/04/16
1K
1
Dwr3.0纯注解(纯Java Code配置)配置与应用浅析二之前端调用后端

首先当我们将Dwr3配置好以后,我们可以在浏览器中测试一下,查看一下我们配置的Dwr有没有生效,方法是 http://localhost:[你的服务器端口号,默认不写为80]/[ Web 名称 ]/dwr/,回车后就会出...

源-代码
2016/04/27
773
2
ajax框架dwr开发

dwr实现AJAX非常先进。比如动态生成javaScript代码;隐藏的HTTP协议,javascript用于java代码交互的javaScript对象。  自从我开始DWR感觉DWR是用javaScript对象去代替java类的对象去做...

zting科技
2017/01/12
0
0
Spring 整合dwr实例及详细步骤

dwr是属于Ajax框架的一种技术,其主要原理就是通过配置文件动态的将服务器端的java方法生成javascript方法,使客户端页面的js能方便的调用后台方法来处理数据,减轻服务器的压力而且实现了页...

javaEasy
2012/08/16
0
1
Java的Ajax框架--DWR

DWR是一个Java开源库,帮助你实现Ajax网站。 它可以让你在浏览器中的Javascript代码调用Web服务器上的Java,就像在Java代码就在浏览器中一样。 DWR主要包括两部分: 在服务器上运行的Servlet...

匿名
2008/09/05
17K
3
DWR与Strut2的Action冲突问题

DWR与Strut2整合后,当运行http://localhost:8080/工程名称/dwr测试暴露的方法时,就会出现如下错误: 要解决这个问题,首先要了解一下: 1、Struts2在web.xml中配置为“/”和“.action,*.j...

拷贝忍者卡卡习
2016/11/11
3
0
DWR 3.0 RC2 发布

DWR3.0 RC2版发布,该版本包含众多bug修复,以及性能改进。 bug修复详细记录: [DWR-9] - Wrong collection returned when same function name called consecutively [DWR-117] - Annotatio......

咖啡碼農
2011/07/01
2.8K
4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

深入理解springMVC

什么是spring MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而...

Java填坑之路
9分钟前
0
0
《射雕英雄传》书摘

1. 我虽是个飘泊江湖的贫家女子,可不是低三下四、不知自爱之人。你如真心爱我,须当敬我重我。我此生决无别念,就是钢刀架颈,也决意跟定了你。将来……将来如有洞房花烛之日,自然……自能...

k91191
20分钟前
0
0
解决:modal中datePicker 选中时,会触发modal的hidden.bs.modal事件

最近项目中发现了一个bug,具体表现为选中模态框上datepicker组件上的日期时,会触发模态框的关闭事件,导致数据编辑无法正常进行。网上搜索了下,解决方法如下: $('.datepicker').on('hid...

Funcy1122
24分钟前
0
0
matplotlib 绘图 常用设置

中文乱码 from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的...

阿豪boy
39分钟前
0
0
Redis分布式锁的正确实现方式

前言 分布式锁一般有三种实现方式: 1.数据库乐观锁 2.基于Redis的分布式锁; 3.基于Zookeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis...

大海201506
今天
0
0
ClassNotFoundException: javax.el.ELManager

这个是因为tomcat7中的el-api2.2,有些版本太低,建议升级tomcat到8.0,利用el-api3.0就会解决这个问题。

无语年华
今天
0
0
Jvm堆内存的划分结构和优化,垃圾回收详解(详细解答篇)

在JVM中堆空间划分如下图所示 上图中,刻画了Java程序运行时的堆空间,可以简述成如下2条 1.JVM中堆空间可以分成三个大区,新生代、老年代、永久代 2.新生代可以划分为三个区,Eden区,两个幸...

嘻哈开发者
今天
1
0
CentOS 7.4 设置系统字符编码

1.语言变量LANG在 /etc/locale 文件中。 2.可以通过/ect/profile 来修改LC_TYPE 变量的值 添加如下代码 export LC_ALL="zh_CN.GBK" export LANG="zh_CN.GBK" 到profile文件中,变量的可以修改...

qimh
今天
1
0
Kafka相关使用

安装前提,需要有jdk环境,还有zookeeper环境 zookeeper下载地址:https://www.apache.org/dyn/closer.cgi/zookeeper/ zookeeper安装参考:https://www.jianshu.com/p/f7037105db46 kafka的下......

朝如青丝暮成雪
今天
1
0
CentOS7 解决无法使用tab自动补全 tab代码提示

一、前言 对于刚刚开始学习linux的新人来说,linux的一切都显着神秘,只能惊叹于大牛在Linux上行云流水的操作。今天介绍一下在linux中自动补全的功能。 对于新人来说,在不懂得技巧的情况下,...

ziluopao
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部