- 浏览: 532290 次
- 性别:
- 来自: 天津
文章分类
- 全部博客 (230)
- java (87)
- c/c++/c# (39)
- ASP.net MVC (4)
- eclipse/visual studio (3)
- tomcat/weblogic/jetty (13)
- linux/unix/windows (20)
- html/javascript/jquery/kendo/bootstrap/layui/vue/react (31)
- hibernate/struts/spring/mybatis/springboot (21)
- lucene/solr/ELK (2)
- shiro (0)
- oracle/sqlserver/mysql/postgresql (23)
- shell/python/ruby (6)
- android (0)
- maven/ant (1)
- freemarker/thymeleaf/velocity (1)
- open source project (41)
- cache/memcached/redis (0)
- nosql/hadoop/hbase/mongodb (0)
- system architecture/dubbo/zookeeper (0)
- software testing (0)
- system optimization (0)
- system security (0)
- tcp/udp/http (2)
- roller/wordpress (2)
- 工具收藏 (8)
- 文摘 (4)
- 生活 (0)
最新评论
-
coconut_zhang:
这个demo 非常完整了,是指下面说的那个html 模版,模版 ...
flying sauser, thymeleaf实现PDF文件下载 -
a93456:
你好,你有完整的demo吗? String template这 ...
flying sauser, thymeleaf实现PDF文件下载 -
yujiaao:
fn 函数循环是没有必要的啊,可以改成
protecte ...
Java 笛卡尔积算法的简单实现 -
安静听歌:
设置了.setUseTemporaryFileDuringWr ...
使用jxl导出大数据量EXCEL时内存溢出的解决办法 -
q280499693:
写的很详细,但是我现在想知道他们是怎么定位log4j.prop ...
关于SLF4J结合Log4j使用时日志输出与指定的log4j.properties不同
DWR2.x的推技术
DWR2.x的推技术也叫DWR Reverse Ajax(逆向Ajax)主要是在BS架构中,从服务器端向多个浏览器主动推数据的一种技术。在DWR所开的线程中使用Reverse Ajax时,通过WebContextFactory.get()获取WebContext对象,进而获取脚本Session。在DWR之外使用Reverse Ajax时,就要用到ServerContext,在Spring环境中要得到ServerContext,就需要用到Spring的ServletContextAware接口。
一、Reverse Ajax的实现有3种方式:
DWR的逆向Ajax主要包括两种模式:主动模式和被动模式。其中主动模式包括polling和comet两种,被动模式只有piggyback这一种。
1、piggyback方式
这是默认的方式。
如果后台有什么内容需要推送到前台,是要等到那个页面进行下一次ajax请求的时候,将需要推送的内容附加在该次请求之后,传回到页面。只有等到下次请求页面主动发起了,中间的变化内容才传递回页面。
2、comet方式
当服务端建立和浏览器的连接,将页面内容发送到浏览器之后,对应的连接并不关闭,只是暂时挂起。如果后面有什么新的内容需要推送到客户端的时候直接通过前面挂起的连接再次传送数据。服务器所能提供的连接数目是一定的,在大量的挂起的连接没有关闭的情况下,可能造成新的连接请求不能接入,从而影响到服务质量。
3、polling方式
由浏览器定时向服务端发送ajax请求,询问后台是否有什么内容需要推送,有的话就会由服务端返回推送内容。这种方式和我们直接在页面通过定时器发送ajax请求,然后查询后台是否有变化内容的实现是类似的。只不过用了dwr之后这部分工作由框架帮我们完成了。
二、使用DWR的推技术的步骤
1、在web.xml文件中增加以下配置信息
Xml代码
<!-- 开始DWR配置 -->
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<!--
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
-->
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<!-- dwr反转 -->
<!-- 1、piggyback方式
这是默认的方式。
如果后台有什么内容需要推送到前台,是要等到那个页面进行下一次ajax请求的时候,将需要推送的内容附加在该次请求之后,传回到页面。
只有等到下次请求页面主动发起了,中间的变化内容才传递回页面。
2、comet方式
当服务端建立和浏览器的连接,将页面内容发送到浏览器之后,对应的连接并不关闭,只是暂时挂起。如果后面有什么新的内容需要推送到客户端的时候直接通过前面挂起的连接再次传送数据。
服务器所能提供的连接数目是一定的,在大量的挂起的连接没有关闭的情况下,可能造成新的连接请求不能接入,从而影响到服务质量。
3、polling方式
由浏览器定时向服务端发送ajax请求,询问后台是否有什么内容需要推送,有的话就会由服务端返回推送内容。这种方式和我们直接在页面通过定时器发送ajax请求,然后查询后台是否有变化内容的实现是类似的。只不过用了dwr之后这部分工作由框架帮我们完成了。
-->
<!-- DWR默认采用piggyback方式 -->
<!-- 使用polling和comet的方式 -->
<init-param>
<param-name>pollAndCometEnabled</param-name>
<param-value>true</param-value>
</init-param>
<!-- comet方式 -->
<!--
<init-param>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
-->
<!-- polling方式:在comet方式的基础之上,再配置以下参数 -->
<!--
<init-param>
<param-name>org.directwebremoting.extend.ServerLoadMonitor</param-name>
<param-value>org.directwebremoting.impl.PollingServerLoadMonitor</param-value>
</init-param>
-->
<!-- 毫秒数。页面默认的请求间隔时间是5秒 -->
<!--
<init-param>
<param-name>disconnectedTime</param-name>
<param-value>60000</param-value>
</init-param>
-->
<init-param>
<param-name>crossDomainSessionSecurity</param-name>
<param-value>false</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>
<listener>
<listener-class>
org.directwebremoting.servlet.EfficientShutdownServletContextAttributeListener
</listener-class>
</listener>
<listener>
<listener-class>
org.directwebremoting.servlet.EfficientShutdownServletContextListener
</listener-class>
</listener>
<!-- 结束DWR配置 -->
2、在dwr.xml中增加以下配置信息
Xml代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr//dwr20.dtd">
<dwr>
<allow>
<create creator="new" javascript="DWRAction">
<param name="class" value="com.tcps.action.DwrActionTest"/>
<include method="DwrTest"/>
<include method="sessionDestory"/>
</create>
<create creator="new" javascript="DWRReverse">
<param name="class" value="com.tcps.action.DWRReverse" />
</create>
<convert converter="bean" match="com.tcps.model.User">
<param name="include" value="username,password" />
</convert>
</allow>
</dwr>
3、pojo类User的源码
Java代码
public class User implements java.io.Serializable {
private Integer id; /** default constructor */ /** minimal constructor */ public Integer getId() { public String getUsername() { public String getPassword() { public String getAge() { public String getTel() { public String getSessionid() { public void setSessionid(String sessionid) {
// Fields
private String username;
private String password;
private String age;
private String tel;
private String sessionid;
// Constructors
public User() {
}
public User(Integer id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
/** full constructor */
public User(Integer id, String username, String password, String age, String tel, String sessionid) {
this.id = id;
this.username = username;
this.password = password;
this.age = age;
this.tel = tel;
this.sessionid = sessionid;
}
@Override
public String toString(){
return this.username + this.password;
}
// Property accessors
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
return this.age;
}
public void setAge(String age) {
this.age = age;
}
return this.tel;
}
public void setTel(String tel) {
this.tel = tel;
}
return sessionid;
}
this.sessionid = sessionid;
}
4、DWRReverse类源码
Java代码
public class DWRReverse extends AbstractAction {
public static WebContext wctx = null;
public static void sendMessage(User monitor) {
if (wctx == null) {
wctx = WebContextFactory.get();
}
ScriptBuffer script = new ScriptBuffer();
//执行js 方法
if (monitor != null) {
StringBuffer sb = new StringBuffer();
sb.append(monitor.getId()).append(",");
sb.append(monitor.getUsername()).append(",");
sb.append(monitor.getPassword()).append(",");
sb.append(monitor.getAge()).append(",");
sb.append(monitor.getTel());
script.appendScript("receiveMessages('").appendData(sb.toString())
.appendScript("');");
}
ServerContext sctx = ServerContextFactory.get(wctx.getServletContext());
Collection<ScriptSession> scriptSessions = sctx.getScriptSessionsByPage(wctx.getCurrentPage());
Util util = new Util(scriptSessions);
//可以设置样式等
// util.setStyle("test", "display", "none");
for (ScriptSession session : scriptSessions) {
session.addScript(script);
}
}
}
5、JSP页面源码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'dwrReverse.jsp' starting page</title>
<script type='text/javascript' src='<%=basePath%>/dwr/interface/DWRReverse.js'></script>
<script type='text/javascript' src='<%=basePath%>/dwr/engine.js'></script>
<script type='text/javascript' src='<%=basePath%>/dwr/util.js'></script>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript">
function getData(){
DWRReverse.sendMessage(null);
}
function receiveMessages(message) {
var msg = eval("("+message+")");
var temp = msg.split(",");
var username = temp[1];
var password = temp[2];
var age = temp[3];
var tel = temp[4];
var newRow = document.getElementById('tableData').insertRow(2);
var cell0 = newRow.insertCell(0);
var cell1 = newRow.insertCell(1);
var cell2 = newRow.insertCell(2);
var cell3 = newRow.insertCell(3);
cell0.innerHTML = username;
cell1.innerHTML = password;
cell2.innerHTML = age;
cell3.innerHTML = tel;
}
</script>
</head>
<!-- 注:这个是要在使用reverse-ajax的页面必须的 -->
<body onload="dwr.engine.setActiveReverseAjax(true);getData();">
<div align="center">
<table title=用户表 class="list" align="center" id="tableData">
<tr id="titleData">
<td colspan="4">
用户表
</td>
<td colspan="1" onclick="getData()" style="size:10px">
<a href="#"></a>
</td>
</tr>
<tr id="headData" bgcolor="#fffce7" style="color:#968054">
<td width="9%">
用户名
</td>
<td width="20%">
密码
</td>
<td width="33%">
年龄
</td>
<td width="22%">
电话
</td>
</tr>
</table>
</div>
</body>
</html>
最后,为了测试,后台实现定时器:
public class SampleTask extends TimerTask {
private ServletContext context;
private static boolean isRunning = false;
public SampleTask(ServletContext context) {
this.context = context;
}
@Override
public void run() {
// TODO Auto-generated method stub
if (!isRunning) {
isRunning = true;
System.out.println("开始执行指定任务");
if (DWRReverse.wctx != null) {
User user = new User(1, "tom", "123456", "10", "13909876543", "");
DWRReverse.sendMessage(user);
}
isRunning = false;
// context.log("指定任务执行结束");
} else {
// context.log("上一次任务执行还未结束");
}
}
}
发表评论
-
easypoi 按照模板到出excel并合并单元格
2022-11-10 21:46 109这是entity类,注解的mergeVertical是纵向合 ... -
Java时区处理之Date,Calendar,TimeZone,SimpleDateFormat
2017-03-31 14:59 1284一、概述 1、问题描述 使用Java处 ... -
logback的使用和logback.xml详解
2017-03-09 11:20 2138一、logback的介绍 Logback是由log4j ... -
jxls操作excel文件
2017-03-03 14:51 1017JXLS是基于Jakarta POI API的Excel报表 ... -
jquery formValidator 表单验证插件, ajax无法传值到后台问题的解决
2016-06-24 17:10 615data : { count: Math.random ... -
thymeleaf与spring整合
2016-06-15 10:08 11861、使用的是Spring EL而不是Ognl。2、访问上下文 ... -
SpringMVC 400 Bad Request 问题
2016-06-15 09:11 1911在提交表单时,发生400错误,并未进入save方法。 ... -
bootstrap3自定义popover显示的内容
2016-05-27 11:14 1081<script type="text/jav ... -
eclipse插件Maven添加依赖查询无结果的解决方法(Select Dependency doesn't work)
2016-04-22 08:33 700在eclipse中用过maven的可能都遇到过这种情况,我 ... -
JS 中面向对象的5种写法
2015-08-13 15:54 652定义Circle类,拥有成员变量r,常量PI和计算面积的成员 ... -
动态载入/删除/更新外部 JavaScript/Css 文件的代码
2015-07-31 15:09 4078动态载入 JavaScript/Csss 文件 传统加载外部 ... -
Java_Ant详解
2015-06-15 16:54 6911,什么是antant是构建工 ... -
httpClient通过代理(Http Proxy)进行请求
2014-09-16 14:18 1163httpClient通过代理(Http Proxy)进行请求 ... -
httpclient上传文件及传参数
2014-09-16 11:07 11521用到的包有commons-httpclient-3.0.1. ... -
简单返回顶部代码及注释说明
2014-07-16 10:44 917最近做了一个排行榜页 ... -
深入浅出JSONP:解决AJAX跨域问题
2014-04-16 11:00 776取不到数据! 上周客户新买了服务器,原本在旧的服务器上放着 ... -
Progress Bar Plugin
2013-12-26 10:04 789from: http://digitalbush.com/p ... -
javascript cookie
2013-11-08 09:18 1009cookie概述在上一节, ... -
Java文件下载的几种方式
2013-08-19 14:15 839public HttpServletResponse dow ... -
http上传文件深度解析-高性能http传输
2013-07-23 10:41 9722最近在做web服务器的时候将一些应用集成在了服务器里面,比 ...
相关推荐
使用spring 整合dwr的反推技术,可以运用于在线聊天的实现。
通过 dwr 反推技术 实现 web 聊天 无刷新 跟新技术
DWR2.x的推技术也叫DWR Reverse Ajax(逆向Ajax)主要是在BS架构中,从服务器端向多个浏览器主动推数据的一种技术。
dwr反推简单例子,自己写的有的地方自己都没看明白!
使用dwr实现服务器端反推的例子,主要争对点对点聊天模式
通过服务器反推使用DWR框架实现即时聊天系统,资源包内包含JavaBean源文件、DWR配置、聊天页面代码、web配置文件代码、javascript代码
S2SH整合dwr,通过DWR实现了web即时通讯的功能。整个项目源码全在这里,还有说明!
这是一个简单的spring与dwr的整合,希望对大家能有一点帮助
开发平台myeclipse,mysql,tomcat。前端Extjs 使用Extjs开发的一个在线聊天工具,用DWR反推实现!
dwr技术实现详解第一版,主要是反推技术应用,腾讯QQ只要用反推技术实现的在线和下线检测
上个版本由于没有过滤因刷新页面生成的无效ScriptSession,这么做会导致服务器压力过大,甚至完不成任务。所以制作了这个升级版的——添加了使用dwr3中的ScriptSessionListener过滤无效的scriptSession。
dwr3.0 包括noncla,支持Reverse Ajax反推,包括noncla支持JSF,SPRING集成。
java 定义模板生成word,word转换pdf,dwr半反推测试,其中使用word转换pdf使用jacob时需要office2007(需要安装发布pdf或xps插件)以上版本,使用dwr半推时可以模拟两个不同浏览器使用servlet(Main)建立会话发送格式...