`
xiongzhenhui
  • 浏览: 209711 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

使用DWR2异步实现服务器推技术

 
阅读更多

因IE下AJAX最长连接为1小时,无法满足部分变态需求,特此使用DWR推技术实现请求SESSION传输。

前提:系统支持SESSION,这只是工程下例子,别问我为什么不能在你工程下运行。。。。

1、在工程下配置DWR,activeReverseAjaxEnabled属性为允许反转。web.xml和dwr.xml在同一目录,因此没有进行dwr.xml目录引用,如果配置多DWR文件参照config-1,名称必须已config开头进行配置。

web.xml

<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>false</param-value>
</init-param>
<!--<init-param>
<param-name>config-1</param-name>
<param-value>/WEB-INF/dwr/dwr.xml</param-value>
</init-param>-->
<init-param>
<param-name>maxCallCount</param-name>
<param-value>1000</param-value>
</init-param>
<init-param>
<param-name>scriptSessionTimeout</param-name>
<param-value>259200000</param-value>
</init-param>
<init-param>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>classes</param-name>
<param-value>java.lang.Object</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
2、配置DWR文件,略
dwr.xml

<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
"http://www.getahead.ltd.uk/dwr//dwr20.dtd">
<dwr>
<allow>
<create creator="spring" javascript="TestDwService">
<param name="beanName" value="TestDwr"/>
<include method="jsonForDw"/>
</create>
</allow>
</dwr>
3、实现类,默认最后一参数为HttpServletRequest,只发现支持5参数的方法,所以至此回调函数参最多支持5个。

TestDwr.java

public void jsonForDw(Integer st,String local,String callFunction,HttpServletRequest request) {
省略了其他操作。
DwrBuntUtil dwrBunt=new DwrBuntUtil();
List dwrList=new ArrayList();
dwrList.add("xxoo");
dwrBunt.bunt(request, local, callFunction, dwrList);
}
4、封装类,实现推过程,因util.addFunctionCall支持不够强,也没找到好的解决办法。。自己便利吧。。

DwrBuntUtil.java

 

package com.vstsoft.csi.util;

import java.util.Collection;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.directwebremoting.ServerContextFactory;
import org.directwebremoting.proxy.dwr.Util;
/**
* 使用DWR服务器推技术实现客户端访问超长连接(解决IE下AJAX一小时支持问题)
* @author chenyanji
*
*/
public class DwrBuntUtil {
/**
* DWR实现推技术
* @param request DWR当前请求
* @param local 页面地址,以工程同目录真实地址为准,如:/部署名/pages/index.jsp
* @param callFunction 回调JS方法名称,如:"count"
* @param parameter 回调方法参数数组,最多支持5个参数,数组0-4
*/
public void bunt(HttpServletRequest request,String local,String callFunction,List parameter){
try{
Collection scriptSessionsByPage = ServerContextFactory.get(request.getSession().getServletContext()).getScriptSessionsByPage(local);
Util util = new Util(scriptSessionsByPage);
int size=parameter.size();
if(size==5){
util.addFunctionCall(callFunction,parameter.get(0),parameter.get(1),parameter.get(2),parameter.get(3),parameter.get(4));
}else if(size==4){
util.addFunctionCall(callFunction,parameter.get(0),parameter.get(1),parameter.get(2),parameter.get(3));
}else if(size==3){
util.addFunctionCall(callFunction,parameter.get(0),parameter.get(1),parameter.get(2));
}else if(size==2){
util.addFunctionCall(callFunction,parameter.get(0),parameter.get(1));
}else if(size==1){
util.addFunctionCall(callFunction,parameter.get(0));
}else if(size==0){
util.addFunctionCall(callFunction);
}
scriptSessionsByPage=null;
util=null;
}catch(Exception e){
//throw e;
}
}
}
5、jsp引用,1、3包为必须引用,2包如果没有用到UTIL类可以不引。
testDwr.jsp

<script type='text/javascript' src='/newsx/dwr/engine.js'></script>
<script type='text/javascript' src='/newsx/dwr/util.js'></script>
<script type='text/javascript' src='/newsx/dwr/interface/TestDwService.js'></script>
6、js调用,最后一参数默认为回掉方法,使用推技术此方法无效,所以置成NULL 

test.js

function queryDwr(){
setActiveReverseDwr(dwr,true,true);
TestDwService.jsonForDw(0,"/newsx/pages/test/testDwr.jsp","jspalert",null);
}
function jspalert(str){
lovDwStore.loadData(Ext.decode(str));
setActiveReverseDwr(dwr,false,false);
}
7、封装JS,本项目使用了EXT,没用的可以自行改造。
common.js

/**
* DWR设置长连接/取消长连接(dwr,true/false,true/false)
* (dwr对象,长连接控制,MASK控制)
*/
function setActiveReverseDwr(obj,boo,mask){
obj.engine.setActiveReverseAjax(boo);
if(typeof mask != "undefined"){

使用DWR2异步实现服务器推技术

中国自学编程网


因IE下AJAX最长连接为1小时,无法满足部分变态需求,特此使用DWR推技术实现请求SESSION传输。

前提:系统支持SESSION,这只是工程下例子,别问我为什么不能在你工程下运行。。。。

1、在工程下配置DWR,activeReverseAjaxEnabled属性为允许反转。web.xml和dwr.xml在同一目录,因此没有进行dwr.xml目录引用,如果配置多DWR文件参照config-1,名称必须已config开头进行配置。

web.xml

<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>false</param-value>
</init-param>
<!--<init-param>
<param-name>config-1</param-name>
<param-value>/WEB-INF/dwr/dwr.xml</param-value>
</init-param>-->
<init-param>
<param-name>maxCallCount</param-name>
<param-value>1000</param-value>
</init-param>
<init-param>
<param-name>scriptSessionTimeout</param-name>
<param-value>259200000</param-value>
</init-param>
<init-param>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>classes</param-name>
<param-value>java.lang.Object</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
2、配置DWR文件,略
dwr.xml

<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
"http://www.getahead.ltd.uk/dwr//dwr20.dtd">
<dwr>
<allow>
<create creator="spring" javascript="TestDwService">
<param name="beanName" value="TestDwr"/>
<include method="jsonForDw"/>
</create>
</allow>
</dwr>
3、实现类,默认最后一参数为HttpServletRequest,只发现支持5参数的方法,所以至此回调函数参最多支持5个。

TestDwr.java

public void jsonForDw(Integer st,String local,String callFunction,HttpServletRequest request) {
省略了其他操作。
DwrBuntUtil dwrBunt=new DwrBuntUtil();
List dwrList=new ArrayList();
dwrList.add("xxoo");
dwrBunt.bunt(request, local, callFunction, dwrList);
}
4、封装类,实现推过程,因util.addFunctionCall支持不够强,也没找到好的解决办法。。自己便利吧。。

DwrBuntUtil.java

 

package com.vstsoft.csi.util;

import java.util.Collection;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.directwebremoting.ServerContextFactory;
import org.directwebremoting.proxy.dwr.Util;
/**
* 使用DWR服务器推技术实现客户端访问超长连接(解决IE下AJAX一小时支持问题)
* @author chenyanji
*
*/
public class DwrBuntUtil {
/**
* DWR实现推技术
* @param request DWR当前请求
* @param local 页面地址,以工程同目录真实地址为准,如:/部署名/pages/index.jsp
* @param callFunction 回调JS方法名称,如:"count"
* @param parameter 回调方法参数数组,最多支持5个参数,数组0-4
*/
public void bunt(HttpServletRequest request,String local,String callFunction,List parameter){
try{
Collection scriptSessionsByPage = ServerContextFactory.get(request.getSession().getServletContext()).getScriptSessionsByPage(local);
Util util = new Util(scriptSessionsByPage);
int size=parameter.size();
if(size==5){
util.addFunctionCall(callFunction,parameter.get(0),parameter.get(1),parameter.get(2),parameter.get(3),parameter.get(4));
}else if(size==4){
util.addFunctionCall(callFunction,parameter.get(0),parameter.get(1),parameter.get(2),parameter.get(3));
}else if(size==3){
util.addFunctionCall(callFunction,parameter.get(0),parameter.get(1),parameter.get(2));
}else if(size==2){
util.addFunctionCall(callFunction,parameter.get(0),parameter.get(1));
}else if(size==1){
util.addFunctionCall(callFunction,parameter.get(0));
}else if(size==0){
util.addFunctionCall(callFunction);
}
scriptSessionsByPage=null;
util=null;
}catch(Exception e){
//throw e;
}
}
}
5、jsp引用,1、3包为必须引用,2包如果没有用到UTIL类可以不引。
testDwr.jsp

<script type='text/javascript' src='/newsx/dwr/engine.js'></script>
<script type='text/javascript' src='/newsx/dwr/util.js'></script>
<script type='text/javascript' src='/newsx/dwr/interface/TestDwService.js'></script>
6、js调用,最后一参数默认为回掉方法,使用推技术此方法无效,所以置成NULL 

test.js

function queryDwr(){
setActiveReverseDwr(dwr,true,true);
TestDwService.jsonForDw(0,"/newsx/pages/test/testDwr.jsp","jspalert",null);
}
function jspalert(str){
lovDwStore.loadData(Ext.decode(str));
setActiveReverseDwr(dwr,false,false);
}
7、封装JS,本项目使用了EXT,没用的可以自行改造。
common.js

/**
* DWR设置长连接/取消长连接(dwr,true/false,true/false)
* (dwr对象,长连接控制,MASK控制)
*/
function setActiveReverseDwr(obj,boo,mask){
obj.engine.setActiveReverseAjax(boo);
if(typeof mask != "undefined"){
if(mask){
Ext.getBody().mask("正在查询,请稍后...","x-mask-loading");
}else{
Ext.getBody().unmask();
}
}
}

重要:在JS中调用DWR前加允许长连接,后台配置为activeReverseAjaxEnabled:true支持轮循,当执行成功后回调JS中一定要对当前连接进行关闭,否则直到页面关闭前一直轮循;默认长轮循间隔为1分钟。


if(mask){
Ext.getBody().mask("正在查询,请稍后...","x-mask-loading");
}else{
Ext.getBody().unmask();
}
}
}

重要:在JS中调用DWR前加允许长连接,后台配置为activeReverseAjaxEnabled:true支持轮循,当执行成功后回调JS中一定要对当前连接进行关闭,否则直到页面关闭前一直轮循;默认长轮循间隔为1分钟。

分享到:
评论

相关推荐

    dwr推技术实现服务器推送数据

    Direct Web Remoting (DWR) 是一种开源的Java库,它允许JavaScript在浏览器和服务器之间进行交互,从而实现在Web应用程序中的Ajax(异步JavaScript和XML)功能。DWR的独特之处在于它的“反转Ajax”(Reverse Ajax)...

    dwr实现的服务器推demo

    在这个"**dwr实现的服务器推demo**"中,我们看到一个实例,展示了如何利用DWR的技术来实现实时的、无需刷新的服务器推送功能。 服务器推是一种技术,它允许服务器主动地将数据发送到客户端,而不需要客户端(通常是...

    使用dwr+spring实现消息推送

    在IT行业中,消息推送是一项重要的技术,它使得服务器能够实时地向客户端发送数据,而无需客户端不断地轮询请求。在本教程中,我们将探讨如何利用Direct Web Remoting (DWR) 和Spring框架来实现这样的功能。 DWR是...

    使用dwr2.0实现服务器推客户端

    在本文中,我们将深入探讨如何使用Direct Web Remoting (DWR) 2.0来实现服务器推技术,以便实时地将信息传递给客户端。DWR是一个JavaScript库,它允许Web应用进行异步通信,实现类似Ajax的效果,但支持服务器向...

    dwr实现服务器推技术,兼容低版本IE

    DWR通过使用ActiveXObject和IFrame等技术,能够在这些旧版本的IE上实现Ajax和服务器推送功能。同时,开发者需要注意IE的内存管理和兼容性问题,确保应用程序的稳定性和性能。 4. **DEMO项目结构** - `.classpath`...

    DWR服务器推送技术(实时)

    DWR使用一种称为Reverse Ajax或Comet的技术来实现服务器推送。它创建了一个持久化的HTTP连接,使得服务器可以在准备好新数据时立即发送,而不需要等待客户端的请求。DWR提供了一种简单的方式来注册JavaScript函数,...

    java+dwr框架实现聊天室

    Java+dwr框架实现聊天室是使用Java语言和dwr框架实现的服务器推技术,实现了实时通信的聊天室功能。下面将详细介绍该技术的实现过程和相关知识点。 一、dwr 框架简介 dwr(Direct Web Remoting)是一种基于Ajax...

    DWR服务器推送技术实现WebQQ

    **DWR(Direct Web Remoting)服务器推送技术详解与WebQQ实现** DWR,全称为Direct Web Remoting,是一种在JavaScript和Java之间进行远程方法调用(Remote Method Invocation,RMI)的技术,允许Web应用程序实现...

    ztree+dwr实现的异步加载树形菜单

    通过这样的方式,ZTree和DWR的结合使用,不仅提升了用户体验,减少了不必要的网络传输,还使得后台数据的更新与前台展示无缝对接,实现了高效、流畅的异步加载树形菜单。在实际项目中,这种技术组合广泛应用在权限...

    DWR集合Spring实现异步提交

    在DWR异步提交的场景中,Struts可以用来接收和处理DWR发起的请求,并调用业务逻辑层。 2. **Hibernate 3.0**:作为ORM框架,Hibernate负责将Java对象映射到数据库表,简化数据操作。在Spring中,我们可以使用`...

    dwr服务器推送,dwr.jar,推送,服务器ajax,dwr服务推送例子

    服务器推送技术在DWR中的实现主要通过以下几种方式: - **Polling**:定时轮询是最常见的实现方式,客户端以一定的频率向服务器发送请求,询问是否有新的数据。 - **Reverse Ajax**:DWR支持真正的服务器推送,即当...

    DWR 简单额服务器推送技术DEMO

    在这个“DWR简单服务器推送技术DEMO”中,我们将探讨如何利用DWR来实现在服务器端向特定客户端页面推送数据,即使这些页面并未主动发起请求。 服务器推送技术是相对于传统的客户端请求、服务器响应模式而言的。在...

    DWR与后台异步交互简单例子

    **DWR(Direct Web Remoting)**是一种JavaScript库,它允许Web应用程序与服务器进行异步交互,实现Ajax功能。在本“DWR与后台异步交互简单例子”中,我们将探讨如何利用DWR来实现前后端的数据通信,提高用户体验。 ...

    Dwr异步刷新事例,可以参考一下!

    标题“Dwr异步刷新事例”表明我们将探讨如何使用DWR来实现在Web页面上的异步刷新。在传统的Web应用中,用户每次交互都需要重新加载整个页面,而异步刷新则只更新页面的部分内容,提高了用户体验。 首先,DWR的工作...

    web编程异步刷新dwr技术jar包

    DWR (Direct Web Remoting) 是一种用于Java Web应用程序的开源框架,它允许在客户端JavaScript和服务器端Java之间进行...在客户端,可以通过引入DWR生成的JavaScript文件来调用服务器端的方法,实现异步刷新的功能。

    dwr实现异步交互所需的jar文件

    Direct Web Remoting (DWR) 是一个开源Java库,它允许Web应用程序在浏览器和服务器之间进行异步交互,实现JavaScript与服务器端Java对象的直接调用。...正确配置和使用这些文件是实现DWR异步交互的关键步骤。

    dwr异步操作

    在"dwr异步操作"这个主题中,我们需要关注以下几个关键知识点: 1. **DWR架构**:DWR由三部分组成:`Client-side API`、`Server-side Engine` 和 `Configuration`。Client-side API包含JavaScript库,允许前端与...

    dwr spring服务器主动推送示例代码

    本示例将深入探讨如何使用DWR与Spring框架集成,实现服务器主动推送功能。 首先,我们需要理解DWR的核心概念: 1. **DWR Engine**: 是DWR的核心组件,它处理客户端和服务器之间的通信,包括JavaScript到Java的调用...

    dwr3实现推送功能

    DWR (Direct Web Remoting) 是一个开源的Java库,它允许JavaScript在浏览器端与服务器端的Java对象进行交互,从而实现AJAX(Asynchronous JavaScript and XML)应用。在DWR 3版本中,它提供了丰富的API和工具,使得...

    springMvc + dwr 注解 实现消息推送

    5. **前端页面**:使用JavaScript和DWR API调用服务器端的方法,实现实时消息的推送和显示。 在前端,我们可以利用JavaScript事件监听器来触发DWR调用,当有新的消息时,前端页面会立即更新。此外,DWR还支持异步...

Global site tag (gtag.js) - Google Analytics