少年阿賓

          那些青春的歲月

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
              這幾天做項(xiàng)目,需要一個(gè)消息提醒功能,決定用dwr實(shí)現(xiàn),在dwr官網(wǎng)和網(wǎng)上找了很多資料,也沒(méi)實(shí)現(xiàn)精準(zhǔn)推送,大多數(shù)的例子具體步驟寫的不清楚,不怎么了解dwr的人看了也未必能看懂,反正我是沒(méi)看懂,那時(shí)就決定,若自己實(shí)現(xiàn)了,一定將具體步驟寫下來(lái),希望能給那些和我一樣的人一些幫助,若有不明白的,可以給小弟留言。我只寫步驟,不寫原理,下面開始。

               第一、在項(xiàng)目中引入dwr.jar,然后在web.xml中進(jìn)行配置,配置如下:

               <servlet>

                  <servlet-name>dwr-invoker</servlet-name>

                  <servlet-class>

                      org.directwebremoting.servlet.DwrServlet

                  </servlet-class>

                  <init-param>

                      <param-name>crossDomainSessionSecurity</param-name>

                         <param-value>false</param-value>

                      </init-param>

                  <init-param>

                    <param-name>allowScriptTagRemoting</param-name>

                    <param-value>true</param-value>

                  </init-param>

                  <init-param>

                    <param-name>classes</param-name>

                    <param-value>java.lang.Object</param-value>

                  </init-param>

                  <init-param>

                      <param-name>activeReverseAjaxEnabled</param-name>

                      <param-value>true</param-value>

                  </init-param>

                  <init-param>

                     <param-name>initApplicationScopeCreatorsAtStartup</param-name>

                     <param-value>true</param-value>

                  </init-param>

                  <init-param>

                      <param-name>maxWaitAfterWrite</param-name>

                      <param-value>3000</param-value>

                  </init-param>

                  <init-param>

                      <param-name>debug</param-name>

                      <param-value>true</param-value>

                  </init-param>

                  <init-param>

                      <param-name>logLevel</param-name>

                      <param-value>WARN</param-value>

                  </init-param>

              </servlet>

              第二:在web.xml的同級(jí)目錄下新建dwr.xml文件,內(nèi)容如下

               <!DOCTYPE dwr PUBLIC

                    "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"

                    "http://getahead.org/dwr/dwr30.dtd">

               <dwr>

                    <alow>

                         <create creator="new" javascript="MessagePush">

                           <param name="class" value="com.huatech.messageremind.service.MessagePush"/>

                        </create>

                    </alow>

               </dwr>

              這個(gè)是dwr的基本配置,MessagePush在頁(yè)面的javascript中使用,com.huatech.messageremind.service.MessagePush實(shí)現(xiàn)了想要調(diào)用的方法,MessagePush我覺(jué)得就相當(dāng)于java類中的一個(gè)映射,在javascript中使用MessagePush.java類中實(shí)現(xiàn)的方法,即可在dwr中調(diào)用。

              第三,要想使用dwr,還要在你想要推送的頁(yè)面中引入script

                    <script type="text/javascript" src="<%=basepath%>dwr/engine.js"></script>

                  <script type="text/javascript" src="<%=basepath%>dwr/util.js"></script>

                  <script type="text/javascript" src="<%=basepath%>dwr/interface/MessagePush.js"></script>

                    可以看見,也引入了dwr.xml中配置的javascriptengine.jsutil.js是必須引入的。

           以上三點(diǎn)都是基本配置,沒(méi)什么好說(shuō)的,想使用dwr,就得這么做。

             第四,實(shí)現(xiàn)消息的精準(zhǔn)推送

                  消息推送簡(jiǎn)單,但是想實(shí)現(xiàn)精準(zhǔn)推送就需要做一些別的操作了

                  1 在任何一個(gè)用戶登錄的時(shí)候,都需要將其userId或者其他唯一性標(biāo)識(shí)放入session中,我放的是userId

                    這里就以 userId為唯一性標(biāo)識(shí)。

                  2 在載入想推送的頁(yè)面時(shí),需要onload一個(gè)我在MessagePush類中實(shí)現(xiàn)的方法,當(dāng)然了,需要使用dwr調(diào)用

                    js的調(diào)用方法如下:

                     function onPageLoad(){

                       var userId = '${userinfo.humanid}';

                       MessagePush.onPageLoad(userId);

                    }

                      <body onload="dwr.engine.setActiveReverseAjax(true);dwr.engine.setNotifyServerOnPageUnload(true);onPageLoad();> onload中的三個(gè)函數(shù)都是必須的,其中dwr.engine.setActiveReverseAjax(true);dwr.engine.setNotifyServerOnPageUnload(true);dwr中的函數(shù)。

                     MessagePush類中實(shí)現(xiàn)的方法如下:

                     public void onPageLoad(String userId) {

                        ScriptSession scriptSession = WebContextFactory.get().getScriptSession();

                        scriptSession.setAttribute(userId, userId);

                        DwrScriptSessionManagerUtil dwrScriptSessionManagerUtil = new DwrScriptSessionManagerUtil();

                        try {

                               dwrScriptSessionManagerUtil.init();

                        } catch (ServletException e) {

                               e.printStackTrace();

                        }

                 }

                   大家注意到,onPageLoad方法中還有一個(gè)名為DwrScriptSessionManagerUtil的類,該類如下實(shí)現(xiàn):

                   public class DwrScriptSessionManagerUtil extends DwrServlet{

                 private static final long serialVersionUID = -7504612622407420071L;

           

                 public void init()

                 throws ServletException {

           

           

                        Container container = ServerContextFactory.get().getContainer();

           

                        ScriptSessionManager manager = container

                                      .getBean(ScriptSessionManager.class);

           

                        ScriptSessionListener listener = new ScriptSessionListener() {

           

                               public void sessionCreated(ScriptSessionEvent ev) {

           

                                      HttpSession session = WebContextFactory.get().getSession();

           

                                      String userId =((User) session.getAttribute("userinfo")).getHumanid()+"";

                                      System.out.println("a ScriptSession is created!");

                                      ev.getSession().setAttribute("userId", userId);

           

                               }

           

                               public void sessionDestroyed(ScriptSessionEvent ev) {

                                      System.out.println("a ScriptSession is distroyed");

                               }

           

                        };

           

                        manager.addScriptSessionListener(listener);

           

                 }

           

          }

          第四步是最最重要的,為了第四步我研究了兩天多,下面開始消息推送。

                第五、消息推送

                      在你想要推送消息的時(shí)候,調(diào)用如下方法:

                       public void sendMessageAuto(String userid,String message) {

                        final String userId = userid ;

                        final String autoMessage = message;

                        Browser.withAllSessionsFiltered(new ScriptSessionFilter() {

                               public boolean match(ScriptSession session) {

                                      if (session.getAttribute("userId") == null)

                                             return false;

                                      else

                                             return (session.getAttribute("userId")).equals(userId);

                               }

                        }, new Runnable(){

                               private ScriptBuffer script = new ScriptBuffer();

                               public void run() {

                                      script.appendCall("showMessage", autoMessage);

                                      Collection<ScriptSession> sessions = Browser

                                      .getTargetSessions();

                                      for (ScriptSession scriptSession : sessions) {

                                             scriptSession.addScript(script);

                                      }

                               }

                              

                        });

                 }

                   userid即為你想推給消息的人,message為你想推送的消息,大家注意到這里script.appendCall("showMessage", autoMessage);

                   其中showMessage為在想推送的頁(yè)面中的javascript方法,autoMessage是這個(gè)方法的參數(shù),這樣那個(gè)頁(yè)面就能得到推送的內(nèi)容了,至于如何展現(xiàn),就看你的需要了。

           

                  至此,一個(gè)dwr消息精準(zhǔn)推送的步驟就寫完了,其實(shí)很多東西都不難,只是我們不知道該怎么用而已。

          posted on 2012-07-07 15:10 abin 閱讀(33455) 評(píng)論(48)  編輯  收藏 所屬分類: Javascript

          Feedback

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2012-12-22 22:56 飛龍劍
          謝謝你的教程,這個(gè)東西網(wǎng)上說(shuō)得都不完全,找了好久終于找到一篇高質(zhì)量的教程。通過(guò)你的教程我終于把消息推送提醒搞定了。  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2013-04-18 17:15 luojia_wang
          我按照你的方法實(shí)現(xiàn)的例子 為什么說(shuō)找不到showMessage 這個(gè)方法我是定義了的啊  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2013-04-18 17:27 luojia_wang
          出來(lái)了,剛才是不曉得為什么不成功,現(xiàn)在沒(méi)有改什么居然成功了,對(duì)你表示萬(wàn)分感謝!  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2013-04-25 15:19 wangg
          好像sessionDestroyed方法上面都沒(méi)有做吧 那么scriptsession會(huì)越來(lái)越多 最好導(dǎo)致內(nèi)存溢出。請(qǐng)問(wèn)怎么銷毀scriptsession  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2013-05-16 14:22 11111
          @wangg
          這篇文章的監(jiān)聽器處理是有問(wèn)題的 監(jiān)聽?wèi)?yīng)該永遠(yuǎn)只有一個(gè) 最好把監(jiān)聽寫在系統(tǒng)啟動(dòng)的時(shí)候執(zhí)行  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2013-05-24 18:55 lyndon
          可以推送,但是頁(yè)面總是彈出 No data receiver from server  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 [未登錄](méi) 2013-07-11 16:20 s
          你好,方便的話請(qǐng)幫忙回答下,sendMessageAuto 這個(gè)方法放到那個(gè)類里,并且我總是在引入js 時(shí),不能找到dwr對(duì)象呢?  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2013-08-05 12:35 hww
          你把消息推送搞定了?能討論一下么~@飛龍劍
            回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2013-08-08 09:16 劉磊
          MessagePush.js里面有些啥哦  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 [未登錄](méi) 2013-08-12 17:50 瘋子
          這個(gè)只需要導(dǎo)入dwr的包就好了嗎?第五步的時(shí)候我怎么老是找不到類呢?  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 [未登錄](méi) 2013-08-12 17:51 瘋子
          @劉磊
          你的能出效果嗎?可以給我個(gè)你測(cè)試的代碼不?  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 [未登錄](méi) 2013-09-03 14:49 111
          111  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 [未登錄](méi) 2013-10-26 21:42 TY
          @luojia_wang
          XXXXXXX  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-01-16 10:17 wen
          @s 放在DwrScriptSessionManagerUtil 里  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-01-16 10:18 wen
          這個(gè)文件引入就行不用寫 @劉磊
            回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-01-21 14:22 王威
          你好,我在按照你的方法使用時(shí),Browser.withAllSessionsFiltered(new ScriptSessionFilter() Browser 類的88 行,包空指針異常,不知道是為什么?請(qǐng)高手指點(diǎn)  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-04-03 09:30 灰灰
          @王威
          我與你遇到的情況一樣,88 行,報(bào)空指針異常,你解決了么  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-04-11 11:33 王林
          樓主,厲害!
          灰灰 在登陸時(shí) 調(diào)用DwrScriptSessionManagerUtil 的.init()方法即可  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-04-11 15:06 王林
          樓主,厲害!
          灰灰 在登陸時(shí) 調(diào)用DwrScriptSessionManagerUtil 的.init()方法即可
          @王林 我看錯(cuò)了 樓主的方法直接用就很好

            回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-05-02 14:58 kingsea
          謝謝  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 [未登錄](méi) 2014-07-09 11:32 超人
          你這個(gè)工程還有源碼嗎,給我一份唄,郵箱1906673110@qq.com  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 [未登錄](méi) 2014-07-09 11:34 超人
          你這個(gè)工程還有源碼嗎,給我一分唄,郵箱1906673110@qq.com 謝謝了。  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-07-12 16:01 游客
          為什么我的Browser和ScriptSessionFilter這兩個(gè)類找不到呢,是還缺少別的包嗎?求解答謝謝  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-07-25 17:22 xiei
          是dwr3不是dwr2
          @游客
            回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-07-25 17:23 謝謝樓主
          太感謝了。寫的好。但是DwrScriptSessionManagerUtil extends DwrServlet這個(gè)沒(méi)必要繼承吧?沒(méi)看懂為什么需要繼承  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-08-27 12:23 路過(guò)
          @游客
          朋友你好,我也沒(méi)有找到,請(qǐng)問(wèn)你解決了嗎?我建的是maven工程。  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-09-04 11:38 darren
          請(qǐng)問(wèn)這個(gè)dwr是瀏覽器主動(dòng)請(qǐng)求服務(wù)端還是服務(wù)端主動(dòng)推送到瀏覽器?  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-09-10 16:30 亮亮
          真的很厲害呢,都說(shuō)樓主的很好  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-09-10 16:32 亮亮
          剛看到一個(gè)博客,專門附了樓主的鏈接呢,表示感謝呢,看來(lái)對(duì)我這個(gè)菜鳥有很大幫助  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-10-28 11:03 yys
          MessagePush.js里面都有什么  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-10-28 11:53 yys
          Container類需要自己建嗎  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-11-17 16:32 天道獨(dú)行
          為什么我這sripterBuffer沒(méi)有appendCall(a,b)方法  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-11-23 20:20 xuxiuyuan
          你好,你還有整個(gè)工程的源碼,我可以看下嗎?感激不盡,郵箱1940471492@qq.com  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-11-25 21:13 發(fā)
          <script type="text/javascript" src="<%=basepath%>dwr/interface/MessagePush.js"></script> 這個(gè)是什么的js  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 [未登錄](méi) 2014-12-01 16:31 Change
          正好在學(xué)習(xí)這部分內(nèi)容,謝謝!  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 [未登錄](méi) 2014-12-01 16:32 Change

          能否提供源碼,非常感謝!223130021@qq.com  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-12-08 15:29 asd
          @王威
          你好請(qǐng)問(wèn)你解決了么 是什么問(wèn)題  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2015-02-04 11:45 貓貍粽子
          你好,a ScriptSession is created 沒(méi)有你說(shuō)的那么復(fù)雜 ScriptSession scriptSession = WebContextFactory.get()
          .getScriptSession(); 這樣就能獲取到scriptSession  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 [未登錄](méi) 2015-06-16 11:47 111
          good  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2015-08-17 16:19 orican
          為什么我的過(guò)濾工具類沒(méi)有執(zhí)行啊?  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2015-09-05 23:13 test_yf
          dwr.xml alow 改為 allow  回復(fù)  更多評(píng)論
            

          # MessagePush.js不知如何寫 2015-09-09 16:24 陳四超
          MessagePush.js不知道怎么寫?還報(bào)dwr未定義  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2015-10-21 12:28 klp
          多謝大神,簡(jiǎn)潔明了,比其他的更勝一籌。  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2016-05-09 09:28 小澤瑪莉亞
          只需要dwr.jar?  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 [未登錄](méi) 2016-05-25 10:18 aa
          wrer  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 [未登錄](méi) 2016-05-26 11:56 Emma
          GoEasy,專業(yè)做web消息推送的工具,服務(wù)器穩(wěn)定,中英文都齊全,代碼簡(jiǎn)潔易懂;官網(wǎng):https://goeasy.io/  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 [未登錄](méi) 2016-06-28 16:52 winter
          您好問(wèn)下,maven工程pom.xml中配置的dwr是啥版本,現(xiàn)在報(bào)MessagePush.js找不到  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2016-08-22 13:48 z_東九
          源碼誰(shuí)有啊,求發(fā)給我,QQ798923617  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 呼图壁县| 白沙| 沐川县| 三明市| 县级市| 卓资县| 宁蒗| 惠州市| 桂东县| 多伦县| 晴隆县| 奉化市| 东平县| 阿拉尔市| 龙州县| 融水| 高尔夫| 灵璧县| 随州市| 天全县| 龙州县| 岗巴县| 清镇市| 资兴市| 博罗县| 新乡市| 土默特右旗| 岗巴县| 台前县| 牡丹江市| 乌拉特中旗| 海兴县| 陈巴尔虎旗| 内黄县| 阿瓦提县| 隆昌县| 北京市| 蒙自县| 白城市| 吉首市| 东丰县|