少年阿賓

          那些青春的歲月

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

               第一、在項目中引入dwr.jar,然后在web.xml中進行配置,配置如下:

               <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的同級目錄下新建dwr.xml文件,內容如下

               <!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>

              這個是dwr的基本配置,MessagePush在頁面的javascript中使用,com.huatech.messageremind.service.MessagePush實現了想要調用的方法,MessagePush我覺得就相當于java類中的一個映射,在javascript中使用MessagePush.java類中實現的方法,即可在dwr中調用。

              第三,要想使用dwr,還要在你想要推送的頁面中引入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是必須引入的。

           以上三點都是基本配置,沒什么好說的,想使用dwr,就得這么做。

             第四,實現消息的精準推送

                  消息推送簡單,但是想實現精準推送就需要做一些別的操作了

                  1 在任何一個用戶登錄的時候,都需要將其userId或者其他唯一性標識放入session中,我放的是userId,

                    這里就以 userId為唯一性標識。

                  2 在載入想推送的頁面時,需要onload一個我在MessagePush類中實現的方法,當然了,需要使用dwr調用

                    js的調用方法如下:

                     function onPageLoad(){

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

                       MessagePush.onPageLoad(userId);

                    }

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

                     MessagePush類中實現的方法如下:

                     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方法中還有一個名為DwrScriptSessionManagerUtil的類,該類如下實現:

                   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);

           

                 }

           

          }

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

                第五、消息推送

                      在你想要推送消息的時候,調用如下方法:

                       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為在想推送的頁面中的javascript方法,autoMessage是這個方法的參數,這樣那個頁面就能得到推送的內容了,至于如何展現,就看你的需要了。

           

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

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

          Feedback

          # re: dwr3實現消息精確推送詳細步驟 2012-12-22 22:56 飛龍劍
          謝謝你的教程,這個東西網上說得都不完全,找了好久終于找到一篇高質量的教程。通過你的教程我終于把消息推送提醒搞定了。  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2013-04-18 17:15 luojia_wang
          我按照你的方法實現的例子 為什么說找不到showMessage 這個方法我是定義了的啊  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2013-04-18 17:27 luojia_wang
          出來了,剛才是不曉得為什么不成功,現在沒有改什么居然成功了,對你表示萬分感謝!  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2013-04-25 15:19 wangg
          好像sessionDestroyed方法上面都沒有做吧 那么scriptsession會越來越多 最好導致內存溢出。請問怎么銷毀scriptsession  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2013-05-16 14:22 11111
          @wangg
          這篇文章的監聽器處理是有問題的 監聽應該永遠只有一個 最好把監聽寫在系統啟動的時候執行  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2013-05-24 18:55 lyndon
          可以推送,但是頁面總是彈出 No data receiver from server  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 [未登錄] 2013-07-11 16:20 s
          你好,方便的話請幫忙回答下,sendMessageAuto 這個方法放到那個類里,并且我總是在引入js 時,不能找到dwr對象呢?  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2013-08-05 12:35 hww
          你把消息推送搞定了?能討論一下么~@飛龍劍
            回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2013-08-08 09:16 劉磊
          MessagePush.js里面有些啥哦  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 [未登錄] 2013-08-12 17:50 瘋子
          這個只需要導入dwr的包就好了嗎?第五步的時候我怎么老是找不到類呢?  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 [未登錄] 2013-08-12 17:51 瘋子
          @劉磊
          你的能出效果嗎?可以給我個你測試的代碼不?  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 [未登錄] 2013-09-03 14:49 111
          111  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 [未登錄] 2013-10-26 21:42 TY
          @luojia_wang
          XXXXXXX  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2014-01-16 10:17 wen
          @s 放在DwrScriptSessionManagerUtil 里  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2014-01-16 10:18 wen
          這個文件引入就行不用寫 @劉磊
            回復  更多評論
            

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

          # re: dwr3實現消息精確推送詳細步驟 2014-04-03 09:30 灰灰
          @王威
          我與你遇到的情況一樣,88 行,報空指針異常,你解決了么  回復  更多評論
            

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

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

            回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2014-05-02 14:58 kingsea
          謝謝  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 [未登錄] 2014-07-09 11:32 超人
          你這個工程還有源碼嗎,給我一份唄,郵箱1906673110@qq.com  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 [未登錄] 2014-07-09 11:34 超人
          你這個工程還有源碼嗎,給我一分唄,郵箱1906673110@qq.com 謝謝了。  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2014-07-12 16:01 游客
          為什么我的Browser和ScriptSessionFilter這兩個類找不到呢,是還缺少別的包嗎?求解答謝謝  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2014-07-25 17:22 xiei
          是dwr3不是dwr2
          @游客
            回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2014-07-25 17:23 謝謝樓主
          太感謝了。寫的好。但是DwrScriptSessionManagerUtil extends DwrServlet這個沒必要繼承吧?沒看懂為什么需要繼承  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2014-08-27 12:23 路過
          @游客
          朋友你好,我也沒有找到,請問你解決了嗎?我建的是maven工程。  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2014-09-04 11:38 darren
          請問這個dwr是瀏覽器主動請求服務端還是服務端主動推送到瀏覽器?  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2014-09-10 16:30 亮亮
          真的很厲害呢,都說樓主的很好  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2014-09-10 16:32 亮亮
          剛看到一個博客,專門附了樓主的鏈接呢,表示感謝呢,看來對我這個菜鳥有很大幫助  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2014-10-28 11:03 yys
          MessagePush.js里面都有什么  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2014-10-28 11:53 yys
          Container類需要自己建嗎  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2014-11-17 16:32 天道獨行
          為什么我這sripterBuffer沒有appendCall(a,b)方法  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2014-11-23 20:20 xuxiuyuan
          你好,你還有整個工程的源碼,我可以看下嗎?感激不盡,郵箱1940471492@qq.com  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2014-11-25 21:13
          <script type="text/javascript" src="<%=basepath%>dwr/interface/MessagePush.js"></script> 這個是什么的js  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 [未登錄] 2014-12-01 16:31 Change
          正好在學習這部分內容,謝謝!  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 [未登錄] 2014-12-01 16:32 Change

          能否提供源碼,非常感謝!223130021@qq.com  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2014-12-08 15:29 asd
          @王威
          你好請問你解決了么 是什么問題  回復  更多評論
            

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

          # re: dwr3實現消息精確推送詳細步驟 [未登錄] 2015-06-16 11:47 111
          good  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2015-08-17 16:19 orican
          為什么我的過濾工具類沒有執行???  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2015-09-05 23:13 test_yf
          dwr.xml alow 改為 allow  回復  更多評論
            

          # MessagePush.js不知如何寫 2015-09-09 16:24 陳四超
          MessagePush.js不知道怎么寫?還報dwr未定義  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2015-10-21 12:28 klp
          多謝大神,簡潔明了,比其他的更勝一籌。  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2016-05-09 09:28 小澤瑪莉亞
          只需要dwr.jar?  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 [未登錄] 2016-05-25 10:18 aa
          wrer  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 [未登錄] 2016-05-26 11:56 Emma
          GoEasy,專業做web消息推送的工具,服務器穩定,中英文都齊全,代碼簡潔易懂;官網:https://goeasy.io/  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 [未登錄] 2016-06-28 16:52 winter
          您好問下,maven工程pom.xml中配置的dwr是啥版本,現在報MessagePush.js找不到  回復  更多評論
            

          # re: dwr3實現消息精確推送詳細步驟 2016-08-22 13:48 z_東九
          源碼誰有啊,求發給我,QQ798923617  回復  更多評論
            

          主站蜘蛛池模板: 喀什市| 如东县| 穆棱市| 修文县| 宜昌市| 娱乐| 井冈山市| 承德县| 麻城市| 雷州市| 时尚| 交口县| 河南省| 来宾市| 昭通市| 井研县| 义马市| 娄底市| 通许县| 驻马店市| 铜陵市| 闻喜县| 瓮安县| 荔浦县| 尤溪县| 板桥市| 长沙县| 读书| 四会市| 时尚| 陆河县| 武清区| 洞口县| 富宁县| 富阳市| 阳新县| 揭东县| 兴业县| 沙坪坝区| 古浪县| 黄骅市|