1. 本示例在第一篇架构基础上添加代码

2. 首先修改web.xml里dwr的servlet配置:

 <!-- 配置dwr请求的servlet -->
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

3. 在CoreServlet.java里添加推送消息的方法

 public void send(final String msg) {
// 将接收到的内容推送到所有的浏览器
Browser.withAllSessions(new Runnable() {
@Override
public void run() {
Util.setValue("msg", msg);
}
});
}

4. 新建client.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>dwr_demo</title>
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript' src='dwr/util.js'></script>
<script type='text/javascript' src='dwr/interface/CoreServlet.js'></script>
</head>
<body>
<h1>服务器推送的内容</h1>
<span id="msg"></span>
</body>
<script type="text/javascript">
window.onload = function() {
//开启逆向Ajax功能
dwr.engine.setActiveReverseAjax(true);
}
</script>
</html>

5. 修改index.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>dwr_demo</title>
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript' src='dwr/util.js'></script>
<script type='text/javascript' src='dwr/interface/CoreServlet.js'></script>
</head> <body>
<input type="button" value="发送" onclick="sayHello();">
<br>
<input type="text" id="getHello">
<input type="button" value="发送" onclick="getHello();">
<input type="text" id="getHelloValue">
<br>
<input type="text" id="sendMsg">
<input type="button" value="推送" onclick="sendMsg();">
</body>
<script type="text/javascript">
function sayHello() {
CoreServlet.sayHello();
}
function getHello() {
var name = dwr.util.getValue("getHello");
CoreServlet.getHello(name, function(data) {
dwr.util.setValue("getHelloValue", data);
});
}
function sendMsg() {
var msg = dwr.util.getValue("sendMsg");
CoreServlet.send(msg);
}
</script>
</html>

6. 测试(注意,需要JDK1.7及以上)

DWR第二篇之逆向Ajax的更多相关文章

  1. DWR第三篇之逆向Ajax升级

    1. 本示例在第二篇架构基础上添加代码 2.在client.jsp开头的地方添加如下代码: 本示例需要做的是定向推送,那么就需要浏览器进行登录,从而进行定向的推送功能,为了节省时间,这里不做登录模块了 ...

  2. 【DWR系列02】-DWR逆向Ajax即服务器推送

    .literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: no ...

  3. 解剖SQLSERVER 第二篇 对数据页面头进行逆向(译)

    解剖SQLSERVER 第二篇  对数据页面头进行逆向(译) http://improve.dk/reverse-engineering-sql-server-page-headers/ 在开发Orc ...

  4. angularjs学习第三天笔记(过滤器第二篇---filter过滤器及其自定义过滤器)

    您好,我是一名后端开发工程师,由于工作需要,现在系统的从0开始学习前端js框架之angular,每天把学习的一些心得分享出来,如果有什么说的不对的地方,请多多指正,多多包涵我这个前端菜鸟,欢迎大家的点 ...

  5. 撩课-Web架构师养成系列(第二篇)-async

    前言 Web架构师养成系列共15篇,每周更新一篇,主要分享.探讨目前大前端领域(前端.后端.移动端)企业中正在用的各种成熟的.新的技术.部分文章也会分析一些框架的底层实现,让我们做到知其然知其所以然. ...

  6. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  7. 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

    从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  8. (转)从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

    原文地址:  http://www.cnblogs.com/lyhabc/p/4682028.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第二篇,主要讲述如何搭建故障转移集 ...

  9. 深入理解javascript对象系列第二篇——属性操作

    × 目录 [1]查询 [2]设置 [3]删除[4]继承 前面的话 对于对象来说,属性操作是绕不开的话题.类似于“增删改查”的基本操作,属性操作分为属性查询.属性设置.属性删除,还包括属性继承.本文是对 ...

随机推荐

  1. nodejs之使用express框架连接mysql数据库,返回jsonapi数据

    var express = require('express');var router = express.Router();var url = require('url');var mysql = ...

  2. spring自带测试配置

    spring自带的测试注解 @ContextConfiguration(locations="classpath:applicationContext.xml")@RunWith( ...

  3. Codeforces Round #548 (Div. 2) E 二分图匹配(新坑) or 网络流 + 反向处理

    https://codeforces.com/contest/1139/problem/E 题意 有n个学生,m个社团,每个学生有一个\(p_i\)值,然后每个学生属于\(c_i\)社团, 有d天,每 ...

  4. oracle 索引移动到不同的分区

    最近系统空间不够,要进行数据库清理,truncate数据之后,发现数据不连续,导致这个表空间占用巨大,想过使用shrink.move.但是shrink得效率比较慢,选择了move.语句大概如此: SE ...

  5. 软件光栅器实现(四、OBJ文件加载)

    本节介绍软件光栅器的OBJ和MTL文件加载,转载请注明出处. 在管线的应用程序阶段,我们需要设置光栅器所渲染的模型数据.这些模型数据包括模型顶点的坐标.纹理.法线和材质等等,可以由我们手动编写,也可以 ...

  6. Django认证系统

    一.cooie与session 1.1 cookie与session cooie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又要保持状态,因此cookie就是在这样的一个场 ...

  7. gc的real时间比user时间长

    https://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1 htt ...

  8. Linux下Memcache服务器端的安装

    最近在研究怎么让Discuz!去应用Memcache去做一些事情,记录下Memcache安装的过程. Linux下Memcache服务器端的安装服务器端主要是安装memcache服务器端,目前的最新版 ...

  9. SVN完全备份,增量备份,库同步

    svn备份一般采用三种方式:1)svnadmin dump 2)svnadmin hotcopy 3)svnsync. 优缺点分析: ============== 第一种svnadmin hotcop ...

  10. Virtio: An I/O virtualization framework for Linux

    The Linux kernel supports a variety of virtualization schemes, and that's likely to grow as virtuali ...