zoukankan      html  css  js  c++  java
  • DWR实现服务器向客户端推送消息

    原文链接 http://www.blogjava.net/stevenjohn/archive/2012/07/07/382447.html这片文章还是给了我很大帮助,再次表示感谢,下面我将这两天的研究详细记录下来备忘,也希望能帮助到像我一样的人。只写过程,不写原理(不是不写,而是有些地方我也不太懂),下面开始:

          

    第一、在项目中引入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中配置的javascript,engine.js和util.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消息精准推送的步骤就写完了,其实很多东西都不难,只是我们不知道该怎么用而已。

       

  • 相关阅读:
    JavaScript大杂烩1
    JavaScript大杂烩0
    Scrum敏捷开发沉思录
    C#的变迁史
    C#的变迁史
    C#的变迁史
    巧用浏览器F12调试器定位系统前后端bug-转载
    Jmeter如何把响应数据的结果保存到本地的一个文件
    Jmeter察看结果树的响应数据中的中文显示乱码问题处理
    Jmeter如何将上一个请求的结果作为下一个请求的参数——使用正则表达式提取器转载
  • 原文地址:https://www.cnblogs.com/bingoing/p/6129472.html
Copyright © 2011-2022 走看看