文档章节

dwr 精准推送

烤猪佩奇
 烤猪佩奇
发布于 2016/02/29 17:20
字数 980
阅读 14
收藏 0
点赞 1
评论 1

这几天做项目,需要一个消息提醒功能,决定用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消息精准推送的步骤就写完了,其实很多东西都不难,只是我们不知道该怎么用而已。

© 著作权归作者所有

共有 人打赏支持
烤猪佩奇
粉丝 18
博文 46
码字总数 6583
作品 0
广州
高级程序员
加载中

评论(1)

w
wahahachuang4
Goeasy就不错,专业做web实时推送,服务器稳定,代码简洁易懂,还有中英文,网址是https://goeasy.io/
dwr3实现消息精确推送详细步骤

最近项目中需要用到推送消息,找了很久终于找到一篇不错的文章,方便以后查看就转载了,也分享给大家,希望能帮到有需要的人。 第一、在项目中引入dwr.jar,然后在web.xml中进行配置,配置如...

开源真好耶 ⋅ 2016/01/06 ⋅ 1

Java Dwr3实现消息推送步骤详解

1、在工程中引入dwr.jar,之后修改配置web.xml文件,添加配置具体代码如下: <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class> org.directwebremoting.servlet.DwrServ......

afreon ⋅ 2015/05/24 ⋅ 2

DWR3.0框架入门(3) —— ScriptSession的维护及优化

1.ScriptSession使用中存在的问题 在上一节实现了服务器的推送功能,但是根据ScriptSession的生命周期我们可以得出以下几点的问题: (1)ScriptSession不会与HttpSession同时创建 当我们访问...

_Core ⋅ 2013/11/26 ⋅ 21

现在javaweb 后台推送给前台是如何实现的

现在网站主流的后台推送方法时什么.如何实现(或者说后台调用前台JS) 本人搜索了很多,easygo 收费 pass ,dwr 搜索到的都是以前的资料了,可能本人菜鸟完全整合不进去,有的dwr demo 根本跑步起来...

Coding菜鸟 ⋅ 2016/08/23 ⋅ 8

使用DWR长连接技术实现客户端一对一发送消息

关于DWR怎么使用我的上一篇博文里面记录了,这里写一个DWR一对一消息推送的WEB程序,也就是WEB一对一聊天。我的思路是这样的:首先每个用户在登陆后在各自的页面放置一个唯一标记(如用户的I...

蜡笔小小小新 ⋅ 2015/09/10 ⋅ 1

dwr 后台推送技术

实例分为两个页面 sendMsg.jsp页面 ,发送一段消息给后台 ,然后后台将消息推送到showMsg.jsp页面 web.xml配置 <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.......

backtract ⋅ 2013/11/08 ⋅ 3

Dwr3.0纯注解(纯Java Code配置)配置与应用浅析三之后端反向调用前端

在前两篇中我们已经介绍了Dwr零配置文化化和前端调用后端的方法,想必大家应该已经会熟练掌握了,下来我们主要探讨一下后端怎么反向调用前端的js方法; 就如前两篇说到了用Dwr注册了两个Ser...

源-代码 ⋅ 2016/04/27 ⋅ 0

dwr 服务器推送 提示网关超时

504 Gateway Time-out - http://localhost/dwr/call/plainpoll/ReverseAjax.dwr 启动是正常的,加载也正常,就是post上面网址提示网关超时 Runnable run = new Runnable() { 这是推送的代码...

超级大富 ⋅ 2015/03/18 ⋅ 1

DWR Reverse Ajax

目前项目中的消息推送使用了DWR的Reverse Ajax,所以了解一下 Direct Web Remoting Reverse Ajax (http://directwebremoting.org/dwr/documentation/reverse-ajax/index.html) Index the ab......

豆仔 ⋅ 2012/12/14 ⋅ 0

项目里用了dwr推送 session设置的超时时间 不起作用了?

在项目里用了Dwr推送,dwr隔一段时间就会自己发送一个请求 然后session设置的超时时间也就没作用了 如何才能让session超时有效 ?

阿斯兰 ⋅ 2015/04/20 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

table eg

user_id user_name full_name 1 zhangsan 张三 2 lisi 李四 `` ™ [========] 2018-06-18 09:42:06 星期一½ gdsgagagagdsgasgagadsgdasgagsa...

qwfys ⋅ 31分钟前 ⋅ 0

一个有趣的Java问题

先来看看源码: public class TestDemo { public static void main(String[] args) { Integer a = 10; Integer b = 20; swap(a, b); System.out......

linxyz ⋅ 35分钟前 ⋅ 0

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 今天 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 8

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部