`
luciesfly
  • 浏览: 70669 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

DWR3-ReverseAjax-半推实现

阅读更多
首先,配置web.xml加入参数开启ReverseAjax
Xml代码

   1. <servlet> 
   2.         <servlet-name>dwr</servlet-name> 
   3.         <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> 
   4.         <init-param> 
   5.             <param-name>activeReverseAjaxEnabled</param-name> 
   6.             <param-value>true</param-value> 
   7.         </init-param> 
   8.         <init-param> 
   9.             <param-name>initApplicationScopeCreatorsAtStartup</param-name> 
  10.             <param-value>true</param-value> 
  11.         </init-param> 
  12.         <init-param> 
  13.             <span style="color: rgb(255, 0, 0);"><param-name>org.directwebremoting.extend.ScriptSessionManager</param-name> 
  14.             <param-value>com.cssweb.business.dwr.CustomSSManager</param-value></span> 
  15.         </init-param> 
  16.         <load-on-startup>1</load-on-startup> 
  17.     </servlet> 
  18.     <servlet-mapping> 
  19.         <servlet-name>dwr</servlet-name> 
  20.         <url-pattern>/dwr/*</url-pattern> 
  21.     </servlet-mapping> 

<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:
Java代码

   1. import java.util.Collection; 
   2.  
   3. import javax.servlet.http.HttpSession; 
   4.  
   5. import org.directwebremoting.ScriptSession; 
   6. import org.directwebremoting.WebContextFactory; 
   7. import org.directwebremoting.event.ScriptSessionEvent; 
   8. import org.directwebremoting.event.ScriptSessionListener; 
   9. import org.directwebremoting.impl.DefaultScriptSession; 
  10. import org.directwebremoting.impl.DefaultScriptSessionManager; 
  11.  
  12. import com.cssweb.business.user.pojo.User; 
  13. import com.cssweb.constans.CONST; 
  14.  
  15. /**
  16.  * 
  17.  * 扩展ScriptSessionManager.
  18.  * @author congyy
  19.  * @createTime   2010-1-3           
  20.  */ 
  21. public class CustomSSManager extends DefaultScriptSessionManager { 
  22.         public static final String SS_ID = "DWR_ScriptSession_Id"; 
  23.         public CustomSSManager() { 
  24.              addScriptSessionListener(new ScriptSessionListener(){ 
  25.                 public void sessionCreated(ScriptSessionEvent event) { 
  26.                         ScriptSession scriptSession = event.getSession(); // 获取新创建的SS 
  27.                         HttpSession httpSession  = WebContextFactory.get().getSession();// 获取构造SS的用户的HttpSession 
  28.                         User user = (User)httpSession.getAttribute(CONST.SESSION_USER); 
  29.                         if(user ==null){ 
  30.                                 scriptSession.invalidate(); 
  31.                                 httpSession.invalidate(); 
  32.                                 return; 
  33.                         } 
  34.                         String ssId = (String) httpSession.getAttribute(SS_ID); 
  35.                         if (ssId != null) { 
  36.                                 DefaultScriptSession old=sessionMap.get(ssId); 
  37.                                if(old!=null)CustomSSManager.this.invalidate(old); 
  38.                         } 
  39.                         httpSession.setAttribute(SS_ID, scriptSession.getId()); 
  40.                         scriptSession.setAttribute("userId", user.getId());//此处将userId和scriptSession绑定 
  41.                 } 
  42.                 public void sessionDestroyed(ScriptSessionEvent event) {} 
  43.              }); 
  44.            ReqReverseAjax.manager=this;//将自己暴露 ReverseAjax业务处理类 
  45.  
  46.         } 
  47.         public Collection getAllScriptSessions(){ 
  48.                 return sessionMap.values(); 
  49.         } 
  50. } 

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业务处理类:
Java代码

   1. package com.cssweb.business.dwr; 
   2.  
   3. import java.util.Collection; 
   4. import java.util.Observable; 
   5. import java.util.Observer; 
   6.  
   7. import org.directwebremoting.ScriptBuffer; 
   8. import org.directwebremoting.ScriptSession; 
   9. import org.directwebremoting.extend.ScriptSessionManager; 
  10.  
  11. import com.cssweb.business.user.pojo.UserReq; 
  12. import com.cssweb.business.user.service.IUserReqService; 
  13.  
  14.  
  15. /**
  16.  * Observer 实现,监听事件,然后推送给指定用户.
  17.  */ 
  18. public class ReqReverseAjax implements Observer{ 
  19.   static ScriptSessionManager manager ; 
  20.   public ReqReverseAjax() { 
  21.           IUserReqService.GCZ.addObserver(this);//注册观察者 
  22.   } 
  23.   public void update(Observable o, Object arg) { 
  24.         final UserReq req = (UserReq) arg; 
  25.         final Long userId = req.getToId();//获取事件要通知的用户的id 
  26.         Collection<ScriptSession>  coll = manager.getAllScriptSessions();//获取当前所有ScriptSession 
  27.         for(ScriptSession ss : coll) { 
  28.              if(ss.getAttribute("userId").equals(userId)){ 
  29.                      ss.addScript(new ScriptBuffer().appendScript("update").appendScript("(").appendData(req).appendScript(");"));//找到符合要求的,推送事件 
  30.                      break; 
  31.              } 
  32.         } 
  33.    } 
  34. } 

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代码

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

<?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页面的刷新量
Html代码

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

<%@ 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代码

   1. <html> 
   2. <head> 
   3. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
   4. <script type="text/javascript"> 
   5.      function update(req) { 
   6.         // 在这里处理服务器推过来的信息 
   7.      } 
   8.      var url = self.location.href; 
   9.      var ctx = url.slice(url.indexOf('#')+1); 
  10.      document.write("<script src='"+ctx+"/dwr/engine.js'><\/script>");  
  11. </script> 
  12. </head> 
  13. <body onload="dwr.engine.setActiveReverseAjax(true)"> 
  14. </body> 
  15. </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>

好了,至此半推结束.
分享到:
评论
2 楼 jroad 2010-06-21  
还有这个DefaultScriptSession 和scriptSession有什么不同?如获LZ指教,不用感激.最近有个项目有用,所以有点急.
1 楼 jroad 2010-06-21  
有点不明白,朋友的sessionmap从那时来的,请教下.
   DefaultScriptSession old=sessionMap.get(ssId);  

相关推荐

    即时通讯DWR Reverse Ajax

    DWR(Direct Web Remoting)是实现这种功能的一种技术,尤其以其独特的Reverse Ajax特性在服务器推送(Server-Sent Events, SSE,也常被称为Comet技术)领域中备受关注。下面我们将深入探讨DWR Reverse Ajax的工作...

    dwr 2.0(reverse ajax)实现推的web IM例子

    总的来说,通过这个例子,你可以学习到如何使用DWR 2.0来构建一个实时的Web应用,特别是如何利用Reverse Ajax实现服务器到客户端的数据推送。这不仅加深了对DWR的理解,还对Web开发中的实时通信有了实际操作的经验。...

    dwr3ReverseAjax示例

    在这个“dwr3ReverseAjax示例”中,我们将深入探讨如何利用DWR 3.x版本来构建一个基于Ajax的简单Web聊天应用。 首先,DWR的核心功能是通过HTTP协议实现在客户端JavaScript和服务器端Java之间的远程方法调用(Remote...

    服务器推--DWR中的push机制-Reverse_Ajax.docx

    DWR(Direct Web Remoting)是一个开源Java库,它实现了服务器推功能,尤其是其2.0版本开始引入的push机制。 1. **Polling(轮询)** 轮询是最基础的模拟服务器推的方式。客户端以一定的频率(如几秒一次)向...

    Dwr 官方Reverse Ajax Demo

    3. **与Spring WebFlux**:Spring WebFlux是Spring Framework的一部分,支持反应式编程模型,也支持服务器向客户端推送数据,但DWR更专注于Ajax的简单实现。 总的来说,DWR是实现Reverse Ajax的一个强大工具,它...

    DWR3实现服务器端向客户端精确推送消息

    要实现服务器端向客户端的精确推送,DWR3提供了“Reverse Ajax”或者称为“Comet”技术。Comet是一种使服务器能够长时间保持HTTP连接开放的技术,以便在需要时向客户端发送更新。这种长轮询或流式传输的方式,使得...

    dwr,jar和dwr-noncla.jar

    4. **Reverse Ajax**: DWR提供了逆向AJAX功能,即服务器可以主动向客户端推送数据,而无需客户端触发。 接下来,`dwr-noncla.jar`可能包含非版权许可的版本或者特定的构建,用于某些特殊环境或避免版权问题。具体...

    dwr3消息推送

    - DWR3支持两种推送模式:Polling(轮询)和Reverse AJAX(逆向AJAX,也称为Comet)。 - Polling是客户端定期向服务器发送请求检查新消息,而Reverse AJAX则是在服务器端保持一个开放的HTTP连接,直到有新消息时才...

    dwr 实现推技术 实例

    1. **反向Ajax(Reverse Ajax)**:DWR的核心功能之一是实现反向Ajax,即服务器可以主动向客户端推送数据,而不仅仅是响应客户端的请求。这使得Web应用能够实现类似桌面应用的即时更新效果。 2. **安全机制**:DWR...

    dwr推技术实现服务器推送数据

    DWR的独特之处在于它的“反转Ajax”(Reverse Ajax)概念,即服务器可以主动向客户端推送数据,而不仅仅是响应客户端的请求。这在股票实时显示等需要即时更新信息的应用场景中非常有用。 在"股票实时显示"的应用...

    dwr-2.0.2-src.zip

    1. **反向Ajax(Reverse Ajax)**:DWR通过创建JavaScript对象来映射服务器端的Java类和方法,使得JavaScript可以实时调用这些方法,实现了双向通信,即服务器能够主动推送数据到客户端。 2. **自动序列化与反序列...

    DWR让Ajax如此简单

    - **Reverse Ajax(反向Ajax)**: DWR实现了反向Ajax,即服务器可以主动推送数据到客户端,而不仅仅是响应客户端的请求。 - **Caching(缓存)**: DWR支持缓存服务器端的响应,提高性能,减少网络流量。 ### 2. ...

    dwr-任何java类-测试

    3. **反向Ajax(Reverse Ajax)**:DWR实现了反向Ajax,使得服务器可以主动推送数据到客户端,而不仅仅是响应客户端的请求。 **使用DWR的步骤:** 1. **引入依赖**:将DWR的JAR文件添加到项目类路径中,并在Web应用...

    dwr3与ssh 开发的webim

    在本项目中,DWR3版本被用来实现Reverse Ajax和服务器推送技术。Reverse Ajax是指服务器主动向客户端推送数据,而不是等待客户端发起请求。DWR3通过建立持久的HTTP连接来实现这一功能,使得服务器能够及时将新消息推...

    DWR框架的例子-ajax

    1. **Reverse Ajax**:DWR的核心特性,允许服务器主动向客户端推送数据,而不仅仅是响应客户端的请求。 2. **Batching**:DWR支持批量调用,减少网络通信次数,提高性能。 3. **Caching**:缓存机制可以存储重复的...

    dwr-3.0.0.rar

    3. **逆向AJAX(Reverse AJAX)**:DWR的核心特性之一,它通过长轮询、IFrame或XMLHttpRequest等技术实现实时双向通信,让服务器可以主动推送数据到客户端。 4. **安全性**:DWR提供了一套安全机制,包括IP过滤、...

    dwr服务器推送,dwr.jar,推送,服务器ajax,dwr服务推送例子

    - **Reverse Ajax**:DWR支持真正的服务器推送,即当服务器有新数据时,会主动推送到客户端,而不需要客户端发起请求。这通常是通过HTTP长连接或WebSocket实现的。 - ** Comet**:DWR也支持Comet技术,这是一种模拟...

    dwr与spring整合的相关资料收集 包括一个例子 dwr-comet

    设置`dwr-engine-filter`和`dwr-reverse-ajax-filter`,确保DWR引擎正常工作。 2. **创建DWR接口**: 在服务器端,定义一个Java接口,其中包含所有需要在客户端调用的方法。这些方法将被DWR自动暴露给JavaScript。 ...

    使用dwr2.0实现服务器推客户端

    虽然示例中没有直接列出DWR的相关配置,但在实际应用中,你需要添加一个`dwr-engine-filter`和`dwr-reverse-ajax-filter`过滤器映射,以及对应的`dwr-servlet`配置。这些配置允许DWR运行并处理JavaScript与Java之间...

Global site tag (gtag.js) - Google Analytics