`
awaitdeng
  • 浏览: 216495 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

DWR推送技术运用

    博客分类:
  • DWR
 
阅读更多
dwr推送技术的运用

先说说环境 主要DWR3.0 spring3 springMVC hibernate 
系统目标 实现服务端主动向客户端推送数据 ,只是客户端打个某个页面,服务端定时向客户端推送新数据刷新客户端页面显示

集成spring&MVC +hibernate后 配置DWR的步骤如下:
按惯例从WEB.xml讲起 
添加DWR servlet 
   <listener>
   <listener-class>com.gzeport.app.gps.dwr.AddScriptSessionListener</listener-class>
   </listener>
///ScriptSession将页面每个session放入一个map
   
  <!--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.xml过滤器配置好后  编写推送程序
 1---实体对象类 这里随便的示例
import java.util.Date;
public class VehicleInfo {
 
  private   Long   vehicleId;
  private  String  vTKey;
  private  String    plate;
  private  Date     recvtime;
  private  Date  gpstime;
  private  String  lat;
  private  String  lon;
  private  String  height;
  private  String  speed;
  private  String  gpsSpeed;
  private  String  dir;
  private  String  mile;
  private  String  eff;
  private  String  alarm;
  private  String  run;
  private  String  statusChars;
  private  String  mode;
  private  String  tagChar;
  private  String protocol;
  private  String provider;
  
public Long getVehicleId() {
 return vehicleId;
}
public void setVehicleId(Long vehicleId) {
 this.vehicleId = vehicleId;
}
------
------这里省去好多GET,SET方法
------
public void setProvider(String provider) {
 this.provider = provider;
}
}
 
 2---ScriptSessionListener   ScriptSession监听类 AddScriptSessionListener.java
import java.util.HashMap;
import java.util.Map;

import org.directwebremoting.Container;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.ServerContextFactory;
import org.directwebremoting.WebContext;
import org.directwebremoting.WebContextFactory;
import org.directwebremoting.event.ScriptSessionEvent;
import org.directwebremoting.event.ScriptSessionListener;
import org.directwebremoting.extend.ScriptSessionManager;

public class AddScriptSessionListener implements ScriptSessionListener {
 public static Map<String, ScriptSession> sc=new HashMap<String, ScriptSession>();
 
 public void sessionCreated(ScriptSessionEvent ev) {
  WebContext webContext = WebContextFactory.get(); 
  sc.put(webContext.getSession().getId(), ev.getSession());
  System.out.println("add --------->"+ev.getSession().getId());
 
 }

 public void sessionDestroyed(ScriptSessionEvent ev) {
  System.out.println("remove --------->"+ev.getSession().getId());
 }

}


 3---推送程序类 DwrGpsHelper.java 
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;
import org.directwebremoting.ScriptBuffer;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.WebContext;
import org.directwebremoting.WebContextFactory;
import org.directwebremoting.proxy.dwr.Util;
import com.gzeport.app.gps.dwr.AddScriptSessionListener;
import com.gzeport.app.gps.pojo.VehicleInfo;
import com.gzeport.app.gps.thread.ShipDataStore;

public class DwrGpsHelper {   
    private static ArrayList<VehicleInfo> messages = new ArrayList<VehicleInfo>();   
    private static ReentrantLock lock = new ReentrantLock(); //JDK5锁   
    
    private ShipDataStore shipDataStore = null;
   
 public void addMessage(){   
        try{   
            lock.lock();  
            System.out.println("进入调度程序..........");
            messages = (ArrayList<VehicleInfo>) shipDataStore.getShipListData();
           System.out.println("取得数据:"+messages.size());
            for(VehicleInfo vehicleInfo :messages){
             if(vehicleInfo!=null){
              System.out.println("准备推送数据:"+vehicleInfo.getVTKey());
             }
            }
        }catch(Exception ex){   
            ex.printStackTrace();   
        }finally{   
            lock.unlock();   
        }             
         Collection<ScriptSession> sessions =new LinkedList() ;
        
        Map map=AddScriptSessionListener.sc;
      Iterator<String> it = map.keySet().iterator();
      StringBuffer sb = new StringBuffer();
      int index =0;
      if (it!=null){
       while(it.hasNext()){
        String key1 = it.next();
        sessions.add((ScriptSession)map.get(key1));
       }
      }
      System.out.println("SSS-->"+sessions.size());
        if(sessions!=null&&sessions.size()>0){
         
        }else{
         System.out.println("sessions is null");         
        }
           Util utilAll = new Util(sessions);                 
           //执行客户端脚本   
           ScriptBuffer script = new ScriptBuffer();   
           script.appendScript("clientFunction(")   

            .appendData(messages) 
             .appendScript(");");   
              
           for(ScriptSession session: sessions){   
               session.addScript(script);   
           }                 
           //更新这些脚本session的一些元素   
         //  utilAll.removeAllOptions("messages");   
         //  utilAll.addOptions("messages", messages, "vTKey", "statusChars");
       }      
 public ShipDataStore getShipDataStore() {
  return shipDataStore;
 }
  
 public void setShipDataStore(ShipDataStore shipDataStore) {
  this.shipDataStore = shipDataStore;
 }
  
}  

4-----DWR.xml配置文件的配置 
<!-- 业务处理类  交给spring--> 
 <create creator="spring" javascript="dwrGpsHelper" scope="application">
   <param name="beanName" value="dwrGpsHelper"/> 
 </create>

 <!--     convert将bean的集合变成javascript中的对象数组-->
 
 <convert converter="bean" match="com.gzeport.app.gps.pojo.VehicleInfo">
  <param name="include" value="alarm,dir,eff,mode,gpsSpeed,gpstime,height,lat,lon,mile,plate,protocol,provider,recvtime,
         run,speed,statusChars,tagChar,vehicleId,vTKey"/>
 </convert>           
   </allow>
5-- spring bean 配置 
     <bean id="dwrGpsHelper" class="com.gzeport.app.gps.dwr.controller.DwrGpsHelper"> 
      <property name="shipDataStore">
       <ref bean="shipDataStore" />
      </property> 
     <dwr:remote javascript="dwrGpsHelper">  
       <dwr:include method="addMessage" />     
     </dwr:remote>
    </bean>
    
6----JSP页面 showdata.jsp
<%@ page language="java" pageEncoding="UTF-8"%>  
<%@ page import="org.directwebremoting.ServerContextFactory" %>
<%@ page import="org.directwebremoting.Container" %>
<%@ page import="com.gzeport.app.gps.dwr.AddScriptSessionListener" %>
<%@ page import="org.directwebremoting.extend.ScriptSessionManager" %>
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 
%> 
<%String root=request.getContextPath();%> 
<%
  //添加监听器
    Container container = ServerContextFactory.get().getContainer();  
 ScriptSessionManager manager = container.getBean(ScriptSessionManager.class);  
 manager.addScriptSessionListener(new AddScriptSessionListener()); 
  %>
<html>  
  <head>
<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/dwrVehicleInfoService.js'></script>  -->
  <script type='text/javascript' src='<%=root%>/dwr/interface/dwrGpsHelper.js'></script>
</head>  
     
  <!-- 通过 dwr.engine.setActiveReverseAjax(true); 启动该页面的Reverse Ajax功能  -->  
  <body onload="dwr.engine.setActiveReverseAjax(true);dwr.engine.setErrorHandler(function(){})">   //反转需要加上这两个 
<!--    <p>输入信息: <input id="text" onkeypress="dwr.util.onReturn(event, getMessage)" />    -->
<!--    <input type="button" value="Send" onclick="getMessage()()" /></p>  -->
<!--  -->
 <p>从后台推送回的数据: </p>
<!-- <input id="text" />  -->
    <script type="text/javascript">
     function sendMessage() {   
            dwrVehicleInfoService.perform();   
        } 
         function putInfo(serverdata){
        for(var i =0;i<serverdata.length;i++){
       // alert(serverdata[i]);
         var obj =dwr.util.toDescriptiveString(serverdata[i], 20);
        // alert(dwr.util.toDescriptiveString(serverdata[i], 20));
        }
      // alert(serverdata.length);
        }        
         function clientFunction(serverdata){
         for(var i =0;i<serverdata.length;i++){
        // alert(serverdata[i]);
          var obj =dwr.util.toDescriptiveString(serverdata[i], 20);
         // alert(dwr.util.toDescriptiveString(serverdata[i], 20));
         }
       alert(serverdata);
        }    
   </script>       
    <hr/>  
<!--    <select id="messages"></select>  -->
     <div id="showdata">
     </div>
    
  </body>  
</html>  

7-----配置一个调度器 定时推送一次数据到页面 

 <!--Quartz -->
 <!-- 调度获取数据 -->
 <bean id="getDwrGpsHelperJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
  p:targetObject-ref="dwrGpsHelper"  
  p:targetMethod="addMessage" />
 
 <bean id="triggergetGpsShipDataCleaner" class="org.springframework.scheduling.quartz.SimpleTriggerBean"
  p:jobDetail-ref="getDwrGpsHelperJobDetail"
  p:startDelay="20000"
  p:repeatInterval="15000" />
 
 <!-- Spring触发工厂 -->  
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
       <property name="triggers">  
            <list>  
               <ref bean="triggergetGpsShipDataCleaner"/>  
               <!-- ....下面可以继续添加其他触发器 -->  
           </list>  
      </property>  
    </bean>  
    
    
    至此 大致完成dwr推送程序的示例   将每隔15000纳秒推送一次数据 
  
分享到:
评论
4 楼 路温舒 2016-03-22  
后台数据有变化的时候是怎么自动推送到前台的?
3 楼 xiaolang078 2015-02-05  
我的qq邮箱:374958285@qq.com

        qq:374958285

希望楼主联系方式留一下,看了上面的例子dwrVehicleInfoService这个类好像没有,希望楼主看到了尽快回我,谢谢!
2 楼 xinpei123 2014-09-24  
ShipDataStore 具我理解应该是楼主查询数据库的一个类如dao类
1 楼 android飘雨 2014-07-22  
ShipDataStore 这个类我什么不发布出?

相关推荐

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

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

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

    总结来说,DWR推技术是实现服务器主动向客户端推送数据的一种高效方式,尤其适用于需要实时数据更新的应用,如股票实时显示。通过反转Ajax,DWR简化了开发流程,提高了用户体验,是现代Web开发中的一个重要工具。

    DWR服务器推送技术(实时)

    DWR的核心特性是它支持AJAX(Asynchronous JavaScript and XML)以及服务器推送技术,极大地提高了Web应用的用户体验。 **服务器推送技术**: 传统的HTTP协议是基于请求-响应模型的,即客户端发起请求,服务器响应...

    dwr推送技术

    在实际项目中,根据`dwrpush`这个文件名,我们可以推测这是一个关于DWR推送技术的示例或配置文件,可能包含了如何设置和使用DWR推送功能的代码示例。通过对这个文件的深入学习和实践,可以更好地理解和掌握DWR3的推...

    DWR推送技术

    在本项目的背景下,由于HTML5的WebSocket不适用于所有浏览器,特别是对旧版IE的支持,因此选择了DWR作为实现推送技术的工具。DWR的核心思想是建立一个持久的连接(long-polling)来实现实时数据推送。这种机制下,...

    dwr推送及js访问java代码

    在“dwr推送及js访问java代码”的项目中,我们可以看到如何利用DWR进行双向通信。首先,DWR的核心组件包括`DWR Engine`、`Servlet`和`AutoBean`等。`DWR Engine`负责在客户端和服务器之间建立连接,`Servlet`处理...

    使用dwr+spring实现消息推送

    总的来说,结合DWR和Spring,我们可以构建出一个高效、可扩展的消息推送系统,使得Web应用能够实时地与用户互动,提升用户体验。在实际项目中,还需要考虑安全性、错误处理、性能监控等方面,确保系统的稳定性和可靠...

    基于dwr推送技术的聊天室

    总结来说,这个"基于DWR推送技术的聊天室"项目展示了如何利用DWR实现实时的双向通信,创建一个互动性强的Web应用。通过理解DWR的工作机制和配置,开发者可以构建更多类似的应用,如实时通知、协作工具等。在实践中,...

    DWR消息推送简单实例

    本实例主要关注DWR的消息推送功能,这在创建实时更新的应用如聊天室、股票报价或在线游戏等场景中非常有用。 1. **DWR框架概述** DWR框架的核心是将Java对象暴露给JavaScript,使得前端可以像操作本地对象一样操作...

    实现 Dwr 服务器推送

    DWR (Direct Web Remoting) 是一种开源的Java库,用于在Web应用...同时,随着WebSocket等技术的发展,DWR的服务器推送功能可能逐渐被取代,但在一些老项目或对兼容性有较高要求的场景下,DWR仍然是一种有效的解决方案。

    dwr推技术官方实例

    标题中的“dwr推技术官方实例”是指DWR提供的关于其推技术的实际操作示例,这些示例可能涵盖了DWR 2.0.4及以上版本的最新功能。由于高质量的实例资源在网络上可能不易找到,所以这份实例集合显得尤为宝贵。 描述中...

    dwr实现消息精确推送

    ### dwr实现消息精确推送详解 #### 一、前言 Direct Web Remoting(DWR)是一种开源技术,它使得JavaScript可以直接调用服务器端的Java方法成为可能,从而简化了客户端与服务器之间的交互过程。本篇文章将详细介绍...

    dwr推送demo,用户互推、服务器推送,

    DWR(Direct Web Remoting)是一种Java技术,用于在浏览器和服务器之间进行实时的、双向的通信,使得...初学者可以通过分析和运行这些代码,深入理解DWR的工作原理和使用方式,从而提升对DWR推送技术的理解和应用能力。

    dwr demo 反向推送 导向推送

    总结来说,"dwr demo 反向推送 导向推送"是一个演示如何使用DWR实现实时服务器推送的项目,它包括了必要的配置和JavaScript调用,对于理解DWR的工作原理以及在实际项目中应用反向推送技术非常有帮助。通过学习这个...

    springMVC+dwr技术实现消息推送实例

    传统的Ajax技术通常依赖于浏览器发起请求,而DWR则允许服务器主动向客户端推送数据,无需等待用户的操作。这种特性使得DWR在实时应用如聊天、股票报价、在线游戏等场景中非常有用。 **消息推送原理** 消息推送的...

    dwr 推送例子,CHAT

    这两个文件展示了DWR推送的两种不同实现方式。 1. `java-chat.html`:这个例子中,服务器端负责主动推送消息到客户端。在Java后端,开发者需要创建一个`PushEngine`实例,注册监听器,并在有新消息时触发推送。DWR...

    Dwr 推送简单列子

    推送技术是DWR的一个重要特性,它允许服务器主动将数据推送到客户端,而不是传统的客户端请求-服务器响应模式。这种模式在实时性要求较高的应用中非常有用,比如聊天应用、股票报价或者在线游戏。 在配置文件中,...

    Dwr推送技术实现BS即时通讯

    通过以上分析,我们可以看出"Dwr推送技术实现BS即时通讯"这个项目涉及到了前端与后端的交互、即时通讯机制、数据存储和安全等多个方面的技术,是一个综合性的Web应用开发实践。通过学习和理解这个项目,开发者可以...

    dwr 实现推技术 实例

    通过这个简单的点对点聊天实例,我们可以深入理解DWR如何实现反向Ajax和推送技术,以及如何在实际项目中应用。同时,这也是一个很好的起点,可以进一步扩展到群聊、文件传输等更复杂的Web交互场景。在实际开发中,...

Global site tag (gtag.js) - Google Analytics