`

dwr做comet的完整实现

阅读更多
dwr做comet的完整实现
   场景:页面comet.jsp接受服务器推送的信息并显示,页面action.jsp执行一个动作,调用DwrServer.perform方法,perform方法做某些事,并发送事件信息PerformInfo。NotifyClient监听事件,当接收到PerformInfo后,把PerformInfo的信息发送到comet.jsp页面。这个场景模拟了页面1执行了一个时间比较长或复杂的任务,任务执行情况可以反馈到页面2(比如模式窗口)。
   信息载体PerformInfo.java
package application.comet;

import java.util.Date;

public class PerformInfo {
  private int id;
  private String msg;
  private Date   time;
  /**
   * @return the id
   */
  public int getId() {
    return id;
  }
  /**
   * @param id the id to set
   */
  public void setId(int id) {
    this.id = id;
  }
  /**
   * @return the msg
   */
  public String getMsg() {
    return msg;
  }
  /**
   * @param msg the msg to set
   */
  public void setMsg(String msg) {
    this.msg = msg;
  }
  /**
   * @return the time
   */
  public Date getTime() {
    return time;
  }
  /**
   * @param time the time to set
   */
  public void setTime(Date time) {
    this.time = time;
  }

}
   Spring的事件InfoEvent.java
package application.comet;

import org.springframework.context.ApplicationEvent;

public class InfoEvent extends ApplicationEvent {
   public InfoEvent(Object source){
     super(source);
   }
}

   DwrService.java 执行任务,就是写了100遍PerformInfo,需要实现ApplicationContextAware接口
package application.comet;

import java.util.Date;

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;

public class DwrService implements ApplicationContextAware{
  private ApplicationContext ctx;
  public void setApplicationContext(ApplicationContext ctx) {
    this.ctx = ctx;
  }
  public void perform(){
    for (int i=0;i<100;i++){
      PerformInfo info = new PerformInfo();
      info.setId(i);
      info.setMsg("发送"+i+"信息");
      info.setTime(new Date());
      InfoEvent evt = new InfoEvent(info);
      ctx.publishEvent(evt);
    }
  }

}

NotifyClient.java监听事件,发送信息到页面。实现ApplicationListener,ServletContextAware接口,对中文需要编码
package application.comet;

import java.io.UnsupportedEncodingException;
import java.util.Collection;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import org.springframework.web.context.ServletContextAware;
import org.directwebremoting.ScriptBuffer;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.ServerContext;
import org.directwebremoting.ServerContextFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

public class NotifyClient implements ApplicationListener,ServletContextAware{
  private ServletContext servletContext = null;
  public void setServletContext( ServletContext servletContext )
  {
    this.servletContext = servletContext;
  }   
 
  public void onApplicationEvent(ApplicationEvent event) {
    if (event instanceof InfoEvent) {
      PerformInfo info = (PerformInfo)event.getSource();
      System.out.println(info.getMsg());
      //Collection<ScriptSession> sessions=ctx.getAllScriptSessions();
      ServerContext ctx = ServerContextFactory.get(servletContext );
      Collection<ScriptSession> sessions =
           ctx.getScriptSessionsByPage("/dwrcomet/comet.jsp"); 
      for (ScriptSession session : sessions) {
          ScriptBuffer script = new ScriptBuffer();
          String s=null;
          String s2 = null;
          try {
            s = java.net.URLEncoder.encode(info.getMsg(),"UTF-8");
            s2 = java.net.URLEncoder.encode("通知结束","UTF-8");
          } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
          }
          if (info.getId()<99){
            script.appendScript("putInfo('")
            .appendScript(info.getId()+":"+s)
            .appendScript("');");
          }else{
            script.appendScript("alert(decodeURI('").
                   appendScript(s2).appendScript("'));");
          }
         
          System.out.println(script.toString());
          session.addScript(script);
      }       
    }
  }

}

action.jsp执行任务
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String root = request.getContextPath();
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>doing</title>
   
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">   
<script type='text/javascript' src='<%=root%>/dwr/engine.js'></script>
<script type='text/javascript' src='<%=root%>/dwr/util.js'></script>
<script type='text/javascript' src='<%=root%>/dwr/interface/DwrService.js'></script>
  </head>
 
  <body>
  <input name='action' onclick='DwrService.perform();' type="button" value="行动"/>
  </body>
</html>

comet.jsp接受信息。关键是增加onload="dwr.engine.setActiveReverseAjax(true);",还可以根据user或session id判断是否是自己的信息.
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String root = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"
+request.getServerPort()+root+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
   
    <title>Comet with DWR</title>
   
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">   
  </head>
 
<body onload="dwr.engine.setActiveReverseAjax(true);">
<script type='text/javascript' src='<%=root%>/dwr/engine.js'></script>
<script type='text/javascript' src='<%=root%>/dwr/util.js'></script>
<script type="text/javascript">
    var user = '<%=request.getParameter("user")%>';
   
    function putInfo(data) {
       var d = decodeURI(data);
       var text = dwr.util.getValue('info');      
       dwr.util.setValue('info',text+'\n'+d);
    }
</script>
<br/>
<textarea rows="20" cols="100" id='info'></textarea>
</body>
</html>

applicationContext.xml配置了NotifyClient和DwrService,这两个bean实现了ApplicationContextAware
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
  <bean id="notifyClient" class="application.comet.NotifyClient">
  </bean>
  <bean id="dwrService" class="application.comet.DwrService"></bean>
</beans>

dwr.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC
    "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
    "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
  <allow>
    <create creator="spring" javascript="DwrService">
      <param name="beanName" value="dwrService" />
    </create>
  </allow>
</dwr>


web.xml定义了dwr的comet控制,关键是pollAndCometEnabled=true
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/app*.xml</param-value>
    </context-param>
    <servlet>
        <servlet-name>context</servlet-name>
        <servlet-class>
            org.springframework.web.context.ContextLoaderServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

<!--dwr servlet-->
  <servlet>
    <servlet-name>dwr-invoker</servlet-name>
    <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>pollAndCometEnabled</param-name>
      <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>     
  </servlet>
  <servlet-mapping>
      <servlet-name>dwr-invoker</servlet-name>
      <url-pattern>/dwr/*</url-pattern>
  </servlet-mapping>
</web-app>

运行时要先打开comet.jsp,然后执行action.jsp
分享到:
评论

相关推荐

    DWR_comet_0100.zip_ChatService.js_DWR_comet_0100_comet_dwr SPRIN

    DWR的Comet技术正是实现了这种功能,通过长时间连接(Long Polling)或流式传输(Streaming)等方法,使得服务器可以在有新消息时即时通知客户端。 `ChatService.js`是这个聊天程序中客户端部分的关键脚本,它包含...

    DWR comet的完整实现.pdf

    ### DWR Comet 的完整实现分析 #### 一、引言 DWR (Direct Web Remoting) 是一种简化Ajax开发的框架,它使得JavaScript能够直接调用服务器端的Java方法,从而实现了更为流畅的用户交互体验。Comet技术则是一种允许...

    dwr comet的MyEclipse工程,可直接运行

    标题 "dwr comet的MyEclipse工程,可直接运行" 提供了我们今天要讨论的核心内容,即一个基于DWR...同时,通过解压并研究工程中的文件,你可以深入理解DWR和Comet的实现原理,以及如何在MyEclipse中进行配置和调试。

    dwr_comet_im.rar_DEMO_comet.tld_java comet

    在这个"**dwr_comet_im.rar_DEMO_comet.tld_java comet**"的压缩包中,包含了一个关于DWR实现Comet技术的DEMO,以及一个名为"DWR的comet技术实现及时通讯原理.docx"的文档,这将帮助我们理解如何利用DWR和Comet实现...

    用DWR的comet推,实现多人聊天室

    DWR支持Comet模式,可以用来实现实时的服务器到客户端数据推送。 3. **Spring框架整合DWR**: - 在Spring应用中集成DWR,需要在`web.xml`中配置`DwrListener`监听器和`DwrServlet`,以便启动DWR服务并加载Spring上...

    Spring整合DWR comet 实现无刷新 多人聊天室代码整理

    Spring整合DWR(Direct Web Remoting)和Comet技术,是一种高效的实现Web应用程序实时通信的解决方案,特别适用于创建如多人聊天室这样的实时交互应用。在这个项目中,Spring作为后端框架,负责业务逻辑处理和控制...

    用DWR comet+Spring实现服务器推送的例子--网页聊天室

    标题中的“用DWR comet+Spring实现服务器推送的例子--网页聊天室”涉及到的是Web开发中的实时通信技术。DWR(Direct Web Remoting)是一个开源Java库,它允许JavaScript在浏览器和服务器之间进行直接的、安全的远程...

    dwr-comet.zip_DEMO_comet_dwr comet_dwr comet_消息推送 java

    实现Comet消息推送功能,根据登陆人定向推送,解决刷新页面原有ScriptSession不能及时销毁的问题,DEMO比较简陋,请先进入login.jsp页面登陆。根据登陆名称判断推送目标,可登陆多个用户进行测试。

    DWR+JAVA进行web消息推送dwr-comet.zip

    在DWR中,Comet技术是实现长时间连接和实时数据推送的关键。 首先,我们需要了解Comet技术的基本概念。Comet是一种Web编程模式,用于实现在服务器向客户端推送数据时保持持久连接。传统的HTTP协议是基于请求-响应...

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

    8. **DWR Comet**: `dwr-comet`可能指的是DWR的Comet技术,这是一种长连接技术,可以让服务器主动推送数据到客户端,实现双向通信。DWR的Comet支持可以与Spring的事件驱动模型结合,创建实时更新的应用。 这个资料...

    DWR学习资料

    DWR学习资料 :DWR 3.0 上传文件.txt DWR3.0反向Ajax示例.txt DWR3.0学习笔记.txt DWR3.0学习网址.txt dwr分页.doc DWR分页代码.doc DWR中文文档.doc DWR中文文档.pdf dwr做comet的完整实现.doc Spring整合DWR comet ...

    DWR comet 长连接实现在线对话-简易版

    NULL 博文链接:https://happysoul.iteye.com/blog/1313069

    Spring整合DWR comet 实现无刷新 多人聊天室

    Spring整合DWR(Direct Web Remoting)以实现Comet技术,是构建实时、无刷新的多人聊天室的一种高效方法。这种技术允许服务器向客户端推送数据,而无需客户端频繁发起请求,从而大大提升了用户体验。下面我们将深入...

    dwr笔记 dwr自学资料

    1. **反向Ajax**:DWR实现了一种反向Ajax(Reverse Ajax)技术,使得服务器能够主动向客户端推送数据,而不仅仅是响应客户端的请求。 2. **JavaScript与Java的桥接**:DWR通过动态生成JavaScript库来映射Java对象和...

    dwr comet 使用示例,使用spring作为后台的管理容器

    在这个示例中,我们将探讨如何结合DWR 3.0和Spring 2.5框架来实现Comet交互。** **1. DWR(Direct Web Remoting)** DWR使得Web开发者能够轻松地在浏览器和服务器之间交换数据。它通过创建JavaScript对象,这些对象...

    dwr3.0+spring2.5实现Comet消息推送DEMO

    实现Comet消息推送功能,根据登陆人定向推送,解决刷新页面原有ScriptSession不能及时销毁的问题,DEMO比较简陋,请先进入login.jsp页面登陆。根据登陆名称判断推送目标,可登陆多个用户进行测试。

    dwr 反推技术

    在"通过dwr反推技术实现web聊天无刷新跟新技术"这个主题中,我们将深入探讨DWR如何用于构建实时聊天应用,并结合Comet技术来优化用户体验。 首先,DWR的工作原理基于Ajax(Asynchronous JavaScript and XML),但...

    DWR的Comet测试,又称反Ajax(ReverseAjax),使用DWR3.0 + Spring 2.5

    comet.jsp就是聊天室接收消息的界面,action.jsp就是发送消息的界面,为了更好的说明问题,将接收界面和发送界面放在两个窗口中, 测试时同时可以打开多个接收界面和发送界面, 执行发送界面的发送按钮会发现在所有...

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

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

    DWR推送技术大全 dwr推送聊天实例

    总的来说,DWR推送技术通过Comet实现了高效的服务器到客户端的数据推送,简化了实时Web应用的开发。结合提供的源码示例"j-jetty-dwr-comet-src",开发者可以深入理解DWR的工作原理,并学习如何在实际项目中应用这项...

Global site tag (gtag.js) - Google Analytics