由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)部署阶段:
(2)运行阶段:
每触发一下事件,最后都会反射一个新的实例,这个可以在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,callback); } 可以看到T1.hello有2条赋值语句,这就是关键所在了。dwr是按照java类方法的定义顺序依次绑定方法的,所以调用T1.hello,只能执行最后绑定的方法。
dwr虽然很方便,但是由于使用了js,那么js可能出现的问题,都是它可能出现的问题。dwr还需要继续努力,而我们也要在遇到问题时,适当的刨刨根,问问底,才能真正的了解它,使用它。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |