附件里Pushlet和Dwr3.0的简单服务器推技术。

DWR-Source.rar为DWR的学习资料。

下面简单介绍一下dwr3.0 RC2版本的反推技术代码。

首先下载dwr官方包,笔者这里下载的是dwr3.0 RC2开发包。
把dwr.jar和engine.js等相关文件放入web工程里。
首先在web.xml文件的同级目录建立dwr.xml文件,其内容如下:

<?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>

       <!-- stockpusher -->        <create creator="new" scope="application" javascript="StocksPusher">         <param name="class" value="com.shihuan.dragonkeeper.server.reverseajax.stockspusher.StocksPusher"/>     </create>

 </allow>

</dwr>

在web.xml文件中要加入如下代码:

<listener>    <listener-class>org.directwebremoting.servlet.DwrListener</listener-class>  </listener>

  <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>accessLogLevel</param-name>      <param-value>runtimeexception</param-value>    </init-param>

    <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>jsonRpcEnabled</param-name>      <param-value>true</param-value>    </init-param>

    <init-param>      <param-name>jsonpEnabled</param-name>      <param-value>true</param-value>    </init-param>

    <init-param>      <param-name>preferDataUrlSchema</param-name>      <param-value>false</param-value>    </init-param>    //下面这句要看你的web工程中是否有优先于dwr启动的文件    <load-on-startup>2</load-on-startup>

  </servlet>  <servlet-mapping>    <servlet-name>dwr-invoker</servlet-name>    //下面的resources目录的意思是笔者dwr的引擎文件是放在WebRoot/resources/dwr目录下面的(engine.js)    <url-pattern>/resources/dwr/*</url-pattern>  </servlet-mapping>

StocksPusher.java代码如下:

import java.io.IOException;import java.sql.Connection;import java.sql.SQLException;import java.util.concurrent.ScheduledThreadPoolExecutor;import java.util.concurrent.TimeUnit;

import org.apache.commons.configuration.ConfigurationException;import org.apache.commons.dbutils.DbUtils;import org.apache.commons.dbutils.QueryRunner;import org.directwebremoting.Browser;import org.directwebremoting.ScriptSessions;import org.directwebremoting.impl.DaemonThreadFactory;import org.slf4j.Logger;import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;import com.shihuan.dragonkeeper.common.dto.DataSourceInfo;import com.shihuan.dragonkeeper.common.utils.DataSourceMapUtil;import com.shihuan.dragonkeeper.common.utils.PropertiesUtil;import com.shihuan.dragonkeeper.global.ConfigFile;import com.shihuan.dragonkeeper.server.bean.StocksBean;

public class StocksPusher implements Runnable {

    protected static Logger logger = LoggerFactory.getLogger(StocksPusher.class);

  private static String jdbc_CONFIG = ConfigFile.JDBC_CONFIG + ConfigFile.SUFFIX_NAME;

  private static boolean closeMarket = false;

  public StocksPusher() {       ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1, new DaemonThreadFactory());        executor.scheduleAtFixedRate(this, 1L, 50L, TimeUnit.MILLISECONDS);   }

   @Override    public void run() {

     if (!closeMarket) {           StocksBean stock = StockPriceTracer.getNextStockInfo();  //获取后台数据

//            setMessageToPage(stock.getStock(), stock.getValue());  //非JSON版本

            insertDbData(stock);          setJsonMessageToPage(JSON.toJSON(stock));

       } 

  }

   public void setJsonMessageToPage(final Object json){      Browser.withAllSessions(new Runnable() {          public void run() {               ScriptSessions.addFunctionCall("showJsonMessage", json);            }     });   }

   public void setMessageToPage(final String key, final String message){     Browser.withAllSessions(new Runnable() {          public void run() {               ScriptSessions.addFunctionCall("showMessage", key, message);            }     });   }

   public void insertDbData(final StocksBean data){      Thread t = new Thread(new Runnable() {           @Override            public void run() {               String sql = "insert into stocks(stock,value) values (?,?)";               QueryRunner queryRunner = new QueryRunner(true);             Connection conn = null;

                DataSourceInfo dsObj = new DataSourceInfo();             try {                 dsObj.setDriverClass(PropertiesUtil.getPropertiesValue(jdbc_CONFIG, "mysql.driverclass"));                  dsObj.setJdbcUrl(PropertiesUtil.getPropertiesValue(jdbc_CONFIG, "mysql.jdbcurl"));                  dsObj.setUser(PropertiesUtil.getPropertiesValue(jdbc_CONFIG, "mysql.user"));                    dsObj.setPassword(PropertiesUtil.getPropertiesValue(jdbc_CONFIG, "mysql.password"));                    conn = DataSourceMapUtil.getConnection(dsObj);                   queryRunner.update(conn, sql, data.getStock(), data.getValue());                  DbUtils.commitAndCloseQuietly(conn);              } catch (ConfigurationException e) {                  DbUtils.rollbackAndCloseQuietly(conn);                    logger.error(e.getMessage(), e);                  e.printStackTrace();              } catch (SQLException e) {                    DbUtils.rollbackAndCloseQuietly(conn);                    logger.error(e.getMessage(), e);                  e.printStackTrace();              } catch (IOException e) {                 DbUtils.rollbackAndCloseQuietly(conn);                    logger.error(e.getMessage(), e);                  e.printStackTrace();              } finally {                   try {                     if (conn != null && !conn.isClosed()) {                          conn.close();                     }                 } catch (SQLException e) {                        logger.error(e.getMessage(), e);                      e.printStackTrace();                  }             }

           }     });

     t.start();    }

   public void beginShow() {     closeMarket = false; }

   public void closeShow() {     closeMarket = true;  }

}

StockPriceTracer.java代码如下:

import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.Stack;

import com.shihuan.dragonkeeper.server.bean.StocksBean;

public class StockPriceTracer {

   private static StockPriceTracer tracer = null;   private List<StocksBean> stocks = new ArrayList<StocksBean>();   private Stack<StocksBean> cycleStack = new Stack<StocksBean>();

    private StockPriceTracer() {      stocks.add(new StocksBean("zsy", "36.55"));       stocks.add(new StocksBean("dlsd", "91.01"));      stocks.add(new StocksBean("zsh", "22.59"));       stocks.add(new StocksBean("lggf", "5.07"));       stocks.add(new StocksBean("hedq", "71.77"));      stocks.add(new StocksBean("jdsn", "31.61"));      stocks.add(new StocksBean("yyrj", "51.29"));      stocks.add(new StocksBean("zsyh", "52.70"));      stocks.add(new StocksBean("zgtj", "16.96"));      stocks.add(new StocksBean("sfz", "54.34"));       stocks.add(new StocksBean("jsrj", "178.48"));     stocks.add(new StocksBean("zyd", "134.48"));      stocks.add(new StocksBean("jzg", "76.32"));       stocks.add(new StocksBean("zgpa", "80.63"));      stocks.add(new StocksBean("gsyh", "18.79"));      stocks.add(new StocksBean("aggf", "20.19"));      stocks.add(new StocksBean("zght", "11.13"));  }

   public static StocksBean getNextStockInfo() {     if (null == tracer) {           tracer = new StockPriceTracer();     }

       if (tracer.cycleStack.empty()) {          tracer.cycleStack.addAll(tracer.stocks);      }

       StocksBean tmp = tracer.cycleStack.pop();        tmp.setValue(tracer.getRandomPrice(tmp.getValue()));      return tmp;   }

   private String getRandomPrice(String current) {       float fcurrent = 0.0F;       try {         fcurrent = Float.parseFloat(current);        } catch (NumberFormatException e) {           fcurrent = 0.01F;        }     Random rdm = new Random();       float tmp = fcurrent + rdm.nextFloat();     return String.valueOf(tmp);   }

}

StocksPusher.jsp代码如下:

<%@ page contentType="text/html;charset=UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %><%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %><%@ page isELIgnored="false" %><fmt:requestEncoding value="UTF-8"/><c:set var="ctx" value="${pageContext.request.contextPath}"/><c:set var="requestURI" value="${pageContext.request.servletPath}"/><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">  <head>    <title>My Dwr Reverse Ajax Test For StocksInfo</title>    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

  <link rel="stylesheet" type="text/css" href="${ctx}/resources/dwr/css/generic.css" />

    <script type='text/javascript' src='${ctx}/resources/dwr/engine.js'></script>   <script type='text/javascript' src='${ctx}/resources/dwr/util.js'></script> <script type='text/javascript' src='${ctx}/resources/dwr/interface/StocksPusher.js'></script>

   <script type="text/javascript" src="${ctx}/resources/appbusiness/stockspusher/StocksPusher.js"></script>

</head>

  <body>

       <h3>使用DWR Reverse Ajax进行股票报盘</h3>     <p>下面显示的股票信息是可以动态变化的</p>      <input type="button" value="开市..." onclick="beginShow();" />       =========================        <input type="button" value="闭市..." onclick="endShow();" />     <hr />

        <table style="width:500px;" border="0" cellpadding="0">            <tr>                <td class="headName">                    <b>Stock Name</b>             </td>               <td class="headValue" >                  <b>Stock Value</b>                </td>           </tr>

         <tr><td>中移动</td><td><div id="zyd">wait...</div></td></tr>          <tr><td>中石化</td><td><div id="zsh">wait...</div></td></tr>          <tr><td>中石油</td><td><div id="zsy">wait...</div></td></tr>          <tr><td>海尔电器</td><td><div id="hedq">wait...</div></td></tr>            <tr><td>冀东水泥</td><td><div id="jdsn">wait...</div></td></tr>            <tr><td>用友软件</td><td><div id="yyrj">wait...</div></td></tr>            <tr><td>柳钢股份</td><td><div id="lggf">wait...</div></td></tr>            <tr><td>招商银行</td><td><div id="zsyh">wait...</div></td></tr>            <tr><td>中国铁建</td><td><div id="zgtj">wait...</div></td></tr>            <tr><td>深发展</td><td><div id="sfz">wait...</div></td></tr>          <tr><td>金山软件</td><td><div id="jsrj">wait...</div></td></tr>            <tr><td>大连实德</td><td><div id="dlsd">wait...</div></td></tr>            <tr><td>九寨沟</td><td><div id="jzg">wait...</div></td></tr>          <tr><td>中国平安</td><td><div id="zgpa">wait...</div></td></tr>            <tr><td>工商银行</td><td><div id="gsyh">wait...</div></td></tr>            <tr><td>鞍钢股份</td><td><div id="aggf">wait...</div></td></tr>            <tr><td>中国航天</td><td><div id="zght">wait...</div></td></tr>

      </table>

      <br />

  </body>

</html>

StocksPusher.js代码如下:

window.onload = function() {    dwr.engine.setActiveReverseAjax(true);};

function beginShow() {    StocksPusher.beginShow();}

function endShow() {  StocksPusher.closeShow();}

//JSON版本function showJsonMessage(json){    if(json['stock'] != undefined || json['value'] != undefined){    document.getElementById(json['stock']).innerHTML = json['value'];    }}

//非JSON版本function showMessage(key, value){  document.getElementById(key).innerHTML = value;}

Pushlet和Dwr的简单服务器推技术相关推荐

  1. pushlet实现服务器推技术

     服务器推技术: (1)由于目前我司电话系统处理来电弹屏存在一个问题,就是客户端登录系统会触发前端js不断去请求数据库数据,并反馈给前端,如果使用者一多,将会导致系统资源高消耗: (2)目前比较成 ...

  2. Comet:基于 HTTP 长连接的“服务器推”技术解析

    一.背景介绍 传统web请求,是显式的向服务器发送http Request,拿到Response后显示在浏览器页面上.这种被动的交互方式不能满足对信息实时性要求高的应用,譬如聊天室.股票交易行情.在线 ...

  3. comet - “服务器推”技术

    概念 comet :基于 HTTP 长连接的"服务器推"技术,是一种新的 Web 应用架构.基于这种架构开发的应用中,服务器端会主动以异步的方式向 客户端程序推送数据,而不需要客户 ...

  4. 采用PHP实现”服务器推”技术的聊天室

    传统的B/S结构的应用程序,都是采用"客户端拉"结束来实现客户端和服务器端的数据交换. 本文将通过结合Ticks(可以参看我的另外一篇文章:关于PHP你可能不知道的-PHP的事件驱 ...

  5. Comet:基于 HTTP 长连接的“服务器推”技术 (实例)

    "服务器推"技术的应用 传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工作.这种方式并不能满足很多现实应用的需求,譬如: 1. 监控系统:后台硬件热插拔.LED.温度 ...

  6. Comet:基于HTTP长连接的“服务器推”技术

    作者:周 婷 (zhouting@cn.ibm.com), 软件工程师, IBM 中国软件开发技术实验室 来源:http://www.ibm.com/developerworks/cn/web/wa- ...

  7. [转载] Comet:基于 HTTP 长连接的“服务器推”技术

    转载自http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ "服务器推"技术的应用 传统模式的 Web 系统以客户端发出请求. ...

  8. 基于php和服务器推技术的web即时聊天系统,基于php和服务器推技术的Web即时聊天系统...

    基于php和服务器推技术的Web即时聊天系统① 王振兴, 黄静 [摘要]摘要: 基于http协议应用于Web端, 实现一个浏览器无关的.便于移植的.高性能的Web即时聊天系统. 系统使用服务器推技术中 ...

  9. 服务器推技术相关网址

    https://www.smashingmagazine.com/2017/04/guide-http2-server-push/ https://zhuanlan.zhihu.com/p/31297 ...

最新文章

  1. opensuse-KDE桌面下自定义快捷键,ctrl+alt+t打开konsole
  2. 如何选择就业方向(80后的个人经验,转载)
  3. 业务基础【概念说明】-userAgent
  4. case when then else 详解
  5. saleor的测试用账户地址This value is not valid for the address
  6. java上传文件堆溢出_我的正则表达式导致Java中的堆栈溢出;我错过了什么?
  7. 多个限制条件数学建模matlab,急急。请教一个限制条件复杂的优化问题
  8. 标准单元测试步骤:A -B-C-D-E-F
  9. 玩转springboot2.x之异步调用@Async
  10. Caffe学习笔记2--Ubuntu 14.04 64bit 安装Caffe(GPU版本)
  11. asp.net c# 网页 导出excel 多表格 多个sheet
  12. 手机网络延迟测试软件,手机网速延迟测试在线(手机网络延迟测试工具)
  13. jmeter.results.shanhe.me.xsl
  14. 【网络攻防课实验】一:本地系统密码破解
  15. 鬼迷心窍 歌词翻译 中译日
  16. 环信第三方集成 -- 移动客服
  17. Airbnb新用户的民宿预定结果预测
  18. 冲突处理方法----分离链接法
  19. Laravel OAuth2 (三) ---使用 services 和 facades
  20. 《征服老板:零基础做出高逼格PPT》笔记(二)

热门文章

  1. 不要再走弯路了,黑客学习路线看这里
  2. Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。
  3. Vue框架Vue-cli脚手架引入图片报错
  4. 如切如磋,如琢如磨 - 南怀瑾
  5. C盘清理:Autodesk Shared文件夹转移
  6. android power键测试,Android Framework层Power键关机流程(一,Power长按键操作处理)...
  7. python神经网络编程 pdf下载_Python神经网络编程 PDF 高质量完整版
  8. marlin2.0 的使用过程记录。skr v1.3
  9. 互站源码论坛卖家都是骗子以后大家不要上当
  10. 推荐个比较好用的协同办公软件,帮助你高效办公