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纳秒推送一次数据
分享到:
相关推荐
总的来说,DWR推送技术通过Comet实现了高效的服务器到客户端的数据推送,简化了实时Web应用的开发。结合提供的源码示例"j-jetty-dwr-comet-src",开发者可以深入理解DWR的工作原理,并学习如何在实际项目中应用这项...
总结来说,DWR推技术是实现服务器主动向客户端推送数据的一种高效方式,尤其适用于需要实时数据更新的应用,如股票实时显示。通过反转Ajax,DWR简化了开发流程,提高了用户体验,是现代Web开发中的一个重要工具。
DWR的核心特性是它支持AJAX(Asynchronous JavaScript and XML)以及服务器推送技术,极大地提高了Web应用的用户体验。 **服务器推送技术**: 传统的HTTP协议是基于请求-响应模型的,即客户端发起请求,服务器响应...
在实际项目中,根据`dwrpush`这个文件名,我们可以推测这是一个关于DWR推送技术的示例或配置文件,可能包含了如何设置和使用DWR推送功能的代码示例。通过对这个文件的深入学习和实践,可以更好地理解和掌握DWR3的推...
在本项目的背景下,由于HTML5的WebSocket不适用于所有浏览器,特别是对旧版IE的支持,因此选择了DWR作为实现推送技术的工具。DWR的核心思想是建立一个持久的连接(long-polling)来实现实时数据推送。这种机制下,...
在“dwr推送及js访问java代码”的项目中,我们可以看到如何利用DWR进行双向通信。首先,DWR的核心组件包括`DWR Engine`、`Servlet`和`AutoBean`等。`DWR Engine`负责在客户端和服务器之间建立连接,`Servlet`处理...
总的来说,结合DWR和Spring,我们可以构建出一个高效、可扩展的消息推送系统,使得Web应用能够实时地与用户互动,提升用户体验。在实际项目中,还需要考虑安全性、错误处理、性能监控等方面,确保系统的稳定性和可靠...
总结来说,这个"基于DWR推送技术的聊天室"项目展示了如何利用DWR实现实时的双向通信,创建一个互动性强的Web应用。通过理解DWR的工作机制和配置,开发者可以构建更多类似的应用,如实时通知、协作工具等。在实践中,...
本实例主要关注DWR的消息推送功能,这在创建实时更新的应用如聊天室、股票报价或在线游戏等场景中非常有用。 1. **DWR框架概述** DWR框架的核心是将Java对象暴露给JavaScript,使得前端可以像操作本地对象一样操作...
DWR (Direct Web Remoting) 是一种开源的Java库,用于在Web应用...同时,随着WebSocket等技术的发展,DWR的服务器推送功能可能逐渐被取代,但在一些老项目或对兼容性有较高要求的场景下,DWR仍然是一种有效的解决方案。
标题中的“dwr推技术官方实例”是指DWR提供的关于其推技术的实际操作示例,这些示例可能涵盖了DWR 2.0.4及以上版本的最新功能。由于高质量的实例资源在网络上可能不易找到,所以这份实例集合显得尤为宝贵。 描述中...
### dwr实现消息精确推送详解 #### 一、前言 Direct Web Remoting(DWR)是一种开源技术,它使得JavaScript可以直接调用服务器端的Java方法成为可能,从而简化了客户端与服务器之间的交互过程。本篇文章将详细介绍...
DWR(Direct Web Remoting)是一种Java技术,用于在浏览器和服务器之间进行实时的、双向的通信,使得...初学者可以通过分析和运行这些代码,深入理解DWR的工作原理和使用方式,从而提升对DWR推送技术的理解和应用能力。
总结来说,"dwr demo 反向推送 导向推送"是一个演示如何使用DWR实现实时服务器推送的项目,它包括了必要的配置和JavaScript调用,对于理解DWR的工作原理以及在实际项目中应用反向推送技术非常有帮助。通过学习这个...
传统的Ajax技术通常依赖于浏览器发起请求,而DWR则允许服务器主动向客户端推送数据,无需等待用户的操作。这种特性使得DWR在实时应用如聊天、股票报价、在线游戏等场景中非常有用。 **消息推送原理** 消息推送的...
这两个文件展示了DWR推送的两种不同实现方式。 1. `java-chat.html`:这个例子中,服务器端负责主动推送消息到客户端。在Java后端,开发者需要创建一个`PushEngine`实例,注册监听器,并在有新消息时触发推送。DWR...
推送技术是DWR的一个重要特性,它允许服务器主动将数据推送到客户端,而不是传统的客户端请求-服务器响应模式。这种模式在实时性要求较高的应用中非常有用,比如聊天应用、股票报价或者在线游戏。 在配置文件中,...
通过以上分析,我们可以看出"Dwr推送技术实现BS即时通讯"这个项目涉及到了前端与后端的交互、即时通讯机制、数据存储和安全等多个方面的技术,是一个综合性的Web应用开发实践。通过学习和理解这个项目,开发者可以...
通过这个简单的点对点聊天实例,我们可以深入理解DWR如何实现反向Ajax和推送技术,以及如何在实际项目中应用。同时,这也是一个很好的起点,可以进一步扩展到群聊、文件传输等更复杂的Web交互场景。在实际开发中,...