您的位置:首页 > 其它

dwr 网页推送的简单应用

2015-06-02 12:14 381 查看
需求:类似网页版聊天室的功能,消息实时性要高,

环境:Eclipse SpringMVC4.1

dwr 在程序层面上将 后台代码和前端代码进行了一次融合(dwr相当于一个中间人),后端可以调用前端js方法,前端也可以调用后端方法
dwr中的链接对象ScriptSession,它和HttpSession 是不一样的。区分可以google来看一下

1.作为一个程序员开始第一步当然是导入jar文件了,这里的版本是 3.0
2.web.xml中增加对dwr的支持servlet配置



3.创建推送者 PushMsg.java

4.新建一个dwr.xml配置文件



5.前端页面中

(1)引入dwr的支持



这里引入的三个外部js,前两个是包含在dwr.jar中,后一个看下面

pushMsg.js 就是dwr.xml中起的别名,dwr会将PushMsg这个推送者以一个js外部方法的方式加入到框架 内,这一步的转化过程是dwr框架自动实现的,

(2)页面增加 onload="init()"

(3)

function init(){

//这个方法用来启动该页面的ReverseAjax功能

dwr.engine.setActiveReverseAjax(true);

//设置在页面关闭时,通知服务端销毁会话

dwr.engine.setNotifyServerOnPageUnload(true);

//绑定用户,这个方式在PushMsg.java能找到对应方法,目的是增加一些我们自己定义的一些参数,便于区 分 用户的链接

pushMsg.bindUser($!uid,2);

}

//后台调用的消息处理方法

function showMessage(data,type,orderid) {

alert(data+""+type);

}

6.到此简单版本就可以运行了,

7.增加监听来监听 dwr用户链接的建立和销毁,同时来处理一些我们自己的一些逻辑

(1)DWRScriptSessionManager.java 这个就是web.xml中的那个监听管理者

(2)DWRScriptSessionListener.java 具体的监听操作

在 监听中我们自己定义了一个map来管理用户的链接,我这里是根据用户的uid来对应一个用户链接的, 同样你也可以用HttpSession的id,网上大多是这种方式的,

但是sessionId的方式不适合在同一个浏览器的情况,这种场景都能想想吧,多账号登录嘛,因为 sessionid会是同一个,导致用户链接就不准确,看情况选吧

其实dwr内部也有自己的一套管理链接的逻辑,Browser.getTargetSessions();就是取所有的用户链接

框架是支持通过 页面来区分链接的,例如 在多个页面 1.html 2.html 都要求有推送,但是推送的内容不一 样这种情况,
package com.cat.dwr;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.directwebremoting.Browser;
import org.directwebremoting.ScriptBuffer;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.ScriptSessionFilter;
import org.directwebremoting.ServerContext;
import org.directwebremoting.ServerContextFactory;
import org.directwebremoting.WebContextFactory;
import org.directwebremoting.proxy.dwr.Util;
import com.cat.consts.AdminConst;
import com.cat.consts.PublicConstant;
import com.cat.output.UserModel;
@SuppressWarnings("all")
public class PushMsg {
public static final String user_uid_Key = "userid";
public static final String user_type_Key = "type";
//绑定 用户
public static void bindUser(Long uid,int type){
//将用户id和页面脚本session绑定
ScriptSession session =  WebContextFactory.get().getScriptSession();
session.setAttribute(user_uid_Key, uid);
session.setAttribute(user_type_Key, type);

DWRScriptSessionListener.bindUserSession(uid.toString(), session);
}
// 推送的 session验证过滤器
private static ScriptSessionFilter checkMsgWarnFilter(final Long receiverid,final int t){
//过滤器
ScriptSessionFilter filter = new ScriptSessionFilter() {
public boolean match(ScriptSession scriptSession) {
Long xuserid = (Long) scriptSession.getAttribute(user_uid_Key);
Integer type = (Integer) scriptSession.getAttribute(user_type_Key);
System.out.println("xuserid: "+xuserid+" type:"+type+"  x:"+receiverid+" t:"+t);
if (xuserid != null && null!=type ) {
if(xuserid.longValue() == receiverid.longValue() && type.intValue() == t){
return true;
}
}
return false;
}
};
return filter;
}
//发送提醒消息
public static void sendMsgWarn(final String msg,final Long receiverid,final int type,final Long orderid){
Runnable run = new Runnable(){
private ScriptBuffer script = new ScriptBuffer();
public void run() {
//设置要调用的 js及参数 ,根据需要增加多个参数,跟页面上的要统一
script.appendCall("showMessage", msg,type,orderid);
//得到所有ScriptSession
Collection sessions = DWRScriptSessionListener.getScriptSessions();
//遍历每一个ScriptSession
for (ScriptSession scriptSession : sessions){
scriptSession.addScript( script);
}
}
};
//执行推送   注意这里调用了有filter功能的方法
Browser.withAllSessionsFiltered(checkMsgWarnFilter(receiverid,type), run);
}
}


package com.cat.dwr;<pre name="code" class="java">package com.cat.dwr;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.WebContext;
import org.directwebremoting.WebContextFactory;
import org.directwebremoting.event.ScriptSessionEvent;
import org.directwebremoting.event.ScriptSessionListener;

public class DWRScriptSessionListener implements ScriptSessionListener {

//维护一个Map key为session的Id, value为ScriptSession对象
public static final Map scriptSessionMap = new HashMap();

public void sessionCreated(ScriptSessionEvent event) {
WebContext webContext = WebContextFactory. get();
HttpSession session = webContext.getSession();
ScriptSession scriptSession = event.getSession();

Object  userid = scriptSession.getAttribute(PushMsg.user_uid_Key);
if(null != userid){
scriptSessionMap.put(userid.toString(), scriptSession);
System. out.println(" scriptSession: " + scriptSession.getId() + "is created! userid:"+userid.toString());
}
}
public static void bindUserSession(String key,ScriptSession scriptSession){

scriptSessionMap.put(key, scriptSession);
System. out.println("bindUserSession scriptSession: " + scriptSession.getId() + "is created! key:"+key);
}

public void sessionDestroyed(ScriptSessionEvent event) {
ScriptSession scriptSession = event.getSession();
Object userid = scriptSession.getAttribute(PushMsg.user_uid_Key);
if(null != userid){
scriptSessionMap.remove(userid.toString());
System. out.println(" scriptSession: " + scriptSession.getId() + "is destroyed! userid:"+userid.toString());
}
}

public static Collection getScriptSessions(){
return scriptSessionMap.values();
}
}


import org.directwebremoting.impl.DefaultScriptSessionManager; public class DWRScriptSessionManager extends DefaultScriptSessionManager { public DWRScriptSessionManager(){ //绑定一个ScriptSession增加销毁事件的监听器 this.addScriptSessionListener( new DWRScriptSessionListener());
System. out.println( "bind DWRScriptSessionListener"); } }

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: