`
xiongzhenhui
  • 浏览: 205146 次
  • 性别: 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的介绍以及使用范例.还有使用DWR的相关配置

    它的代码就像Ajax魔法一样,你感觉调用就像发生在浏览器端,但是实际上代码调用发生在服务器端,DWR负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC...

    基于客户端轮询服务器思想实现的即时通信Demo

    该工程基于Ajax技术,采用客户端轮询服务器实现即时通信的简单Demo。 其中,com.gis.lp.webim.CClient作为主要的服务器端类,实现对信息的存储以及插入和读取:客户端...客户端使用Ajax技术,利用DWR库实现异步访问。

    DWR.xml配置文件说明书(含源码)

    这样就可以限定DWR不能调用Fred对象的getProperty1()和getProperty2()方法,通常这被成为拒绝访问方式,当然你也可以采用下面的方式配置可以访问的方法(授权访问方式) , property2"/&gt; 较好的安全控制大部分都是采用...

    dwr框架包含帮助文档

    dwr它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据.另外一方面一个JavaScript库可以帮助网站开发人员轻松地利用获取的数据来动态改变网页的内容. DWR采取了一个类似AJAX的...

    ext+Json+dwr+spring+hibernate整合项目实例与资源

    现如今,在javaEE应用...在SSH上因为Spring本身有自己的MVC框架实现,所以我们用它来代替struts,在Ajax上我们采用两大框架组件extjs和dwr,前者可以做出非常炫目的页面效果,后者可以很方便地访问Java服务器端的代码。

    基于ssm的网咖服务系统

    使用 idea 编辑器开发,使用 Java-maven 管理项目,使用 SSM 框架,在异步处理上使用了 Dwr框架,并采用 Quartz 框架来定时完成指定任务,tomcat 服务器,数据库使用Mysql。灵活使用 dwr做到前端与后台的信息交互,...

    基于SSM的网咖服务系统压缩包

    使用 idea 编辑器开发,使用 Java-maven 管理项目,使用 SSM 框架,在异步处理上使用了 Dwr框架,并采用 Quartz 框架来定时完成指定任务,tomcat 服务器,数据库使用Mysql。灵活使用 dwr做到前端与后台的信息交互,...

    dwr的远程批量调用

    文章分类:Web前端 关键字: 批量调用和超时... 有时我们为了减少向服务器提交的次数,我们可以向服务器批量提交所要执行的方法。但这样又会给我们带来一些额外的负担,下面将给出解决方法和我们在开发中应该注意的地方。

    ajax之dwr框架的应用

    ajax之dwr框架,apache旗下的免费的开源框架,将服务器端的java方法转换成客户端的javascript代码,实现异步的刷新

    一个完成的dwr初学实例

    自己编写的一个完整的dwr实例。 通过浏览器,直接异步访问服务器端方法,并通过回调函数将返回结果进行展示。

    基于SSH架构的人力资源管理系统

    Spring是当今最主流的服务层框架,它的使用实现了应用程序的n层结构,最大程度的降低了各模块之间的耦合,提高了应用程序的开发效率和可维护性,选用的Struts2作为系统的表示层框架,在数据持久层方面则使用了...

    ExtJs人力资源管理系统(HRMS)

    在SSH上因为Spring本身有自己的MVC框架实现,所以我们用它来代替struts,在Ajax上我们采用两大框架组件extjs和dwr,前者可以做出非常炫目的页面效果,后者可以很方便地访问Java服务器端的代码。希望大家学习愉快!

    基本于J2EE的Ajax宝典.rar

    17.3 实现服务器处理类 35 17.4 实现客户端调用 40 17.4.1 暴露 Java对象 40 17.4.2 处理用户登录 41 17.4.3 周期性地获得用户相片列表 44 17.4.4 处理用户注册 45 17.4.5 处理上传 47 17.5 客户端 JSP 页面 ...

    Ajax详解.rar

    第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求 11 1.1 XMLHttpRequest 简介 12 1.2 用 XMLHttpRequest 发送请求 18 1.3 处理服务器响应 22 第 3 部分: Ajax 中的高级请求和响应 28 1.1 深入了解 HTTP 就绪...

    ajax简介

    该方法的关键在于对浏览器端的JavaScript、DHTML和与服务器异步通信的组合。本文也演示了启用这种方法是多么简单:利用一个Ajax框架(指DWR)构造一个应用程序,它直接从浏览器与后端服务进行通信。如果使用得当,...

    Jetty中文手册

    集群技术 JBoss Infinispan (from Redhat) Gigaspaces Terracotta WADI 基于数据库的Session集群配置教程 基于Terracota的Session集群配置教程 Web Frameworks DWR MyFaces JSF Reference Implementation Jakarta ...

    java项目之hrm人事管理项目(java毕业设计)

    2、后台:Struts2、动态代理、Mybatis框架、log4J日志框架、jstl 、jstl自定义分页标签、代码机器人、Dwr、POI(实现Excel文件的导入导出)等 3、数据库:Mysql 4、服务器:Tomcat 项目中涉及的功能: 1、项目以及...

    jquery插件使用方法大全

    无论prototype还是DWR都使用了$代替频繁的document.getElementById()操作。jQuery也这样做了,但是,它的功能远非如此,瞧瞧以下的jQuery代码,你就会发现它的美丽: 代码 var someElement = $("#myId"); 看起来比...

    Ajax应用实例

    该方法的关键在于对浏览器端的JavaScript、DHTML和与服务器异步通信的组合。本文也演示了启用这种方法是多么简单:利用一个Ajax框架(指DWR)构造一个应用程序,它直接从浏览器与后端服务进行通信。如果使用得当,...

    Ajax应用实例(精华)

    该方法的关键在于对浏览器端的JavaScript、DHTML和与服务器异步通信的组合。本文也演示了启用这种方法是多么简单:利用一个Ajax框架(指DWR)构造一个应用程序,它直接从浏览器与后端服务进行通信。如果使用得当,...

Global site tag (gtag.js) - Google Analytics