隨筆-55  評論-208  文章-0  trackbacks-0
          在網上找了一個老外寫的dwr  reverse-ajax的例子,自己把coding順序調整了一下希望可以對學習dwr reverse-ajax的朋友有所幫助
          1、首先要下載dwr 2.0 地址 http://getahead.org/dwr/download
          2、在web.xml中加入dwr的servlet和相關配置
           <!--dwr servlet-->
            
          <servlet>
              
          <servlet-name>dwr-invoker</servlet-name>
              
          <display-name>DWR Servlet</display-name>
              
          <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
              
          <init-param>
                  
          <param-name>debug</param-name>
                  
          <param-value>true</param-value>
              
          </init-param>
             
            <init-param>
                
          <param-name>pollAndCometEnabled</param-name>
                
          <param-value>true</param-value>
              
          </init-param>
              
          <load-on-startup>1</load-on-startup>      
            
          </servlet>
            
          <servlet-mapping>
                
          <servlet-name>dwr-invoker</servlet-name>
                
          <url-pattern>/dwr/*</url-pattern>
            
          </servlet-mapping>
          pollAndCometEnabled是指dwr 的reverse ajax是使用polling 和comet的方式,在這個例子中可以明顯地從頁面上看出來是用的polling+comet
          附:關于reverse-ajax的實現有3種方式
          polling   就是隔一段時間向服務器發送一request來檢查服務端是否有數據更新
          comet   就是一個長http請求,在請求期間服務端可以向客戶端push數據,但是這種做法要求server和brower長期建立一個通信通道,而且效率很低
          piggyback 就是服務端的更新數據都在排隊等待,等到下一次有請求過來,那么這些等待更新數據就伴隨這次請求一起發送到brower
          有關更詳細的reverse-ajax技術介紹可以參考http://getahead.org/dwr/reverse-ajax
          3、創建一個dwr.xml,用于配置你要制定的java代碼映射類,以及允許使用的方法和converter
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE dwr PUBLIC
              "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
              "http://www.getahead.ltd.uk/dwr/dwr10.dtd"
          >
          <dwr>
            
          <allow>
              
          <create creator="new" javascript="DWRHelper">
                
          <param name="class" value="com.cloverworxs.uma.helper.DWRHelper" />
                
          <include method="addMessage" />
              
          </create>
                  
          <convert converter="bean" match="com.cloverworxs.uma.helper.Message">
                
          <param name="include" value="id,text" />
              
          </convert>
            
          </allow>
          </dwr>
          create是只一個java的js映射,其中include是可以在js使用的方法
          convert 是指對應js到java,或者java到js的對象轉換,其中include是可以轉換的屬性
          4、寫服務段的java代碼
          DWRHelper
          package com.cloverworxs.uma.helper;

          import java.util.ArrayList;
          import java.util.Collection;
          import java.util.Iterator;
          import java.util.LinkedHashMap;
          import java.util.LinkedList;
          import java.util.List;
          import java.util.Map;

          import org.directwebremoting.ScriptBuffer;
          import org.directwebremoting.WebContext;
          import org.directwebremoting.WebContextFactory;
          import org.directwebremoting.proxy.dwr.Util;

          public class DWRHelper {
               
              
          public void addMessage(String text) {
                  LinkedList messages 
          = new LinkedList();

                  
          if (text != null && text.trim().length() > 0{
                      messages.addFirst(
          new Message(text));
                      
          while (messages.size() > 10{
                          messages.removeLast();
                      }

                  }

                  
          // Reverse Ajax code to be added here shortly
                  WebContext wctx = WebContextFactory.get();
                  String currentPage 
          = wctx.getCurrentPage();

                  
          // Clear the input box in the browser that kicked off this page only
                  Util utilThis = new Util(wctx.getScriptSession());
                  utilThis.setValue(
          "text""");

                  
          // For all the browsers on the current page:
                  Collection sessions = wctx.getScriptSessionsByPage(currentPage);
                  Util utilAll 
          = new Util(sessions);
                 
           // Clear the list and add in the new set of messages
                  utilAll.removeAllOptions("chatlog");
                  utilAll.addOptions(
          "chatlog", messages, "text");

              }

             
          }

          Message
          package com.cloverworxs.uma.helper;

          import org.directwebremoting.Security;

          public class Message {
              
          public Message(String newtext) {
                  text 
          = newtext;
                  
          if (text.length() > 256{
                      text 
          = text.substring(0256);
                  }

                  text 
          = Security.replaceXmlCharacters(text);
              }


              
          public long getId() {
                  
          return id;
              }


              
          public String getText() {
                  
          return text;
              }


              
          private long id = System.currentTimeMillis();

              
          private String text;
          }

          5、到此為止可以寫頁面代碼了,下面的代碼html或者jsp都可以
          <h1>Java Chat</h1>
          <body onload="dwr.engine.setActiveReverseAjax(true);">
          <script type='text/javascript' src='/sperc/dwr/interface/DWRHelper.js'></script>
          <script type='text/javascript' src='/sperc/dwr/engine.js'></script>
          <script type='text/javascript' src='/sperc/dwr/util.js'></script>
          <p>This is a very simple chat demo that uses reverse ajax to collect messages and server-side browser manipulation to update the pages with the results.</p>
          <p>Your Message: <input id="text" onkeypress="dwr.util.onReturn(event, sendMessage)" /> <input type="button" value="Send" onclick="sendMessage()" /></p>
          <script type="text/javascript">
              
          function sendMessage() {
                alert(dwr.util.getValue(
          "text"));
                DWRHelper.addMessage(dwr.util.getValue(
          "text"));
              }

          </script>
          <hr />
          <ul id="chatlog" style="list-style-type:none;">
          </ul>
          </body>
          頁面代碼簡單吧,只有方法調用,沒有任何獲得返回數據,和對回傳數據處理的代碼
          注意:<body onload="dwr.engine.setActiveReverseAjax(true);">
          這個是要在使用reverse-ajax的頁面必須的!
          現在可以啟動應用體檢一把reverse-ajax,希望你能和我有一樣的驚奇感覺
          當然,肯定有人會說這種功能用普通的ajax也可以實現啊,為什么要用reverse-ajax
          這時候你就要考慮這種情況了,有用戶A和用戶B同時在發Message,A正在看message沒有任何request動作,而B發了一條新message,這時要求這個信息要展現給A看,那么普通的ajax可以處理這種功能嗎?這就是reverse-ajax的用途,可以從服務段向brower下推信息
          posted on 2007-05-19 14:48 rocket 閱讀(6608) 評論(11)  編輯  收藏

          評論:
          # re: dwr reverse-ajax 實例解析 2007-06-02 17:24 | sunflower
          公司里有些領導一味追求速度,不讓搞設計.
          不肯接受新東西,也不讓我們年輕人使用新東西.
          獨斷專行.
          呵呵,rocket當初走的時候不會因為這個吧.^-^  回復  更多評論
            
          # re: dwr reverse-ajax 實例解析 2007-06-02 17:26 | sunflower
          還是喜歡fred和phil那些不擺架子的前輩的.
          ^-^  回復  更多評論
            
          # re: dwr reverse-ajax 實例解析 2007-08-10 15:53 | thlzjfe
          我怎么看著效果不明顯???必須點擊是才能談出個提示框,事件 onkeypress 的作用是什么啊,效果有是如何.請回復,謝謝!  回復  更多評論
            
          # re: dwr reverse-ajax 實例解析 2007-08-11 14:46 | rocket
          你覺得效果不明顯是因為單機操作  可以試想一下這樣一種情況,兩個同時在線的用戶,A用戶有了操作之后,系統判斷會對另外B用戶造成影響,那么就可以使用reverse-ajax的方式在不刷新頁面的情況下把信息推給B用戶  回復  更多評論
            
          # re: dwr reverse-ajax 實例解析 2007-09-19 09:25 | yorry
          關鍵在于DWRHelper把msg推給了所有的客戶端。
          謝謝博主分享。  回復  更多評論
            
          # re: dwr reverse-ajax 實例解析 2008-03-07 09:43 | niejun
          謝謝分享,確實很驚訝  回復  更多評論
            
          # re: dwr reverse-ajax 實例解析[未登錄] 2008-08-27 14:02 | kim
          非常感謝這個教程。試過了,效果不錯。
          在用http://***/ ,在IE,Firefox訪問都沒有問題,
          但是https://***/ , IE就一點反應都沒有了。Firefox沒有問題。
          請問知道什么問題嗎?謝謝啊  回復  更多評論
            
          # re: dwr reverse-ajax 實例解析[未登錄] 2008-12-04 10:05 | cc
          為什么報錯說找不到dwr  回復  更多評論
            
          # re: dwr reverse-ajax 實例解析[未登錄] 2008-12-04 10:24 | cc
          <body onload="dwr.engine.setActiveReverseAjax(true);">可能就是這個dwr找不到  回復  更多評論
            
          # re: dwr reverse-ajax 實例解析 2009-04-26 14:58 | longrui
          您好:
          LinkedList messages = new LinkedList();
          的位置寫錯了,寫在方法里在每次調用方法時都會實例一個新的list,那后面儲存10條的步驟也就變得沒有意義了。  回復  更多評論
            
          # re: dwr reverse-ajax 實例解析 2009-10-29 16:31 | benson
          我的會一直出現
          嚴重的: Error loading WebappClassLoader
          delegate: false
          repositories:
          /WEB-INF/classes/
          ----------> Parent Classloader:
          org.apache.catalina.loader.StandardClassLoader@107ebe1
          uk.ltd.getahead.dwr.DWRServlet
          java.lang.ClassNotFoundException: uk.ltd.getahead.dwr.DWRServlet

          我有看dwr.jar 裡的確實有 uk.ltd.getahead.dwr.DWRServlet   回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 辽中县| 酉阳| 汝城县| 贺州市| 田东县| 石屏县| 临夏市| 大姚县| 云南省| 海丰县| 尉氏县| 灵石县| 崇信县| 亚东县| 洛阳市| 屏东市| 北流市| 香河县| 筠连县| 绥棱县| 清流县| 揭阳市| 久治县| 印江| 盖州市| 平湖市| 揭东县| 江口县| 久治县| 吉木乃县| 深泽县| 江山市| 卓资县| 丹阳市| 林甸县| 二连浩特市| 乐清市| 安新县| 滦平县| 枣阳市| 东宁县|