`

DWR的逆向Ajax的方式DWR消息推送的原理

 
阅读更多
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这一种。这三种方式,都可以在dwr的配置文件中进行相关的配置,若不进行配置,则默认是下面的第一种piggyback。

     1、piggyback方式
           这是默认的方式。
           如果后台有什么内容需要推送到前台,是要等到那个页面进行下一次ajax请求的时候,将需要推送的内容附加在该次请求之后,传回到页面。
           只有等到下次请求页面主动发起了,中间的变化内容才传递回页面。

      2、comet方式
           当服务端建立和浏览器的连接,将页面内容发送到浏览器之后,对应的连接并不关闭,只是暂时挂起。如果后面有什么新的内容需要推送到客户端的时候直接通过前面挂起的连接再次传送数据。
           服务器所能提供的连接数目是一定的,在大量的挂起的连接没有关闭的情况下,可能造成新的连接请求不能接入,从而影响到服务质量。

      3、polling方式
           由浏览器定时向服务端发送ajax请求,询问后台是否有什么内容需要推送,有的话就会由服务端返回推送内容。这种方式和我们直接在页面通过定时器发送 ajax请求,然后查询后台是否有变化内容的实现是类似的。只不过用了dwr之后这部分工作由框架帮我们完成了。


二、使用DWR的推技术的步骤
     1、在web.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>

    2、在dwr.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>

    3、pojo类Message的源码
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类源码
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页面源码
<%@ 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>
分享到:
评论

相关推荐

    dwr3消息推送

    - DWR3支持两种推送模式:Polling(轮询)和Reverse AJAX(逆向AJAX,也称为Comet)。 - Polling是客户端定期向服务器发送请求检查新消息,而Reverse AJAX则是在服务器端保持一个开放的HTTP连接,直到有新消息时才...

    Ajax框架DWR综合示例

    - **Reverse Ajax**:DWR支持逆向Ajax,即服务器可以主动推送数据到客户端,而不仅仅是响应客户端的请求。 - **AutoComplete**:提供自动完成功能,常用于搜索框或表单输入,根据用户输入的字符实时给出建议。 - ...

    Ajax框架dwr3.0中文

    1. **逆向Ajax(Reverse Ajax)**:DWR的核心特性之一是逆向Ajax,即由服务器向客户端推送数据,而不是传统的用户触发请求。这使得实时更新和交互成为可能。 2. **映射(Mapping)**:DWR通过配置文件或注解将Java...

    Dwr功能小例子

    而逆向Ajax则是服务器主动推送数据到客户端。 4. **DWR Engine**: DWR Engine是运行在服务器端的核心组件,负责处理来自JavaScript的请求,调用相应的Java方法,并将结果返回。 5. **JavaScript API**: DWR...

    dwr,jar和dwr-noncla.jar

    4. **Reverse Ajax**: DWR提供了逆向AJAX功能,即服务器可以主动向客户端推送数据,而无需客户端触发。 接下来,`dwr-noncla.jar`可能包含非版权许可的版本或者特定的构建,用于某些特殊环境或避免版权问题。具体...

    开发ajax之dwr入门例子

    - **Reverse Ajax**:DWR实现了一种逆向AJAX,即服务器可以主动向客户端推送数据,而不仅仅是响应客户端请求。 2. **DWR的安装与配置** - **导入DWR.jar**:首先,你需要将`dwr.jar`文件添加到项目的类路径中,...

    一个DWR例子,直接导入eclipse可运行

    而逆向Ajax则是服务器可以主动向客户端推送数据,增强了交互性。 3. **安全性和权限控制**: - 在`dwr.xml`中,你可以设置安全策略,限制哪些用户或角色可以访问特定的Java方法,确保应用的安全性。 4. **...

    dwr-test.zip_dwr test_dwr页面跳转

    - **逆向AJAX**:DWR的核心思想是逆向AJAX,即服务器主动推送数据到客户端,而不是等待客户端的请求。 - **Java Remote Objects (JSR223)**:DWR将Java对象暴露为JavaScript对象,使得前端可以直接调用后端的方法...

    dwr API dwr入门教程

    DWR的核心是将Java方法暴露给JavaScript,通过在服务器端创建一个称为"逆向Ajax"的通道,使得JavaScript能够调用远程服务器上的Java方法。这个过程涉及到几个关键组件: 1. **配置文件**:DWR的配置文件(通常为`...

    dwr-3.0.0.rar

    3. **逆向AJAX(Reverse AJAX)**:DWR的核心特性之一,它通过长轮询、IFrame或XMLHttpRequest等技术实现实时双向通信,让服务器可以主动推送数据到客户端。 4. **安全性**:DWR提供了一套安全机制,包括IP过滤、...

    dwr的一个小demo

    - **Reverse Ajax**:DWR实现了逆向Ajax,即服务器可以主动推送数据到客户端,增强了交互性。 2. **DWR的组成**: - **Engine**:核心组件,负责处理客户端请求和服务器端的交互。 - **Servlet**:DWRServlet,...

    dwr学习(一):简单dwr实例

    - **逆向Ajax (Reverse Ajax)**:使服务器可以主动向客户端推送数据。 4. **设置DWR** 设置DWR通常包括以下步骤: - 添加DWR的JAR包到项目的类路径中。 - 在Web应用的`web.xml`中配置DWR的Servlet。 - 创建`...

    DWR最新中文参考手册

    3. **逆向AJAX(Reverse AJAX)**:DWR支持服务器向客户端推送数据,即所谓的长轮询或Comet技术,使得服务器能够主动更新客户端的状态,例如实时股票报价或聊天室功能。 4. **兼容性**:DWR考虑到了不同浏览器的兼容...

    关于dwr及使用

    DWR使用了逆向Ajax(Reverse Ajax)的概念,即服务器主动向客户端推送数据。 2. **DWR的配置**:在项目中使用DWR,首先需要在服务器端进行配置,包括在web.xml中配置DWR过滤器和Servlet,以及在项目的类路径下创建...

    dwr入门

    这种方式使得服务器能够主动推送信息到客户端,提高了实时性。 2. **Java与JavaScript之间的通信**:DWR通过自动创建JavaScript对象映射(Remote Java Objects,RJOs)来简化Java和JavaScript之间的交互。开发者只...

    DWR例子

    - **逆向Ajax**:DWR利用Ajax技术实现了从客户端到服务器的双向通信,即不仅服务器可以向客户端推送数据,客户端也可以主动发起请求获取数据。 - **安全机制**:DWR提供了CSRF(跨站请求伪造)防护和白名单机制,...

    dwr2.0示例

    1. **逆向Ajax(Reverse Ajax)**:DWR的核心特性之一就是逆向Ajax,即服务器能够主动向客户端推送数据,而不仅仅局限于客户端发起请求。这一特性极大地提升了Web应用的实时性和交互性。 2. **自动安全机制**:DWR ...

    dwr相关资料(个人整理)

    6. **调试友好**: DWR提供了强大的调试工具,如DWR逆向工程(Reverse AJAX)控制台,可以方便地查看和测试远程方法调用。 7. **缓存管理**: DWR支持缓存管理,可以有效地减少网络传输,提高应用性能。 8. **批量...

    DWR帮助文档(中文)

    - **逆向Ajax(Reverse Ajax)**:DWR的基础,使得服务器能够主动推送数据到客户端,而不仅仅是响应客户端的请求。 - **配置文件**:DWR的配置主要在`dwr.xml`中进行,包括允许的类、方法、安全设置等。 - **安全性*...

Global site tag (gtag.js) - Google Analytics