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

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

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


目录
相关文章
|
开发工具 C语言 git
Vcpkg 的安装与使用
Windows 下 Vcpkg 的安装与使用
2170 0
Vcpkg 的安装与使用
|
4月前
|
人工智能 搜索推荐 定位技术
外贸B2B的降维打击:我用“WhatsApp+AI”重构客户开发全流程(附7层漏斗拆解)
传统外贸获客成本高、效率低?本文拆解一套“WhatsApp+AI自动获客”7层漏斗打法:获客→筛选→触达→跟进→转化→管理→成本。
|
5月前
|
人工智能 JSON 前端开发
手撸AI对话助手带上思考过程
本文介绍如何通过LangChain + Ollama实现大模型流式响应(类打字机效果),提升用户体验。包含FastAPI后端流式接口(`astream`)、带`&lt;THINK&gt;`/`&lt;FINAL&gt;`标签的思考过程解析,以及前端HTML实时渲染示例,支持思考折叠、光标动画与错误处理。(239字)
444 1
|
SQL 数据挖掘 数据库
数据库join类型有哪些?
【8月更文挑战第2天】
1596 17
数据库join类型有哪些?
|
测试技术
po+selenium+unittest自动化测试项目实战
po+selenium+unittest自动化测试项目实战
4062 0
 po+selenium+unittest自动化测试项目实战
STM32CubeMX EC11旋转编码器驱动
STM32CubeMX EC11旋转编码器驱动
2489 10
|
缓存 负载均衡 监控
Nginx性能调优5招35式不可不知的策略实战
以上 V 哥总结的5个方面关于 Nginx性能调优的策略,实际应用中需要结合实际项目的情况来测试,希望对你有帮助,欢迎关注威哥爱编程,技术路上我们一起成长。
661 0
|
传感器 数据采集 物联网
技术经验解读:【物联网】I2C(IIC)通信协议详解与应用
技术经验解读:【物联网】I2C(IIC)通信协议详解与应用
1298 0
|
消息中间件
RabbitMQ
阿里云RabbitMQ的消息大小可以定制化。在版本3.7中,最大消息大小为2GiB,而在版本3.8开始,最大消息大小被限制为512MiB。如果用户配置一个更大的rabbit.max_message_size,那么这个值会被使用。 以上信息仅供参考,建议咨询阿里云官方工作人员获取更准确的信息。
438 3
|
机器学习/深度学习 数据可视化 数据挖掘
8种交叉验证类型的深入解释和可视化介绍
8种交叉验证类型的深入解释和可视化介绍
1334 3
8种交叉验证类型的深入解释和可视化介绍

热门文章

最新文章