以前曾经在做一个项目的时候用过dwr,最近有点时间想总结一下,就写出来吧。省却需要的朋友不少自己琢磨的时间。
客户端的发送信息过程:
透过engine.js可以看到客户端发送信息的过程。
调 用服务器端远程方法的时候,为了减少多次和服务器端的通信,dwr允许将几个调用组成一个batch。在dwr.engine._sendData()方 法中,我们可以得知dwr将类似下面的数据封装成在request.body中。然后通过batch.req.send(request.body);发 送到服务器端。batch.req就是一个xmlHttpRequest对象或者ActiveXObject对象【根据不同的浏览器会有不同】
在batch里面只有一个调用的时候,发送的数据形式如下:
- callCount=1
- page=/hsell/saleroom.do
- httpSessionId=9002B6DEF1F3107925212B0F1A0E46DB
- scriptSessionId=5C5BECA8B721ACA5A23DFE9965EE15F5417
- c0-scriptName=SystemFaced //配置的spring bean 的id或者类名
- c0-methodName=getCustomByCardId //远程方法名
- c0-id=0
- c0-e1=string:342201198106244710 //向远程方法传递的数据
- c0-e2=string:342201198106244710
- c0-param0=Object_Object:{cardid1:reference:c0-e1, cardid2:reference:c0-e2}
- batchId=0
那么将这些信息发送到哪个地址呢?
远程目的地址request.url中。url是类似于下面的这种格式。
http://localhost:8080/hsell/dwr/call/plaincall/SystemFaced.getCustomByCardId.dwr
SystemFaced.getCustomByCardId.dwr 中SystemFaced是我配置的spring bean的id或者是你自己的类名。
getCustomByCardId就是调用的远程方法名。
批量时候的情况
发送的数据类似下面的格式
- callCount=2 //内有两个远程调用
- page=/DWRTest/test.html
- httpSessionId=0B25A58FE06A0DF746B782F61A7F01B7
- scriptSessionId=8AE5628F0BBB54D89DE18B0F09A44785296
- c0-scriptName=Demo
- c0-methodName=getWords
- c0-id=0
- c1-scriptName=Demo
- c1-methodName=sayWords
- c1-id=1
- batchId=0
目标url就是下面这种情况
http://localhost:8080/DWRTest/dwr/call/plaincall/Multiple.2.dwr
服务器端从客户端把调用的方法名和类名或者spring的bean id提取出来,根据配置文件找到对应的类和方法。然后执行之,将结果返回。