Java 代码
- 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 纳秒推送一次数据