四. DWR处理用户请求流程分析
1. DWR默认的URL处理器介绍
DWR的URL处理器(保存在urlMapping这个Map中),DWR会根据jsp中
<srcipt src="/dwr/engine.js" />的src属性,来判断使用哪个处理器。
{
/webwork/DWRActionUtil.js=org.directwebremoting.servlet.WebworkUtilHandler@1d
/about =org.directwebremoting.servlet.AboutHandler@293354,
/call/plaincall/=org.directwebremoting.servlet.PlainCallHandler@709cb5,
/call/htmlcall/=org.directwebremoting.servlet.HtmlCallHandler@aafcb8,
/test/=org.directwebremoting.servlet.TestHandler@1b5abf7,
/call/htmlpoll/=org.directwebremoting.servlet.HtmlPollHandler@2d
/call/plainpoll/=org.directwebremoting.servlet.PlainPollHandler@190d40e,
/auth.js=org.directwebremoting.servlet.AuthHandler@15206d0
-------------------------------常用处理器---------------------------------
/index.html = org.directwebremoting.servlet.IndexHandler@14045de,
/engine.js = org.directwebremoting.servlet.EngineHandler@16592ec,
/util.js = org.directwebremoting.servlet.UtilHandler@e90d6d,
/interface/ = org.directwebremoting.servlet.InterfaceHandler@1870cfc,
}
|
2. 页面载入时,处理过程发下:
当jsp页面这样来写时:<srcipt src="/dwr/engine.js" />,首先会访问我们的DwrServlet.java的doGet/doPost方法,我们可以来看下它的源码:
doPost(request, response)à
processor.handle(request, response)à
3. 用户触发某个事件时,处理流程如下,
按照上面的方式,在找到url处理器后,就会进入相应的逻辑。
(1) 当访问/dwr/engine.js时,会读取org.directwebremoting.engine.js,并用字符串替换的方式将engine.js中的一些变量(如:${scriptSessionId})赋值,然后输出
(2) 当访问/dwr/interface/HelloWorld.js时,会根据名称为HelloWorld的<create creator=’new’…/>,得到HelloWorld实例,
根据参数转换器,得到一个User类的实例,并利用Java反射,得到提供给客户端访问的方法名,根据方法名生成相应的js处理方法
(3) 用户触发某个事件,然后调用HelloWorld的方法,使用
dwr.engine._execute()方法,
创建HelloWorld实例,并调用它的方法,将结果返回。
1>DWR中处理请求的方法:
dwr.engine._execute()-->
dwr.engine.endBatch()-->
dwr.engine._sendData()(2个作用:)
a> 设置回调函数:
batch.req.onreadystatechange=function(){
dwr.engine._stateChange(batch);
}
b> 请求服务器:batch.req.open(...),batch.req.send(...)
2>DWR中处理回调的方法:dwr.engine._remoteHandleCallback()
dwr.engine._stateChange(batch)-->
dwr.engine._eval(toEval)-->
dwr.engine._remoteHandleCallback(...),
根据函数序号,得到回调函数,将数据传递给回调函数,-->
handlers.callback(数据);
注::(toEval是服务器返回的JS脚本,如:
("dwr.engine._remoteHandleCallback(请求次数,函数序号,数据)"),
需要用eval()执行。)