滿店香的家

          學(xué)習(xí)+實踐=進(jìn)步

          第六部分 DWR原理

             通過前面五章學(xué)習(xí),對DWR整體有所了解,但是我仍然對核心細(xì)節(jié)不是很清楚。我最后的辦法就是單步調(diào)試,調(diào)試之后將所有東西串一串,DWR的原理就清楚了,搞清楚核心生產(chǎn)線,其他全是輔助的,沒必要再分析了。老外聰明啊,服。
             我們以DWR的第一個樣例為例Dynamically Text
             1,在index.html里面我們嵌入
               <script type='text/javascript' src='../dwr/engine.js'> </script>
               <script type='text/javascript' src='../dwr/util.js'> </script>
               <script type='text/javascript' src='../dwr/interface/Demo.js'> </script>
                   前面兩個都是DWR系統(tǒng)默認(rèn)需要加載的,Demo.js是Demo.java所對應(yīng)的。按理論,只要在web.xml和dwr.xml配置好,那么我們就可以在客戶端操作Demo.js,類似于操作服務(wù)器端的Demo.js。
              

          HTML source:

          <p>
          Name:
          <input type="text" id="demoName"/>
          <input value="Send" type="button" onclick="update()"/>
          <br/>
          Reply: <span id="demoReply"></span>
          </p>
          

          Javascript source:

          function update() {
          var name = dwr.util.getValue("demoName");
          Demo.sayHello(name, function(data) {
          dwr.util.setValue("demoReply", data);
          });
          }
          

          Java source:

          package org.getahead.dwrdemo.simpletext;
          public class Demo {
          public String sayHello(String name) {
          return "Hello, " + name;
          }
          }
          

          dwr.xml

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE dwr PUBLIC
          "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
          "http://getahead.org/dwr/dwr20.dtd">
          <dwr>
          <allow>
          <create creator="new" javascript="Demo">
          <param name="class" value="org.getahead.dwrdemo.simpletext.Demo"/>
          </create>
          </allow>
          </dwr>
          
                  

                 在瀏覽器第一次加載本頁面時,瀏覽器第一步發(fā)現(xiàn)<script type='text/javascript' src='../dwr/engine.js'> </script>,根據(jù)web.xml關(guān)于dwr的配置,系統(tǒng)會激發(fā)Servlet的POST方法,向客戶端輸出engine.js文件流,這個文件你可以在IE的緩存里面發(fā)現(xiàn),當(dāng)然,程序會在最后輸出一刻比較客戶端是否已經(jīng)存在該文件,如果要輸出的文件流大小和和該文件大小一致,就不輸出了,同樣util.js、Demo.js也是這么輸出的。那么看看Demo.js文件里面的內(nèi)容如下:
          if (typeof this['Person'] != 'function') {
            
          function Person() {
              
          this.address = null;
              
          this.phoneNumber = null;
              
          this.name = null;
              
          this.id = 0;
              
          this.salary = 0;
            }

          }


          // Provide a default path to dwr.engine
          if (typeof this['dwr'] == 'undefined') this.dwr = {};
          if (typeof dwr['engine'] == 'undefined') dwr.engine = {};

          if (typeof this['Demo'] == 'undefined') this.Demo = {};

          Demo._path 
          = '/dwr/dwr';

          Demo.sayHello 
          = function(p0, callback) {
            
          return dwr.engine._execute(Demo._path, 'Demo', 'sayHello', p0, callback);
          }
          ;

          Demo.getInclude 
          = function(callback) {
            
          return dwr.engine._execute(Demo._path, 'Demo', 'getInclude', callback);
          }
          ;

              這樣我們就知道了,實際上Demo.java類的sayHello方法已經(jīng)被解釋到Demo.js中了,只不過后面的調(diào)用還不是很清楚而已。
          繼續(xù)!
          public String sayHello(String name) {
          return "Hello, " + name;
          }
           翻譯成
                 Demo._path = '/dwr/dwr';
           Demo.sayHello = function(p0, callback) {
            return dwr.engine._execute(Demo._path, 'Demo', 'sayHello', p0, callback);
          };
            在調(diào)用engine.execute()方法時,最終采用無刷新訪問服務(wù)器技術(shù)。
           采用該技術(shù)的關(guān)鍵問題是兩個參數(shù),一個是url,往什么地方發(fā)送;一個是doc,發(fā)送什么內(nèi)容
           通過跟蹤engine.js我們知道
          url=/dwr/dwr/call/plaincall/Demo.sayHello.dwr
          發(fā)送內(nèi)容如下:

          callCount=1
          windowName
          =DWR-442B435899
          c0
          -scriptName=Demo
          c0
          -methodName=sayHello
          c0
          -id=0
          c0
          -param0=string:Joe
          batchId
          =1
          page
          =/dwr/simpletext/index.html
          httpSessionId
          =
          scriptSessionId
          =1CC3A.0A3


          實際上url=/dwr/dwr/call/plaincall/Demo.sayHello.dwr,轉(zhuǎn)向的是DwrServlet,DwrServlet實際上獲取了兩部分信息,一部分是url,根據(jù)這個能夠解析到我們的目標(biāo)java類、方法,另外一部分是發(fā)送信息包,實際上這就是SayHello所需要的參數(shù)輸入信息,最后,返回數(shù)據(jù),這些數(shù)據(jù)格式通過response返回,在engine.js中對應(yīng)于return batch.reply;通過解析返回對象,采用javascirpt將數(shù)據(jù)動態(tài)刷新到頁面。

              至此,dwr的核心原理,基本清晰

          posted on 2008-04-06 12:13 滿店香 閱讀(3462) 評論(4)  編輯  收藏 所屬分類: dwr源碼分析

          Feedback

          # re: 第六部分 DWR原理 2008-04-28 10:49 rgy

          bucuo   回復(fù)  更多評論   

          # re: 第六部分 DWR原理[未登錄] 2008-05-23 10:37 sam

          學(xué)習(xí)了  回復(fù)  更多評論   

          # re: 第六部分 DWR原理[未登錄] 2008-10-27 23:05 jones

          謝謝樓主的文章。請問樓主如何聯(lián)系啊,有qq么?能向你請教么?  回復(fù)  更多評論   

          # Servisy Web 20 2009-05-18 12:24 Servisy Web 20

          Please post your favorite sites.
          I am from Albania and also am speaking English, please tell me right I wrote the following sentence: "Contact seo workers professional search engine optimization marketing consultants to improve your web site performance and search engine rankings.Left, bullet seo optimization, right."

          THX :-), Lisbet.  回復(fù)  更多評論   

          主站蜘蛛池模板: 遵化市| 阳泉市| 建阳市| 共和县| 鄢陵县| 西丰县| 修文县| 博客| 金山区| 甘孜县| 宁夏| 淮滨县| 望都县| 朔州市| 阿克陶县| 兴安盟| 金湖县| 三河市| 美姑县| 扬中市| 巴塘县| 泰和县| 融水| 谷城县| 石泉县| 乌拉特中旗| 阜康市| 禹州市| 香格里拉县| 江西省| 平武县| 渭源县| 霍城县| 吕梁市| 福建省| 南汇区| 邢台县| 家居| 吉木乃县| 麦盖提县| 横山县|