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

       上篇博文中简单分享了一个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还需要继续努力,而我们也要在遇到问题时,适当的刨刨根,问问底,才能真正的了解它,使用它。

时间: 2024-11-08 22:03:10

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

Socket类中提供的支持异步操作的方法

在网络编程中运用Socket,常常需要长期监听某个端口,以获得Socket连接,进而执行相关操作. 但此时,主线程就会被阻塞,无法做其他事情.为了解决这类问题,Socket类中提供了一些支持异步操作的方法,如表17-10所示. 表17-10 Socket类中支持异步操作的方法 方法 说明 BeginAccept() 开始一个异步请求,以创建一个新的Socket对象来接受传入的连接请求 EndAccept() 结束一个异步请求,以创建一个新的Socket对象来接受传入的连接请求 BeginConn

JAVA学习(七):方法重载与方法重写、this关键字和super关键字

方法重载与方法重写.this关键字和super关键字 1.方法重载 重载能够使具有相同名称但不同数目和类型参数的类传递给方法. 注: 一是重载方法的参数列表必须与被重载的方法不同,并且这种不同必须足以清楚地确定要调用哪一个方法: 二是重载方法的返回值类型可以与被重载的方法相同,也可以不同,但是只有返回值类型不同不能表示为重载. 例如,最常用的println()方法在JDK的java.io.PrintStream中定义了十几种形式的重载,常用格式如下: public void println(in

CSS实例教程:完美解决IE6不支持hover的方法

文章简介:完美解决IE6不支持hover的方法. <style type="text/css">         p:hover,p.hover { background:#eee; }   /* 就是要多写一个.hover而已 */ </style> 下面这段代码要放到页面的底部在</body> 前: <script type="text/javascript">    //<!–  让所有标记支持hover 

PL/SQL小技巧一个:在子类中怎么调用父类被重载的方法

技巧 在C++和Java中,这是非常容易实现的C++是:父类名::被重载的方法(参数表), 比如:      ancestorclass::name({arguments});而在Java中,可以用super代替父类,如这样实现      Super.name({arguments}); 而在Oracle 9i Release2中都没实现这样的功能,当然我们可以用其它办法来实现这样的功能. 父类对象类型Create or Replace Type parent as object (      

iOS 6中控制屏幕旋转支持方向的方法

在iOS5.1 和 之前的版本中, 我们通常利用 shouldAutorotateToInterfaceOrientation: 来单独控制某个UIViewController的旋屏方向支持,比如: - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPo

Java语言入门教程(十四):Java语言中方法重载与方法覆盖

很多时候,某个Java类中有多个类似的方法.如Math类中,计算绝对值的方 法就会有多个,因为对不同数据类型的数计算方式不同.比如对float,int, long,double各类型的计算方式各不相同,那么Math类中就应该设计4个求绝对 值的方法,分别对每种类型进行计算.在这种情况下,最好的方式就是设计4个 同名,但是不同参的方法,如下所示(请参见API帮助文档): abs(double a) Returns the absolute value of a double value. abs(

php检测iis环境是否支持htaccess的方法

 这篇文章主要介绍了php检测iis环境是否支持htaccess的方法,需要的朋友可以参考下 modrewrite.php    代码如下: <?php echo "mod_rewrite works"; ?>     open_me.php    代码如下: <?php echo "mod_rewrite does not work"; ?>    代码如下: RewriteEngine on RewriteRule ^open_me.ph

对象不支持属性或方法

问题描述 对象不支持属性或方法 对象不支持"ok ToLaunchComposition"属性或方法,怎么解决 解决方案 如果代码以前正常过,检查下是不是有组件没有注册,或者浏览器的设定.如果你的代码根本没工作过,首先检查有没有创建这样的对象,有没有这个属性或者方法.

求助,asp.net中,js调com组件出现不支持属性或方法

问题描述 现在需要在js中调用C#的dll,查询网上的资料后说需要编写com组件,于是先写了个简单的com组件做测试,但是asp.net中的js调用时一直报错"对象不支持属性或方法"代码是这样的接口:[ComVisible(true)][Guid("2CBD3D76-35F1-4f9d-9C1B-9DBFEE412F76")]publicinterfaceIHello{stringShowHello();}接口的实现[ComVisible(true)][Guid(&