DWR2学习笔记(三)

四.    DWR处理用户请求流程分析

1.  DWR默认的URL处理器介绍

DWRURL处理器(保存在urlMapping这个Map)DWR会根据jsp

<srcipt src="/dwr/engine.js" />src属性,来判断使用哪个处理器。

{

/webwork/DWRActionUtil.js=org.directwebremoting.servlet.WebworkUtilHandler@1d48c,

/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@2d142a,

/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.javadoGet/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()执行。)

posted on 2009-12-20 22:30  TroyZ  阅读(2074)  评论(0编辑  收藏  举报