http://www.c114.net ( 2009/3/30 14:10 )
因IE下AJAX最長連接為1小時,無法滿足部分變態(tài)需求,特此使用DWR推技術(shù)實現(xiàn)請求SESSION傳輸。
前提:系統(tǒng)支持SESSION,這只是工程下例子,別問我為什么不能在你工程下運行。。。。
1、在工程下配置DWR,activeReverseAjaxEnabled屬性為允許反轉(zhuǎn)。web.xml和dwr.xml在同一目錄,因此沒有進(jìn)行dwr.xml目錄引用,如果配置多DWR文件參照config-1,名稱必須已config開頭進(jìn)行配置。
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、實現(xiàn)類,默認(rèn)最后一參數(shù)為HttpServletRequest,只發(fā)現(xiàn)支持5參數(shù)的方法,所以至此回調(diào)函數(shù)參最多支持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、封裝類,實現(xiàn)推過程,因util.addFunctionCall支持不夠強(qiáng),也沒找到好的解決辦法。。自己便利吧。。
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服務(wù)器推技術(shù)實現(xiàn)客戶端訪問超長連接(解決IE下AJAX一小時支持問題)
* @author chenyanji
*
*/
public class DwrBuntUtil {
/**
* DWR實現(xiàn)推技術(shù)
* @param request DWR當(dāng)前請求
* @param local 頁面地址,以工程同目錄真實地址為準(zhǔn),如:/部署名/pages/index.jsp
* @param callFunction 回調(diào)JS方法名稱,如:"count"
* @param parameter 回調(diào)方法參數(shù)數(shù)組,最多支持5個參數(shù),數(shù)組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調(diào)用,最后一參數(shù)默認(rèn)為回掉方法,使用推技術(shù)此方法無效,所以置成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設(shè)置長連接/取消長連接(dwr,true/false,true/false)
* (dwr對象,長連接控制,MASK控制)
*/
function setActiveReverseDwr(obj,boo,mask){
obj.engine.setActiveReverseAjax(boo);
if(typeof mask != "undefined"){
使用DWR2異步實現(xiàn)服務(wù)器推技術(shù)