当前位置:首页 > 开发 > Web前端 > Ajax > 正文

DWR3-ReverseAjax-半推实现

发表于: 2010-01-05   作者:曾经de迷茫   来源:转载   浏览次数:
摘要: 第一次发帖,直奔主题。   首先,配置web.xml加入参数开启ReverseAjax <servlet> <servlet-name>dwr</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class&g

第一次发帖,直奔主题。

 

首先,配置web.xml加入参数开启ReverseAjax

<servlet>
		<servlet-name>dwr</servlet-name>
		<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
		<init-param>
			<param-name>activeReverseAjaxEnabled</param-name>
			<param-value>true</param-value>
		</init-param>
		<init-param>
		    <param-name>initApplicationScopeCreatorsAtStartup</param-name>
		    <param-value>true</param-value>
	  	</init-param>
	  	<init-param>
			<param-name>org.directwebremoting.extend.ScriptSessionManager</param-name>
			<param-value>com.cssweb.business.dwr.CustomSSManager</param-value>
		</init-param>
	  	<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>dwr</servlet-name>
		<url-pattern>/dwr/*</url-pattern>
	</servlet-mapping>

   注意红色部分,即半推实现方式:加入自己的ScriptSessionManager.由于dwr每次刷新激活ReverseAjax的页面都会创建一个ScriptSession,这里要自己管理它以便实现半推,同时和HttpSession做同步,以最后请求的ScriptSession为准,销毁之前的ScriptSession。

下面就是CustomSSManager:

import java.util.Collection;

import javax.servlet.http.HttpSession;

import org.directwebremoting.ScriptSession;
import org.directwebremoting.WebContextFactory;
import org.directwebremoting.event.ScriptSessionEvent;
import org.directwebremoting.event.ScriptSessionListener;
import org.directwebremoting.impl.DefaultScriptSession;
import org.directwebremoting.impl.DefaultScriptSessionManager;

import com.cssweb.business.user.pojo.User;
import com.cssweb.constans.CONST;

/**
 * 
 * 扩展ScriptSessionManager.
 * @author congyy
 * @createTime   2010-1-3           
 */
public class CustomSSManager extends DefaultScriptSessionManager {
        public static final String SS_ID = "DWR_ScriptSession_Id";
        public CustomSSManager() {
             addScriptSessionListener(new ScriptSessionListener(){
                public void sessionCreated(ScriptSessionEvent event) {
                        ScriptSession scriptSession = event.getSession(); // 获取新创建的SS
                        HttpSession httpSession  = WebContextFactory.get().getSession();// 获取构造SS的用户的HttpSession
                        User user = (User)httpSession.getAttribute(CONST.SESSION_USER);
                        if(user ==null){
                                scriptSession.invalidate();
                                httpSession.invalidate();
                                return;
                        }
                        String ssId = (String) httpSession.getAttribute(SS_ID);
                        if (ssId != null) {
                                DefaultScriptSession old=sessionMap.get(ssId);
                               if(old!=null)CustomSSManager.this.invalidate(old);
                        }
                        httpSession.setAttribute(SS_ID, scriptSession.getId());
                        scriptSession.setAttribute("userId", user.getId());//此处将userId和scriptSession绑定
                }
                public void sessionDestroyed(ScriptSessionEvent event) {}
             });
           ReqReverseAjax.manager=this;//将自己暴露ReverseAjax业务处理类

        }
        public Collection getAllScriptSessions(){
                return sessionMap.values();
        }
}

 关于上述代码 :User为POJO类,CONST为常量放置接口,如session中的用户KEY.

 然后是ReverseAjax业务处理类:

package com.cssweb.business.dwr;

import java.util.Collection;
import java.util.Observable;
import java.util.Observer;

import org.directwebremoting.ScriptBuffer;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.extend.ScriptSessionManager;

import com.cssweb.business.user.pojo.UserReq;
import com.cssweb.business.user.service.IUserReqService;


/**
 * Observer实现,监听事件,然后推送给指定用户.
 */
public class ReqReverseAjax implements Observer{
  static ScriptSessionManager manager ;
  public ReqReverseAjax() {
          IUserReqService.GCZ.addObserver(this);//注册观察者
  }
  public void update(Observable o, Object arg) {
        final UserReq req = (UserReq) arg;
        final Long userId = req.getToId();//获取事件要通知的用户的id
        Collection<ScriptSession>  coll = manager.getAllScriptSessions();//获取当前所有ScriptSession
        for(ScriptSession ss : coll) {
             if(ss.getAttribute("userId").equals(userId)){
                     ss.addScript(new ScriptBuffer().appendScript("update").appendScript("(").appendData(req).appendScript(");"));//找到符合要求的,推送事件
                     break;
             }
        }
   }
}

 然后在WEB-INF/下丢一个dwr.xml:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd">
<dwr>
  <allow>
    <create creator="new" scope="application">
      	<param name="class" value="com.cssweb.business.dwr.ReqReverseAjax"/>
    </create>
    <convert converter="bean" match="com.cssweb.business.user.pojo.UserReq"/>
  </allow>
</dwr>

 至此,服务端配置完全结束,实现半推。

 页面上实现如下:

  index.jsp,加上框架,减少对reverseAjax.html页面的刷新量

<%@ page  pageEncoding="UTF-8"%>
<frameset rows="*" cols="0,*" border="0">
	<frame src="${contextPath }/jsp/ajax/user/reverseAjax.html#${contextPath }" frameborder="0">
	<frame src="${contextPath }/jsp/user/index.do"/>
</frameset>
 

reverseAjax.html:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript">
	 function update(req) {
	 	//在这里处理服务器推过来的信息
	 }
	 var url = self.location.href;
	 var ctx = url.slice(url.indexOf('#')+1);
	 document.write("<script src='"+ctx+"/dwr/engine.js'><\/script>"); 
</script>
</head>
<body onload="dwr.engine.setActiveReverseAjax(true)">
</body>
</html>

 好了,至此半推结束.

DWR3-ReverseAjax-半推实现

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
最近一直对.net framework中,虚方法的调用是如何实现这个问题有些疑惑,在看了Essential .Net关于M
Stripes是一个以让程序员的web开发简单而高效为准则来设计的基于动作的开源Java web框架。本文将介
  前言 经过一段时间的编写,终于有出来一个稳定的版本,期间考虑了多种解决方案也偷偷学了下园子
来源: 深入理解Java内存模型(五)——锁 java的CAS同时具有 volatile 读和volatile写的内存语义,
一. AVL概念: 对于一颗BST,其中每个节点的左右子树高度差均不超过1的平衡二叉搜索树,就叫做AVL树
webservice的实现 WebService更多是一种标准,而不是一种具体的技术。不同的平台,不同的语言大都提
经过一段时间的研究学习,对于Hash有了更深一步的了解和认识,下面谈谈一些基本概念及自己设计的一
ECMAScript、DOM 和 BOM 尽管 ECMAScript 是一个重要的标准,但它并不是 JavaScript 唯一的部分,当
前文中 http://winseclone.iteye.com/blog/1774307 介绍了使用Properties的方法。但是TableTree 形
了解了JavaScript是干什么的《 对一些词的理解 》,下面该知道它是怎么实现的。 一个完整的JavaScri
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号