`

DWR数据反推实例

 
阅读更多
http://blog.sina.com.cn/s/blog_72a0bac20100qsp2.html

http://www.elecfans.com/news/wangluo/20100804221337.html

http://blog.csdn.net/shimiso/article/details/8151362

http://wenku.baidu.com/view/150b957e168884868762d61f.html

http://lgf444.iteye.com/blog/190098

http://www.blogjava.net/zhutianxiang/archive/2009/03/05/258092.html

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代码 
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<!-- 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>
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> <init-param> <param-name>debug</param-name>
                                    </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> --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping>
Xml代码 
<listener>
<listener-class>org.directwebremoting.servlet.EfficientShutdownServletContextAttributeListener</listener-class>
</listener>
<listener> <listener-class>org.directwebremoting.servlet.EfficientShutdownServletContextAttributeListener</listener-class> </listener>
Xml代码 
<listener>
<listener-class>org.directwebremoting.servlet.EfficientShutdownServletContextListener</listener-class>
</listener>
<listener> <listener-class>org.directwebremoting.servlet.EfficientShutdownServletContextListener</listener-class> </listener>


2、在dwr.xml中增加以下配置信息

Xml代码 
<create creator="new" javascript="DWRHelper">
<param name="class" value="com.cjm.web.dwr.DWRHelper"/>
<include method="addMessage"/>
<include method="test"/>
</create>
<convert converter="bean" match="com.cjm.web.dwr.Message">
<param name="include" value="id,text"/>
</convert>
<create creator="new" javascript="DWRHelper"> <param name="class" value="com.cjm.web.dwr.DWRHelper"/> <include method="addMessage"/> <include method="test"/> </create> <convert converter="bean" match="com.cjm.web.dwr.Message"> <param name="include" value="id,text"/> </convert>


3、pojo类Message的源码

Java代码 
public class Message {
private long id = System.currentTimeMillis();
private String text;
public Message(){
}
public Message(String newText){
text = newText;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
public class Message { private long id = System.currentTimeMillis(); private String text; public Message(){ } public Message(String newText){ text = newText; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getText() { return text; } public void setText(String text) { this.text = text; } }


4、DWRHelper类源码

Java代码 
public class DWRHelper {
private static LinkedList<Message> messages = new LinkedList<Message>();
private static ReentrantLock lock = new ReentrantLock(); //JDK5锁
public void addMessage(String text){
try{
lock.lock();
if(text!=null && text.trim().length()>0){
messages.addFirst(new Message(text));
if(messages.size()>10){
messages.removeLast();
}
}
}catch(Exception ex){
ex.printStackTrace();
}finally{
lock.unlock();
}
//获得DWR上下文
WebContext webContext = WebContextFactory.get();
//获取当前页面URL,比如/ext3/test_tag.jsp
String currentPage = webContext.getCurrentPage();
//当前脚本sessin
ScriptSession scriptSession = webContext.getScriptSession();
//设置页面控件的值
Util util = new Util(scriptSession);
util.setValue("text", ""); //这里是清空页面输入框的值
//设置脚本sessin的属性值
scriptSession.setAttribute("uid", "cjm");
//获取脚本session的属性值
for(Iterator it=scriptSession.getAttributeNames();it.hasNext();){
String attrName = (String)it.next();
System.out.println(attrName + "=" + scriptSession.getAttribute(attrName));
}
//获取所有浏览当前页面的脚本session
Collection<ScriptSession> sessions = webContext.getScriptSessionsByPage(currentPage);
Util utilAll = new Util(sessions);
//执行客户端脚本
ScriptBuffer script = new ScriptBuffer();
script.appendScript("clientFunction(")
.appendData(scriptSession.getAttribute("uid"))
.appendScript(");");
for(ScriptSession session: sessions){
session.addScript(script);
}
//更新这些脚本session的一些元素
utilAll.removeAllOptions("messages");
utilAll.addOptions("messages", messages, "id", "text");
}
}
public class DWRHelper { private static LinkedList<Message> messages = new LinkedList<Message>(); private static ReentrantLock lock = new ReentrantLock(); //JDK5锁 public void addMessage(String text){ try{ lock.lock(); if(text!=null && text.trim().length()>0){ messages.addFirst(new Message(text)); if(messages.size()>10){ messages.removeLast(); } } }catch(Exception ex){ ex.printStackTrace(); }finally{ lock.unlock(); } //获得DWR上下文 WebContext webContext = WebContextFactory.get(); //获取当前页面URL,比如/ext3/test_tag.jsp String currentPage = webContext.getCurrentPage(); //当前脚本sessin ScriptSession scriptSession = webContext.getScriptSession(); //设置页面控件的值 Util util = new Util(scriptSession); util.setValue("text", ""); //这里是清空页面输入框的值 //设置脚本sessin的属性值 scriptSession.setAttribute("uid", "cjm"); //获取脚本session的属性值 for(Iterator it=scriptSession.getAttributeNames();it.hasNext();){ String attrName = (String)it.next(); System.out.println(attrName + "=" + scriptSession.getAttribute(attrName)); } //获取所有浏览当前页面的脚本session Collection<ScriptSession> sessions = webContext.getScriptSessionsByPage(currentPage); Util utilAll = new Util(sessions); //执行客户端脚本 ScriptBuffer script = new ScriptBuffer(); script.appendScript("clientFunction(") .appendData(scriptSession.getAttribute("uid")) .appendScript(");"); for(ScriptSession session: sessions){ session.addScript(script); } //更新这些脚本session的一些元素 utilAll.removeAllOptions("messages"); utilAll.addOptions("messages", messages, "id", "text"); } }


5、JSP页面源码

Html代码 
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script type='text/javascript' src='/ext3/dwr/engine.js'></script>
<script type='text/javascript' src='/ext3/dwr/util.js'></script>
<script type='text/javascript' src='/ext3/dwr/interface/DWRHelper.js'></script>
</head>
<!-- 通过 dwr.engine.setActiveReverseAjax(true); 启动该页面的Reverse Ajax功能 -->
<body onload="dwr.engine.setActiveReverseAjax(true);sendMessage();">
<p>输入信息: <input id="text" onkeypress="dwr.util.onReturn(event, sendMessage)" />
<input type="button" value="Send" onclick="sendMessage()" /></p>
<script type="text/javascript">
function sendMessage() {
DWRHelper.addMessage(dwr.util.getValue("text"));
}
</script>
<hr/>
<select id="messages"></select>
</body>
</html>
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <script type='text/javascript' src='/ext3/dwr/engine.js'></script> <script type='text/javascript' src='/ext3/dwr/util.js'></script> <script type='text/javascript' src='/ext3/dwr/interface/DWRHelper.js'></script> </head> <!-- 通过 dwr.engine.setActiveReverseAjax(true); 启动该页面的Reverse Ajax功能 --> <body onload="dwr.engine.setActiveReverseAjax(true);sendMessage();"> <p>输入信息: <input id="text" onkeypress="dwr.util.onReturn(event, sendMessage)" /> <input type="button" value="Send" onclick="sendMessage()" /></p> <script type="text/javascript"> function sendMessage() { DWRHelper.addMessage(dwr.util.getValue("text")); } </script> <hr/> <select id="messages"></select> </body> </html>

分享到:
评论
1 楼 zhaolei95 2013-05-09  
hello,有没有后台主动推送的实例,我做了一个context = WebContextFactory.get();老是为null,求指导。

相关推荐

    dwr反推简单例子

    在"**dwr反推简单例子**"中,我们将会探讨如何使用DWR进行数据的反向推送,即由服务器主动向客户端推送数据,而不仅仅是响应客户端的请求。 首先,DWR的核心概念包括三个主要部分:`Engine`、`Configuration`和`...

    dwr反推demo

    **DWR反推技术详解** DWR(Direct Web Remoting)是一种开源JavaScript库,它允许在Web应用程序中实现Ajax(Asynchronous JavaScript and XML)通信,从而实现客户端与服务器端的实时交互。DWR2.x版本引入了反推...

    dwr 反推技术

    在"通过dwr反推技术实现web聊天无刷新跟新技术"这个主题中,我们将深入探讨DWR如何用于构建实时聊天应用,并结合Comet技术来优化用户体验。 首先,DWR的工作原理基于Ajax(Asynchronous JavaScript and XML),但...

    dwr+spring实例

    本实例"DWRSpring实例"是一个使用DWR与Spring框架结合的消息发布系统,包含了基础的CRUD(Create、Read、Update、Delete)操作。通过这个例子,我们可以深入理解DWR和Spring如何协同工作,以及它们在实际开发中的...

    spring整合dwr反推技术

    这种技术的核心在于反推(Reverse Ajax),即服务器主动向客户端推送数据,而不仅仅是响应客户端的请求,极大地提高了用户体验,尤其是在需要实时更新的应用场景中,比如在线聊天应用。 在Spring框架中整合DWR,...

    dwr 实例 Dwr实例

    自己写的dwr实例。方便大家学习,包括jar文件,希望对大家有帮助

    dwr服务器端反推demo

    DWR的反推(Push)技术就是基于这个理念,让服务器能够主动推送数据到客户端,而不是等待客户端发起请求。 二、服务器端反推(Push) 服务器端反推是DWR的一个重要功能,它允许服务器在有新数据可用时立即发送给...

    dwr实例dwr实例dwr实例

    dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr实例dwr...

    dwr3.0反向实例

    在"DWR 3.0反向实例"中,我们将深入探讨这个版本的新特性、配置过程以及如何通过一个简单的Clock实现来演示其工作原理。 DWR 3.0相对于早期的2.0版本,引入了一些重要的改进,包括性能提升、错误处理机制的优化以及...

    dwr推技术官方实例

    标题中的“dwr推技术官方实例”是指DWR提供的关于其推技术的实际操作示例,这些示例可能涵盖了DWR 2.0.4及以上版本的最新功能。由于高质量的实例资源在网络上可能不易找到,所以这份实例集合显得尤为宝贵。 描述中...

    dwr经典实例(9个常用实例)

    这个压缩包文件"dwrtest"很可能包含了9个经典的DWR实例,这些实例通常会展示DWR的主要功能和用法。以下是关于DWR的一些关键知识点的详细介绍: 1. **远程方法调用(RMI-like)**: DWR的核心特性是能够像本地方法一样...

    Dwr的使用实例

    Dwr的使用实例 war文件 1. lib要导入包: dwr-2.0.M3.jar 2. web.xml配置: 3. WEB-INF下dwr.xml的配置 4. bean例子: 5. index.jsp的例子 详细内容请下载

    dwr补全查询实例

    DWR简化了JavaScript与服务器端Java对象的交互,使得前端可以方便地调用后端的Java方法,从而实现在网页上的动态数据更新和异步操作。 在本实例"**dwr补全查询**"中,我们关注的是如何利用DWR实现类似百度搜索那样...

    dwr实例,从后台取数据显示

    在你提供的实例中,“dwr实例,从后台取数据显示”表明这是一个使用DWR从服务器获取数据并在前端展示的简单应用。 1. **DWR的工作原理**:DWR通过在服务器上设置一个代理,允许JavaScript调用Java方法,就像它们是...

    JavaScript:DWR的用法实例

    在实际开发中,DWR的用法实例可能包括但不限于以下几种情况: - **用户界面实时更新**:例如,在聊天应用中,当有新消息时,服务器可以通过DWR主动向客户端发送更新,实时显示新消息。 - **数据表格动态加载**:在...

    DWR包 教程 实例

    2. **Reverse AJAX**:DWR实现了所谓的“反向AJAX”,即服务器可以主动推送数据到客户端,而不仅仅是响应客户端的请求。 3. **AutoComplete**:DWR提供了一个方便的自动补全功能,用于在输入框中为用户提供建议,...

    dwr搜索商品实例DWRshop.rar

    本实例“DWRshop”是基于DWR实现的商品搜索功能的示例,旨在展示如何运用DWR技术进行动态数据交换,实现实时的商品搜索。 一、DWR基础介绍 DWR的核心功能在于提供了一种简单的方式,让JavaScript可以调用服务器端的...

    dwr.demo dwr实例

    这个"**dwr.demo dwr实例**"很可能是用来展示如何在实际项目中集成和使用DWR的示例代码。在深入探讨之前,让我们先理解一下DWR的基本概念。 DWR的核心功能是提供了一个JavaScript API,使得JavaScript可以调用...

    dwr整合hibernate实例

    本实例将详细讲解如何将DWR与Hibernate整合,实现网页上的数据添加、查询、删除和修改功能。 首先,我们需要在项目中引入DWR和Hibernate的相关依赖。DWR通常需要dwr-engine.jar、dwr-api.jar以及dwr-spring.jar等,...

    DWR可运行实例

    这个"可运行实例"提供了DWR的实际操作示例,让你能够直接运行并理解其工作原理,非常适合初学者和开发者快速上手。下面将详细解释DWR的核心概念和它在消息推送中的应用。 DWR允许JavaScript与服务器端的Java对象...

Global site tag (gtag.js) - Google Analytics