- 浏览: 543605 次
- 性别:
- 来自: 天津
文章分类
- 全部博客 (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 149这是entity类,注解的mergeVertical是纵向合 ... -
Java时区处理之Date,Calendar,TimeZone,SimpleDateFormat
2017-03-31 14:59 1368一、概述 1、问题描述 使用Java处 ... -
logback的使用和logback.xml详解
2017-03-09 11:20 2194一、logback的介绍 Logback是由log4j ... -
jxls操作excel文件
2017-03-03 14:51 1104JXLS是基于Jakarta POI API的Excel报表 ... -
jquery formValidator 表单验证插件, ajax无法传值到后台问题的解决
2016-06-24 17:10 668data : { count: Math.random ... -
thymeleaf与spring整合
2016-06-15 10:08 12391、使用的是Spring EL而不是Ognl。2、访问上下文 ... -
SpringMVC 400 Bad Request 问题
2016-06-15 09:11 1969在提交表单时,发生400错误,并未进入save方法。 ... -
bootstrap3自定义popover显示的内容
2016-05-27 11:14 1152<script type="text/jav ... -
eclipse插件Maven添加依赖查询无结果的解决方法(Select Dependency doesn't work)
2016-04-22 08:33 737在eclipse中用过maven的可能都遇到过这种情况,我 ... -
JS 中面向对象的5种写法
2015-08-13 15:54 708定义Circle类,拥有成员变量r,常量PI和计算面积的成员 ... -
动态载入/删除/更新外部 JavaScript/Css 文件的代码
2015-07-31 15:09 4123动态载入 JavaScript/Csss 文件 传统加载外部 ... -
Java_Ant详解
2015-06-15 16:54 7331,什么是antant是构建工 ... -
httpClient通过代理(Http Proxy)进行请求
2014-09-16 14:18 1235httpClient通过代理(Http Proxy)进行请求 ... -
httpclient上传文件及传参数
2014-09-16 11:07 11646用到的包有commons-httpclient-3.0.1. ... -
简单返回顶部代码及注释说明
2014-07-16 10:44 969最近做了一个排行榜页 ... -
深入浅出JSONP:解决AJAX跨域问题
2014-04-16 11:00 816取不到数据! 上周客户新买了服务器,原本在旧的服务器上放着 ... -
Progress Bar Plugin
2013-12-26 10:04 832from: http://digitalbush.com/p ... -
javascript cookie
2013-11-08 09:18 1065cookie概述在上一节, ... -
Java文件下载的几种方式
2013-08-19 14:15 879public HttpServletResponse dow ... -
http上传文件深度解析-高性能http传输
2013-07-23 10:41 9774最近在做web服务器的时候将一些应用集成在了服务器里面,比 ...
相关推荐
6. **反推技术**:为了实现实时的聊天功能,我们可以利用DWR的反推特性。在服务器端接收到新的聊天消息时,通过DWR主动将消息推送到相关的客户端,而无需客户端不断地轮询服务器。 7. **安全与优化**:确保DWR的...
**DWR反推技术详解** DWR(Direct Web Remoting)是一种开源JavaScript库,它允许在Web应用程序中实现Ajax(Asynchronous JavaScript and XML)通信,从而实现客户端与服务器端的实时交互。DWR2.x版本引入了反推...
在"通过dwr反推技术实现web聊天无刷新跟新技术"这个主题中,我们将深入探讨DWR如何用于构建实时聊天应用,并结合Comet技术来优化用户体验。 首先,DWR的工作原理基于Ajax(Asynchronous JavaScript and XML),但...
在"**dwr反推简单例子**"中,我们将会探讨如何使用DWR进行数据的反向推送,即由服务器主动向客户端推送数据,而不仅仅是响应客户端的请求。 首先,DWR的核心概念包括三个主要部分:`Engine`、`Configuration`和`...
DWR的反推(Push)技术就是基于这个理念,让服务器能够主动推送数据到客户端,而不是等待客户端发起请求。 二、服务器端反推(Push) 服务器端反推是DWR的一个重要功能,它允许服务器在有新数据可用时立即发送给...
DWR的反推技术在此起到了关键作用,使得服务器能实时地将新消息推送到客户端,无需用户手动刷新页面。 "群聊"和"私聊"是即时通讯的两种常见模式。群聊允许多个用户在一个频道内交流,而私聊则是两个用户之间的私密...
该实例项目采用Dwr Java服务器反推技术实现了消息推送功能,源码包含21个文件,涵盖XML配置、JAR包、类文件等多种类型,主要编程语言为Java和JavaScript。项目旨在提供一个消息推送的测试环境,以验证Dwr技术在...
通过以上步骤,我们可以构建一个基于DWR的即时聊天系统,利用服务器反推技术实现高效、实时的消息传递。需要注意的是,随着用户数量的增长,可能需要考虑负载均衡、消息队列和推送优化等高级话题,以保证系统的稳定...
DWR 则是一个允许 Java 对象在浏览器中直接调用的库,通过 AJAX 技术实现了前端与后端的实时通信。 整合 Spring 和 DWR 的过程主要包括以下几个步骤: 1. **添加依赖**:首先,在项目的 Maven 或者 Gradle 配置...
在DWR中,这种从服务器向浏览器的主动推送技术被称为"反推技术",这正是腾讯QQ在线和下线检测的核心机制。 **DWR的组成部分与工作原理** 1. **DWR Jar包**:DWR的运行依赖于两个核心库,分别是`commons-logging....
【压缩包子文件的文件名称列表】:“dwr_webqq_s2sh(dwr服务器反推技术)”表明压缩包中可能包含了关于DWR服务器反推(Reverse Ajax)技术的实现。服务器反推是DWR的一个关键特性,它允许服务器主动向客户端推送数据...
上个版本由于没有过滤因刷新页面生成的无效ScriptSession,这么做会导致服务器压力过大,甚至完不成任务。所以制作了这个升级版的——添加了使用dwr3中的ScriptSessionListener过滤无效的scriptSession。
DWR (Direct Web Remoting) 是一种在浏览器和服务器之间进行实时通信的技术,允许JavaScript直接调用Java方法,实现了AJAX的功能。在这个在线聊天模块中,“基于DWR实现”意味着服务器端的业务逻辑和数据处理通过DWR...
java 定义模板生成word,word转换pdf,dwr半反推测试,其中使用word转换pdf使用jacob时需要office2007(需要安装发布pdf或xps插件)以上版本,使用dwr半推时可以模拟两个不同浏览器使用servlet(Main)建立会话发送格式...