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 都要求有推送,但是推送的内容不一 样这种情况,
import org.directwebremoting.impl.DefaultScriptSessionManager; public class DWRScriptSessionManager extends DefaultScriptSessionManager { public DWRScriptSessionManager(){ //绑定一个ScriptSession增加销毁事件的监听器 this.addScriptSessionListener( new DWRScriptSessionListener());
System. out.println( "bind DWRScriptSessionListener"); } }
环境: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"); } }
相关文章推荐
- Unity3d接入IOS内购
- 内存泄露
- "晴天"天气app的开源库逐步学习(五)完结篇
- APK重签名总结
- linux cent os 6.4 建立GRE tunnel
- FS44BOXII的调试心得
- 第十三周(动物这样叫)
- Tomcat与Apache整合(mod_jk)
- Qt4.8.1中 没有找到mingwm10.dll 完美解决
- 我的笔记之Vim
- Data too long for column 'rightAnswer'(字段名称) at row 1
- iOS开发网络篇—HTTP协议
- Log4j 配置和运用
- 如何在android studio上加入OpenCV库
- 2015年第十三周杭电:超级楼梯
- 字符串转time_t
- 如何在android studio上加入OpenCV库
- SpringMVC 常见异常处理
- Android Studio使用9patch图片报错
- JavaScript OOP