一、实现原理剖析:

1.在群聊中,我们知道如何通过uri获得所有的session集合,但在单对单的聊天中并不需要获取全部,他只需要在彼此的session中进行聊天的管理/展示。

2.为此我们通过构造Map集合,通过单独唯一的key(用户名或者id编号,唯一即可),并同时将当前的session,put进去便可。当我们要指定发送对象时,我们便可获取

被发送对象的session,构建util。调用客户端编写好的js响应方法,产生相应的气泡提示了。

流程:Map构建-》发送消息给指定对象-》通过Map来get对象的session-》通过session构建utli-》util对客户端的js进行调用

ps:前提我们知道dwr中的远程调用java类是单例模式下的。否则根本无法保存每一个session。

二、实现核心代码:

1.远程调用类:

public class MsgPushService {
	public static Map<String,Object> sessionManager = new HashMap<String,Object>();

	/**
	 * 添加客户端session ps:firfox有错误提示..-已解决,将跳转放置dwr的回调函数中
	 * 1.登录成功后进行调用
	 * @param username
	 */
	public String addScriptSession(String username,HttpServletRequest req) {
		if(!"".equals(username)&&username!=null){
			sessionManager.put(username,WebContextFactory.get().getScriptSession());
		}
		return "ok";
	}

	public ScriptSession getScriptSession(String username) {
		return (ScriptSession) sessionManager.get(username);
	}

	/**
	 * 2.发送消息时进行调用
	 * @param senderName
	 * @param receiverName
	 * @param title
	 * @param content
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public String pushMsg(String senderName,String receiverName,String title,String content,HttpServletRequest req) {
		ScriptSession receiver_session = this.getScriptSession(receiverName);
		Collection<ScriptSession> cols = new ArrayList<ScriptSession>();
		cols.add(receiver_session);
		Util util = new Util(cols);
		util.addFunctionCall("doReply","ok");
		return "ok";
	}

	/**
	 * 
	 * 这里暂时没有用到:给所有客户端页面添加脚本
	 * @param function
	 * @param msg
	 * @param req
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public String addFunctionCallOnAllScriptSession(final String function,final String msg,HttpServletRequest req) {
		ServletContext sc = req.getSession().getServletContext();
		ServerContext sctx = ServerContextFactory.get(sc);
		Collection<ScriptSession> sessions = sctx
				.getScriptSessionsByPage("/msgpush/jsp/msgPush.do");
		Util util = new Util(sessions);
		util.addFunctionCall(function,msg);
		return "ok";
	}

}

2.页面调用:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<Meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>欢迎 ${sessionScope.user.username }</title>

<link rel="stylesheet" href="../js/poshytip-1.1/tip-darkgray/tip-darkgray.css" type="text/css" />
<script type='text/javascript' src='../dwr/engine.js'> </script>
<script type='text/javascript' src='../dwr/interface/MsgPushService.js'> </script>
<script type='text/javascript' src='../dwr/util.js'> </script>
<script type="text/javascript" src="../js/jquery.js"></script>
<script type="text/javascript" src="../js/msgpush.js"></script>
<script type="text/javascript" src="../js/poshytip-1.1/jquery.poshytip.js"></script>



</head>
<body>
	<a id="notice" title="">消息通知中心</a>
	 <a href="sessionMgmt.do?pageIndex=0" onclick="hide();" target="_blank">会话管理中心</a>
	<hr>
	在线用户列表:
	<s:iterator value="#application.OnlineUsers" id="user">
		<span id="<s:property value='#user' />">
			<input type="radio" name="rusers" value="<s:property value='#user' />"/>
			<s:property value='#user' />
		</span>
	</s:iterator>
	<s:if test="#application.OnlineUsers.size==1">
		暂没有可发送消息的对象
	</s:if>
	<hr>
	<form>
		<table>
			<tr>
				<td>消息内容:</td>
				<td>
					<input type="text" id="title"/>
				</td>
			</tr>
			<!-- 
			<tr>
				<td>内容</td>
				<td>
					<textarea rows="3" cols="20" id="content" ></textarea>
				</td>
			</tr>
			 -->
			<tr>
				<td></td>
				<td>
					<input type="button" value="发送" onclick="javascript:pushMsg();"/>
					<input type="reset" value="清空"/>
				</td>
			</tr>
		</table>
	</form>
	<input type="hidden" value="${sessionScope.user.username }" id="username"/>
</body>
</html>


3.脚本处理

$(function(){
	//在线用户列表中过滤本身
	var id="#"+$("#username").val();
	$(id).css("display","none");
});

function pushMsg(){
	var title=$("#title").val();
	//var content=$("#content").val();
	var receiverName=$(":radio:checked").val();
	if (receiverName == undefined) {   
        alert("请选择发送的对象");
        return;
    }
	if (title == "" || title.length <= 0) {   
        alert("请输入主题");
        return;
    }
	/*
	if (content == "" || content.length <= 0) {   
        alert("请输入内容");
        return;
    }
	*/
	
	/*
	MsgPushService.send($("#username").val(),$(":radio:checked").val(),$("#title").val(),$("#content").val(),{
    	//指定回调函数  
        callback:getMsg,//指定超时时长  
        timeout:1000,//指定错误处理函数  
        errorHandler:function(message) { alert("错误提示: " + message); },//指定  
        warningHandler:function(message) { alert("Oops: " + message); },textHtmlHandler: function(message) { alert("Oops: " + message); },exceptionHandler: function(message) { alert("Oops: " + message); },//指定发送请求的方式  
        httpMethod:'POST',async:true,//指定发送请求之前的勾子函数  
        preHook:function(){
        	//alert('远程调用之前...')
        },//指定发送请求之后的勾子函数  
        postHook:function(){
        	//alert('远程调用之后...')
        }  
    });
	*/
	MsgPushService.pushMsg($("#username").val(),receiverName,title,"",function(msg){
		//alert(msg);
	});
	//MsgPushService.test();
}

function getMsg(msg){
	//alert(msg);
}

function doReply(msg){
	if('ok'==msg){
		$('#notice').poshytip({
			className: 'tip-darkgray',showOn:'none',//一直显示
			content:'你有新消息  <a href="sessionMgmt.do?pageIndex=0" onclick="hide();" target="_blank">查看留言</a>',alignTo:'target',//定位的相对目标
			alignX:'right',alignY:'center',offsetX:5
		});
		$('#notice').poshytip('show');
	}
}

function hide(){
	$('#notice').poshytip('hide');
}

/**
* 页面初始化
*/  
function init() {   
     dwr.engine.setActiveReverseAjax(true); // 激活反转 重要   
     MsgPushService.addScriptSession($("#username").val(),function(msg){});
} 

window.onload = init;//页面加载完毕后执行初始化方法init 


效果图:

下载地址: http://download.csdn.net/download/techbirds_bao/5508043

DWR实现消息推送(基于单对单聊天)-第三节的更多相关文章

  1. HTML5 Web缓存和运用程序缓存(cookie,session)

    这篇文章主要介绍了HTML5 Web缓存和运用程序缓存(cookie,session),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. iOS Swift上弃用后Twitter.sharedInstance().session()?. userName的替代方案

    解决方法如果您仍在寻找解决方案,请参阅以下内容:

  3. 使用Fabric SDK iOS访问Twitter用户时间线

    我试图在这个问题上挣扎两天.我正在使用FabricSDK和Rest工具包,试图为Twitter使用不同的RestAPIWeb服务.我可以使用具有authTokenSecret,authToken和其他值的会话对象的TWTRLogInButton成功登录.当我尝试获取用户时间线时,我总是得到失败的响应,作为:{“errors”:[{“code”:215,“message”:“BadAuthentic

  4. ios – 如何从Apple Watch调用iPhone上定义的方法

    有没有办法从Watchkit扩展中调用iPhone上的类中定义的方法?根据我的理解,目前在Watchkit和iPhone之间进行本地通信的方法之一是使用NSUserDefaults,但还有其他方法吗?

  5. ios – 如何将视频从AVAssetExportSession保存到相机胶卷?

    在此先感谢您的帮助.解决方法只需使用session.outputURL=…

  6. ios – 使用AVCaptureSession sessionPreset = AVCaptureSessionPresetPhoto拉伸捕获的照片

    解决方法所以我解决了我的问题.这是我现在使用的代码,它工作正常:…重要的输出imagaView:一些额外的信息:相机图层必须是全屏,并且outputimageView也必须是.我希望这些对某些人来说也是有用的信息.

  7. 我可以在iOS中自定义Twitter工具包的登录按钮吗?

    我已经下载了Twitter工具包框架并添加了用Twitter登录的代码.但是,我不希望登录按钮看起来像那样.我想要一个用于登录的自定义按钮.我能这样做吗?我只想使用这个框架,因为这也适用于iOS系统帐户.解决方法根据document:在按下按钮中添加代码:Objective-C的迅速

  8. ios – AVCaptureSession条形码扫描

    解决方法以下是我所拥有的项目代码示例,可以帮助您走上正确的轨道

  9. ios – 如何在Watch OS 2中引用不支持的框架

    有没有办法将框架链接到扩展名?

  10. ios7 – 在iOS 7中设置Alamofire中的自定义HTTP标头不工作

    解决方法我得到它的工作这对iOS7没有影响:然而,这将适用于iOS7和8:

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部