论坛首页 Java企业应用论坛

后台向前台消息推送求解决方案

浏览 31133 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (19) :: 隐藏帖 (1)
作者 正文
   发表时间:2011-10-20  

js:部分

/***
 * 系统消息发送及弹出js文件
 * 注意: 只能body中引入,如果在其它地方引入可能会出现错误.
 */
	var d_msg={};
	var d_msg_head = document.getElementsByTagName("HEAD");
	//加载jquery文件
	if( typeof(jQuery)=='undefined'){
		d_msg.jqueryf = document.createElement('SCRIPT');
		d_msg.jqueryf.setAttribute("type","text/javascript");
		d_msg.jqueryf.src = '/js/jquery/jquery_last.js';
	}

	//加载dwr引擎
	if (typeof(dwr)=='undefined' || dwr == null) {
			d_msg.dwr = document.createElement('SCRIPT');
			d_msg.dwr.setAttribute("type","text/javascript");
			d_msg.dwr.src = '/dwr/engine.js';
			
	}
	
	//加载消息发送文件
	d_msg.script = document.createElement('SCRIPT');
	d_msg.script.setAttribute("type","text/javascript");
	d_msg.script.src = '/dwr/interface/SystemMessgeServices.js';

	//加载弹出框 art组件
	if (!window.art) {
			/*d_msg.art = document.createElement('SCRIPT');
			d_msg.art.src = '/js/artDialog/artDialog.min.js';
			d_msg.art.setAttribute("type","text/javascript");
			//
			d_msg.skin = document.createElement('SCRIPT');
			d_msg.skin.setAttribute("type","text/javascript");
			d_msg.skin.src = '/js/artDialog/skin.js';*/
		
	}
	
	//将js文件加载到文档中
	for(var par in d_msg){
		if(d_msg_head){
			d_msg_head[0].appendChild(d_msg[par]); 
		}else{
			document.body.appendChild(d_msg[par]);
		}
	}
	
	//初始化消息接收机制
	jQuery(document).ready(function(){
		if(!propmtMsg.init){
			propmtMsg();
			propmtMsg.init = true;
		}
	});



//从服务器获取消息
function propmtMsg(keepConnect){
	 var clientKey  = propmtMsg.clientKey?propmtMsg.clientKey:'';
	 var keepConnect  = keepConnect?keepConnect:'';
	 jQuery.ajax({
	      data :{ clientKey: clientKey,keepConnect:keepConnect},
	      dataType : 'html',
	      type : 'post',
	      timeout:300000,
	      url : '/common/systemMsg.do?content=&method=getMSG',
	      success : function(jsonStr){
	      		if(jsonStr=="")return;
	     		var data  ;
	     		try{
	     			//JSON.parse(jsonStr);
	     		 	data = eval("("+jsonStr+")");
	     		}catch(e){
	     			return ;
	     		}
		      	var msgs = new Array();//最新消息
				var count =0;//消息总记录数
				for(var par in data){
					msgs = data[par];//取得消息
					count=par;
					continue;
				}
				//存储从服务器端获取的 客户端编号
				if(!propmtMsg.clientKey){
					propmtMsg.clientKey = msgs[0].clientKey;
				}
				if(count==0){
					propmtMsg();  
					return;
				}
				if(!msgs){//消息为空重新获取消息
					propmtMsg("keepConnect");  //
					return;
				}
				if(msgs.length<1){//消息长度为空,重新获取消息
					propmtMsg("keepConnect");  //
					return;
				}
				
				//其它该sessionId打开多个页面时,服务器会通知该session所打开的页面(此机制为了解决服务端及时发现已经关闭或离开的页面,防止内存泄露),
				//通知客户端此条连接等待作废(以disable为标记)重新发起消息请求,并为客户端设置clientKey
				if(msgs[0].disable){
					propmtMsg("keepConnect");  //通知服务器当前客户端页面仍然有效
					if(msgs[0].clientKey){
						propmtMsg.clientKey = msgs[0].clientKey;//重新设置客户端id
					}
					return;						
				}
				propmtMsg.keepConnect = null;
				if(propmtMsg.showPanel){
					propmtMsg.showPanel.close();
				}
				var title  = msgs[0].title;
				if(!title){
					title="您有新的消息";
				}
				var contenMemo  = msgs[0].memo;
				if(window.art){
					if(msgs[0].url) contenMemo+="   <a href ='"+msgs[0].url+"'>更多...</a>";
					try{
					//弹出消息框 ,这里只弹出了第一条消息,可以将返回的多条消息,另外展示^_^
				    	propmtMsg.showPanel = window.art.dialog({
						    title:title,
						    left: 'right' ,
						    top: 'bottom',
						    width:250,
						    effect:true,
						    //time:15,
						    content: contenMemo,
						    closeFn:function(){
						    	propmtMsg.showPanel = null;//标记弹出框已经关闭
						    }
						});
					}catch(e){
					
					}
				}
				propmtMsg("keepConnect");
	      },     
          error: function(XMLHttpRequest,textStatus,errorThrown){  
                if(textStatus=="timeout"){
                	delete propmtMsg['clientKey'];//请求超时,删除当前客户端的key
                	propmtMsg();  
                }
          }  
	   });
	
}

//window.onerror = function(){
	//nnd ie7在ajax超时老是报js错,虽然功能没有收到影响,但是错误太恶心了 暂时把它屏蔽 (ie6,ie8都不存在此问题....)可以采用iframe请求代替ajax来解决此问题.
	//if(arguments && 3==arguments.length){
	//	if(130==arguments[2])return true;
	//}
	//return true;
//}

//测试发送消息
function SendMsg(msg,userId){
	if(!msg)return;
	if(!userId)return;
	if(msg==''|| userId=='')return;
	SystemMessgeServices.sendMsg({
		receiver:{id:userId},
		createTime:1280010281,
		memo:msg,
		createUser:{id:1},
		title:'test'
	});
}


 
0 请登录后投票
   发表时间:2011-10-20   最后修改:2011-10-20

jsp调用:   

	<input type="text"   id="MSG_T_Msg" />					
<select id="MSG_T_USER">
											<option value="1">admin</option>
											<option value="2">t1</option>
											<option value="3">t2</option>
										</select>
										<input value="发送" type="button" onclick="SendMsg($('#MSG_T_Msg').val(),$('#MSG_T_USER').val())"/>

基本全了 ,明天整理一下,今天先闪了

后台JAVA调用: 和前台的dwr   SystemMessgeServices.sendMsg 一样

0 请登录后投票
   发表时间:2011-10-21  
前台用flex的话,可以采用blazeds,我实现过。。
0 请登录后投票
   发表时间:2011-10-21  
pushlet

我的项目再用,楼主可以去看我的文章
0 请登录后投票
   发表时间:2011-10-21  
dwr 推技术demo
http://www.blogjava.net/freeman1984/archive/2009/11/19/302961.html
0 请登录后投票
   发表时间:2011-10-21  
ileson 写道
坐等 http socket 很想解决这个问题。
等了一年了都 。哎。。

+1
0 请登录后投票
   发表时间:2011-10-21  
freegaga 写道
要求:当数据库中的数据发生变化时,需要主动将状态通知到前端,不希望使用定时异步刷新,请问各位高手有什么解决方案没有


Pushlet可以解决你的问题.而且很简单.
0 请登录后投票
   发表时间:2011-10-21  
dwr推送?
0 请登录后投票
   发表时间:2011-10-21   最后修改:2011-10-21
Long polling.
web qq啥的都是用它。
0 请登录后投票
   发表时间:2011-10-23   最后修改:2011-10-23
walldr2161 写道
说说想法不一定能实现:监听数据库,其实也就是AOP监听insert、delete、update等,

帖子一个 希望有所帮助  http://www.open-china.net/blog/8940.html


就是这样 的 dwr 的comet模型实现和aop相结合  用Aop拦截上述方法

上一个项目就是这么干的
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics