隨筆-55  評(píng)論-208  文章-0  trackbacks-0
          在網(wǎng)上找了一個(gè)老外寫的dwr  reverse-ajax的例子,自己把coding順序調(diào)整了一下希望可以對(duì)學(xué)習(xí)dwr reverse-ajax的朋友有所幫助
          1、首先要下載dwr 2.0 地址 http://getahead.org/dwr/download
          2、在web.xml中加入dwr的servlet和相關(guān)配置
           <!--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的方式,在這個(gè)例子中可以明顯地從頁面上看出來是用的polling+comet
          附:關(guān)于reverse-ajax的實(shí)現(xiàn)有3種方式
          polling   就是隔一段時(shí)間向服務(wù)器發(fā)送一request來檢查服務(wù)端是否有數(shù)據(jù)更新
          comet   就是一個(gè)長(zhǎng)http請(qǐng)求,在請(qǐng)求期間服務(wù)端可以向客戶端push數(shù)據(jù),但是這種做法要求server和brower長(zhǎng)期建立一個(gè)通信通道,而且效率很低
          piggyback 就是服務(wù)端的更新數(shù)據(jù)都在排隊(duì)等待,等到下一次有請(qǐng)求過來,那么這些等待更新數(shù)據(jù)就伴隨這次請(qǐng)求一起發(fā)送到brower
          有關(guān)更詳細(xì)的reverse-ajax技術(shù)介紹可以參考http://getahead.org/dwr/reverse-ajax
          3、創(chuàng)建一個(gè)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是只一個(gè)java的js映射,其中include是可以在js使用的方法
          convert 是指對(duì)應(yīng)js到j(luò)ava,或者java到j(luò)s的對(duì)象轉(zhuǎn)換,其中include是可以轉(zhuǎn)換的屬性
          4、寫服務(wù)段的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>
          頁面代碼簡(jiǎn)單吧,只有方法調(diào)用,沒有任何獲得返回?cái)?shù)據(jù),和對(duì)回傳數(shù)據(jù)處理的代碼
          注意:<body onload="dwr.engine.setActiveReverseAjax(true);">
          這個(gè)是要在使用reverse-ajax的頁面必須的!
          現(xiàn)在可以啟動(dòng)應(yīng)用體檢一把reverse-ajax,希望你能和我有一樣的驚奇感覺
          當(dāng)然,肯定有人會(huì)說這種功能用普通的ajax也可以實(shí)現(xiàn)啊,為什么要用reverse-ajax
          這時(shí)候你就要考慮這種情況了,有用戶A和用戶B同時(shí)在發(fā)Message,A正在看message沒有任何request動(dòng)作,而B發(fā)了一條新message,這時(shí)要求這個(gè)信息要展現(xiàn)給A看,那么普通的ajax可以處理這種功能嗎?這就是reverse-ajax的用途,可以從服務(wù)段向brower下推信息
          posted on 2007-05-19 14:48 rocket 閱讀(6611) 評(píng)論(11)  編輯  收藏

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

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 永济市| 汉源县| 光山县| 虎林市| 深泽县| 花莲市| 柏乡县| 营山县| 同仁县| 虎林市| 邵阳市| 富源县| 贵定县| 临沧市| 兴义市| 青铜峡市| 常山县| 泰兴市| 武夷山市| 锡林郭勒盟| 酒泉市| 班戈县| 上犹县| 定州市| 韶关市| 肇源县| 泽库县| 宝山区| 手机| 罗平县| 买车| 黑龙江省| 安塞县| 宣城市| 新竹市| 定南县| 高密市| 安陆市| 江口县| 堆龙德庆县| 阳江市|