少年阿宾

那些青春的岁月

  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 阅读(33375) 评论(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  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: