少年阿賓

          那些青春的歲月

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

               第一、在項(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我覺得就相當(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)都是基本配置,沒什么好說的,想使用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 閱讀(33435) 評(píng)論(48)  編輯  收藏 所屬分類: Javascript

          Feedback

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

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

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

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

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2013-05-16 14:22 11111
          @wangg
          這篇文章的監(jiā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ì)步驟 [未登錄] 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ì)步驟 [未登錄] 2013-08-12 17:50 瘋子
          這個(gè)只需要導(dǎo)入dwr的包就好了嗎?第五步的時(shí)候我怎么老是找不到類呢?  回復(fù)  更多評(píng)論
            

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

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

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

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 [未登錄] 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è)沒必要繼承吧?沒看懂為什么需要繼承  回復(fù)  更多評(píng)論
            

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

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

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

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2014-09-10 16:32 亮亮
          剛看到一個(gè)博客,專門附了樓主的鏈接呢,表示感謝呢,看來對(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沒有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ì)步驟 [未登錄] 2014-12-01 16:31 Change
          正好在學(xué)習(xí)這部分內(nèi)容,謝謝!  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 [未登錄] 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)問你解決了么 是什么問題  回復(fù)  更多評(píng)論
            

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

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

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 2015-08-17 16:19 orican
          為什么我的過濾工具類沒有執(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ì)步驟 [未登錄] 2016-05-25 10:18 aa
          wrer  回復(fù)  更多評(píng)論
            

          # re: dwr3實(shí)現(xiàn)消息精確推送詳細(xì)步驟 [未登錄] 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ì)步驟 [未登錄] 2016-06-28 16:52 winter
          您好問下,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)論
            

          主站蜘蛛池模板: 蒲城县| 凉山| 鄯善县| 永新县| 嵊州市| 漠河县| 昌平区| 梁平县| 岐山县| 闸北区| 泉州市| 通辽市| 全南县| 望城县| 墨竹工卡县| 甘洛县| 延川县| 军事| 芮城县| 五大连池市| 宜丰县| 虹口区| 枣强县| 扎兰屯市| 抚州市| 林甸县| 高雄县| 鲁甸县| 湖南省| 上虞市| 类乌齐县| 武陟县| 富川| 石渠县| 武川县| 怀宁县| 江川县| 凤城市| 垦利县| 湘阴县| 荣昌县|