服务器推技术:使用DWR2异步实现服务器推技术来源: 发布时间:星期二, 2008年12月9日 浏览:36次 评论:0
因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 0
相关文章读者评论
发表评论 |