dwr进行消息推送示例





   
    
    
              
  

  

关于dwr的介绍可自行度娘,这里主要做一个dwr进行消息推送的demo

第一步:这里使用maven项目,先引入jar的仓库地址:

1 
2             org.directwebremoting
3             dwr
4             3.0.0-RELEASE
5         
View Code

第二步:web.xml配置

	
	
		dwr-invoker
		org.directwebremoting.servlet.DwrServlet
		
			debug
			true
		
		
			logLevel
			WARN
		
		
			crossDomainSessionSecurity
			false
		
		
			allowScriptTagRemoting
			true
		
		
			classes
			java.lang.Object
		
		
			activeReverseAjaxEnabled
			true
		
		
			initApplicationScopeCreatorsAtStartup
			true
		
		
			maxWaitAfterWrite
			6000
		
		2  
	
          
     dwr-invoker    
     /dwr/*    
   

  第三步:后台编码

package com.manhui.push.controller;

import java.util.Collection;

import org.apache.log4j.Logger;
import org.directwebremoting.Browser;
import org.directwebremoting.ScriptBuffer;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.ScriptSessionFilter;
import org.directwebremoting.WebContextFactory;

/**
 * 推送消息控制层,这里主要是进行消息的精确推送,当然如果要进行所有推送,则不需要进行过滤处理即可
 * @author hq
 *
 */
public class PushMessage {
	
	private Logger log = Logger.getLogger(PushMessage.class);
	
	 // 载入页面时调用,传入name值作为推送的标识
    public void onPageLoad(String name) {
        ScriptSession session = WebContextFactory.get().getScriptSession();
        session.setAttribute("name", name);
    }
    public void addMessage(String userid, String message) {
        final String userId = userid;
        final String autoMessage = message;
        ScriptSession session = WebContextFactory.get().getScriptSession();
        String from =(String) session.getAttribute("name");
        
        // 获取所有scriptsession并通过ScriptSessionFilter筛选符合条件的ScriptSession
        Browser.withAllSessionsFiltered(new ScriptSessionFilter() {
            // 实现match方法,条件为真为筛选出来的session
            public boolean match(ScriptSession session) {
                String name = session.getAttribute("name").toString();
               return name == null ? false : userId.equals(name);
            }
        }, new Runnable() {
            private ScriptBuffer script = new ScriptBuffer();
            public void run() {
                // 设定前台接受消息的方法和参数
                script.appendCall("receiveMessages", autoMessage);
                Collection sessions = Browser
                        .getTargetSessions();//获取有效的scriptsession
                // 向所有符合条件的页面推送消息
                for (ScriptSession scriptSession : sessions) {
                    if (scriptSession.getAttribute("name").equals(userId)) {
                        scriptSession.addScript(script);
                    }
                }
            }
        });
    }
	
	

}

  第四步:在web.xml同级目录下创建dwr.xml文件

 





   
    
    
              
  

  

第五步:在需要推送消息的页面引入相关js,并在页面初始化之前加载相关方法

   
   
   

     该js文件是根据dwr.xml自行生成的,前面的是dwr.jar里面的

页面初始化加载调用:

  dwr.engine.setActiveReverseAjax(true);// 开启逆向Ajax,也可写在body标签的onload方法中
  dwr.engine.setNotifyServerOnPageUnload(true);
  dwr.engine.setErrorHandler(function(){});//"   这个方法 防止项目已经关闭,客户页面还未关闭,页面会谈Error的问题
  onPageLoad();

  

var chatlog = "";
var name = '${name}';
function sendMessage() {
    var message = $("#message").val();
    var user = $("#user").val();
    // 通过代理调用后台的addMessage方法发送消息
    PushMessage.addMessage(user, message);
}

// 前台接受消息的方法,由后台调用 
function receiveMessages(messages) {
    var lastMessage =  messages;
    chatlog = "

" + lastMessage + "

" + chatlog; $("#list").html(chatlog); } //读取name值作为推送的唯一标示 function onPageLoad(){ // 获取URL中的name属性为唯一标识符 var userId = name; $("#myName").html(userId); // 通过代理,传入区别本页面的唯一标识符 PushMessage.onPageLoad(userId); }

  第六步:效果如下dwr进行消息推送示例_第1张图片

 

转载于:https://www.cnblogs.com/HeQiangJava/p/7468367.html

你可能感兴趣的:(dwr进行消息推送示例)