Pushlet和Dwr的简单服务器推技术
附件里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的简单服务器推技术相关推荐
- pushlet实现服务器推技术
服务器推技术: (1)由于目前我司电话系统处理来电弹屏存在一个问题,就是客户端登录系统会触发前端js不断去请求数据库数据,并反馈给前端,如果使用者一多,将会导致系统资源高消耗: (2)目前比较成 ...
- Comet:基于 HTTP 长连接的“服务器推”技术解析
一.背景介绍 传统web请求,是显式的向服务器发送http Request,拿到Response后显示在浏览器页面上.这种被动的交互方式不能满足对信息实时性要求高的应用,譬如聊天室.股票交易行情.在线 ...
- comet - “服务器推”技术
概念 comet :基于 HTTP 长连接的"服务器推"技术,是一种新的 Web 应用架构.基于这种架构开发的应用中,服务器端会主动以异步的方式向 客户端程序推送数据,而不需要客户 ...
- 采用PHP实现”服务器推”技术的聊天室
传统的B/S结构的应用程序,都是采用"客户端拉"结束来实现客户端和服务器端的数据交换. 本文将通过结合Ticks(可以参看我的另外一篇文章:关于PHP你可能不知道的-PHP的事件驱 ...
- Comet:基于 HTTP 长连接的“服务器推”技术 (实例)
"服务器推"技术的应用 传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工作.这种方式并不能满足很多现实应用的需求,譬如: 1. 监控系统:后台硬件热插拔.LED.温度 ...
- Comet:基于HTTP长连接的“服务器推”技术
作者:周 婷 (zhouting@cn.ibm.com), 软件工程师, IBM 中国软件开发技术实验室 来源:http://www.ibm.com/developerworks/cn/web/wa- ...
- [转载] Comet:基于 HTTP 长连接的“服务器推”技术
转载自http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ "服务器推"技术的应用 传统模式的 Web 系统以客户端发出请求. ...
- 基于php和服务器推技术的web即时聊天系统,基于php和服务器推技术的Web即时聊天系统...
基于php和服务器推技术的Web即时聊天系统① 王振兴, 黄静 [摘要]摘要: 基于http协议应用于Web端, 实现一个浏览器无关的.便于移植的.高性能的Web即时聊天系统. 系统使用服务器推技术中 ...
- 服务器推技术相关网址
https://www.smashingmagazine.com/2017/04/guide-http2-server-push/ https://zhuanlan.zhihu.com/p/31297 ...
最新文章
- opensuse-KDE桌面下自定义快捷键,ctrl+alt+t打开konsole
- 如何选择就业方向(80后的个人经验,转载)
- 业务基础【概念说明】-userAgent
- case when then else 详解
- saleor的测试用账户地址This value is not valid for the address
- java上传文件堆溢出_我的正则表达式导致Java中的堆栈溢出;我错过了什么?
- 多个限制条件数学建模matlab,急急。请教一个限制条件复杂的优化问题
- 标准单元测试步骤:A -B-C-D-E-F
- 玩转springboot2.x之异步调用@Async
- Caffe学习笔记2--Ubuntu 14.04 64bit 安装Caffe(GPU版本)
- asp.net c# 网页 导出excel 多表格 多个sheet
- 手机网络延迟测试软件,手机网速延迟测试在线(手机网络延迟测试工具)
- jmeter.results.shanhe.me.xsl
- 【网络攻防课实验】一:本地系统密码破解
- 鬼迷心窍 歌词翻译 中译日
- 环信第三方集成 -- 移动客服
- Airbnb新用户的民宿预定结果预测
- 冲突处理方法----分离链接法
- Laravel OAuth2 (三) ---使用 services 和 facades
- 《征服老板:零基础做出高逼格PPT》笔记(二)
热门文章
- 不要再走弯路了,黑客学习路线看这里
- Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。
- Vue框架Vue-cli脚手架引入图片报错
- 如切如磋,如琢如磨 - 南怀瑾
- C盘清理:Autodesk Shared文件夹转移
- android power键测试,Android Framework层Power键关机流程(一,Power长按键操作处理)...
- python神经网络编程 pdf下载_Python神经网络编程 PDF 高质量完整版
- marlin2.0 的使用过程记录。skr v1.3
- 互站源码论坛卖家都是骗子以后大家不要上当
- 推荐个比较好用的协同办公软件,帮助你高效办公