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>config</param-name>
<param-value>/WEB-INF/config/dwr.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<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>logLevel</param-name>
<param-value>WARN</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
从配置中可以看出需要新建一个dwr配置文件,如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"
"http://getahead.org/dwr//dwr30.dtd">
<dwr>
<allow>
<!-- <create javascript="udao" creator="spring"> <param name="beanName"
value="udao" /> <include method="getUserPage"/> </create> <convert converter="bean"
match="com.cpsoft.app.web.domain.PageModel" /> --> <create javascript="MessagePush" creator="spring">
<param name="beanName" value="messagePush" />
</create>
<convert converter="bean" match="java.lang.StackTraceElement" />
<convert converter="exception" match="java.lang.Exception" />
</allow>
</dwr>
那么大家可以看到,我配置了一个messagePush这个对象,那么我就来说说这个对象吧
@Component
public class MessagePush { final public static String SCRIPT_SESSION_USERID = "SCRIPT_SESSION_USERID";
final public static String SCRIPT_SESSION_MSG = "showMessage"; //这是页面上当后台消息推送时,自动触发的js方法名称 private Logger log = Logger.getLogger(this.getClass());
private ScriptSessionListener listener;
private boolean isInit = false; public boolean isInit(){
return isInit;
}
/**
* 获取scriptSession的监听对象,只需要实例化一次
* @return
*/
public ScriptSessionListener getListener() {
if(listener == null){
listener = new ScriptSessionListener() {
public void sessionCreated(ScriptSessionEvent ev) {
HttpSession session = WebContextFactory.get().getSession();
Staff staff = SessionUtil.getStaff(session);
if(staff!=null){
ev.getSession().setAttribute(SCRIPT_SESSION_USERID, staff.getId()); //与当前登录用户相关联
log.info("a ScriptSession["+staff.getId()+"] is created!");
Map<String, Staff> onlineStaffMap = CacheUtil.getOnlineStaffMap(); //获取当前的在线用户
if(!onlineStaffMap.containsKey(staff.getId())) onlineStaffMap.put(staff.getId(), staff); //如果不存在,则将当前用户加入到缓存中
}
if(!isInit) isInit = true;
} public void sessionDestroyed(ScriptSessionEvent ev) {
String userId = (String) ev.getSession().getAttribute(SCRIPT_SESSION_USERID);
log.info("a ScriptSession["+userId+"] is distroyed!");
}
};
}
return listener;
} /**
* 初始化dwr监听,只在程序中调用一次即可
*/
public void init(){
if(listener == null){
Container container = ServerContextFactory.get().getContainer();
ScriptSessionManager manager = container
.getBean(ScriptSessionManager.class);
manager.addScriptSessionListener(getListener());
log.info("the dwr client is inited!");
}
} }
这个类的主要作用是初始化监听,接着如果有了监听,那现在就可以推送消息了,请看代码
/**
* 采用dwr的方式向前台推送消息
* @param userId 用户Id
* @param autoMessage 消息内容
*/
private static void sendMessageAuto(final String userId, final String autoMessage) {
Browser.withAllSessionsFiltered(new ScriptSessionFilter() {
public boolean match(ScriptSession session) {
String id = (String) session.getAttribute(MessagePush.SCRIPT_SESSION_USERID);
if (id == null || !userId.equals(id)) { //匹配接收人的Id
return false;
}
return true;
}
}, new Runnable() {
private ScriptBuffer script = new ScriptBuffer();
public void run() {
script.appendCall(MessagePush.SCRIPT_SESSION_MSG, autoMessage); //推送消息(我在这里用的是json字符串)
Collection<ScriptSession> sessions = Browser.getTargetSessions(); //获取当前的目标客户端对象
for (ScriptSession scriptSession : sessions) {
scriptSession.addScript(script);
}
}
});
}
说到这里,后台工作就告一段落了,接着来说说前台,首先引入js吧
<!-- 消息推送 -->
<script type='text/javascript' src='${ctx}/dwr/engine.js'></script>
<script type='text/javascript' src='${ctx}/dwr/util.js'></script>
<script type="text/javascript" src="${ctx}/dwr/interface/MessagePush.js"></script>
在onload 加入
<body onload="dwr.engine.setActiveReverseAjax(true);dwr.engine.setNotifyServerOnPageUnload(true);">
那么现在大工告成了,只要后台调用上面的推送方法,前台就好自动触发
function showMessage(autoMessage){
//alert(autoMessage);
if(!callCometShowMsg){
eval("var json="+ autoMessage);
g_showTip("消息类型:"+json.MESSAGE_TYPE+"<br />消息内容:"+json.MESSAGE_DATA);
}else{
callCometShowMsg(autoMessage);
}
}
最后说说总结一下把,实测了一下,发现Ie8下反应慢一点,对于chrome,我用的这个版本会有问题, 火狐表现良好
有什么问题可以留言,看到第一时间回复
dwr消息推送的更多相关文章
- dwr消息推送和tomcat集群
网友的提问: 项目中用到了dwr消息推送.而服务端是通过一个http请求后 触发dwr中的推送方法.而单个tomcat中.服务器发送的http请求和用户都在一个tomcat服务器中.这样就能精准推送到 ...
- dwr简单应用及一个反向ajax消息推送
由于项目中最近需要用到dwr实现一些功能,因此在网上和dwr官网上找了一些资料进行学习.在此记录一下.(此处实现简单的dwr应用和dwr消息反向推送) 一.引入dwr的包 <dependency ...
- SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)
SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...
- 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送
微信支付之微信模板消息推送 今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...
- 基于SignalR的消息推送与二维码描登录实现
1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...
- C# BS消息推送 SignalR介绍(一)
1. 前言 本文是根据网上前人的总结得出的. 环境: SignalR2.x,VS2015,Win10 介绍 1)SignalR能用来持久客户端与服务端的连接,让我们便于开发一些实时的应用,例如聊天室在 ...
- iOS 之消息推送(个推)---个人小结
前言:自从上个星期开始整这个推送,弄了差不多一个星期,今天终于给整好了,因此现在来记录这段"奇妙"的旅程. 我们公司使用的消息推送是用的第三方--个推,这里不得不说一下,个推的技术 ...
- WebSocket与消息推送
B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链 ...
- 分分钟搞定IOS远程消息推送
一.引言 IOS中消息的推送有两种方式,分别是本地推送和远程推送,本地推送在http://my.oschina.net/u/2340880/blog/405491这篇博客中有详细的介绍,这里主要讨论远 ...
随机推荐
- Qt4升级Qt5注意问题
Qt4升级Qt5注意问题 Qt4过渡到Qt5的项目一开始就受阻,记录一下遇到的下面的问题 --->编译遇到类似错误: error: QCalendarWidget: No such file o ...
- java io知识点汇总FIle类
1.路径分隔符问题: 因为java有跨平台行,而在windows和linux中的目录分隔符是不同的.windows是"\" 而linux是"/" 所以必须想办 ...
- Linux资源监控命令/工具(网络)
1.手动/自动设定与启动/关闭IP参数:ifconfig,ifup,ifdown 这三个指令的用途都是在启动网络接口,不过,ifup与ifdown仅能就/etc/sysconfig/netw ...
- 48. Rotate Image
题目: You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwis ...
- kali 安装中文输入法
(1)apt-get install fcitx-googlepinyin (2)你希望继续执行吗?Y (3)连续执行数次 (4)init 6(命令行重启)
- HTTP Basic Authorization
在HTTP中,Basic Authorization基本认证是一种用来允许Web浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式. 在发送之前是以用户名追加一个冒号然后串 ...
- 关于Linux的windows目录的挂载
今天,linux主机下面要增加一点空间,不想再增加硬盘,所以就在实体机里面就设置了目录共享,添加自己系统的默认账号(为了增加自己主机的安全性,我都是设置的含有标点符号的密码---这也是这次挂载不成功的 ...
- 自定义View(3)关于canas.drawText
本文以Canvas类的下面这个函数为基础,它用来在画布上绘制文本. public void drawText(String text, float x, float y, Paint paint) 效 ...
- Android下HelloWorld项目的R.java文件介绍
R.java文件介绍 HelloWorld工程中的R.java文件 package com.android.hellworld; public final class R { public s ...
- Codeforces Beta Round #2B(dp+数学)
贡献了一列WA.. 数学很神奇啊 这个题的关键是怎么才能算尾0的个数 只能相乘 可以想一下所有一位数相乘 除0之外,只有2和5相乘才能得到0 当然那些本身带0的多位数 里面肯定含有多少尾0 就含有多少 ...