使用DWR2异步实现服务器推技术
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用DWR2异步实现服务器推技术——回调JS方法
作者:蓝色菜鸟
因IE下AJAX最长连接为1小时,无法满足部分变态需求,特此使用DWR推技术实现请求SESSION传输。
前提:系统支持SESSION,这只是工程下例子,别问我为什么不能在你工程下运行。。。。
1、在工程下配置DWR,activeReverseAjaxEnabled属性为允许反转。web.xml和dwr.xml在同一目录,因此没有进行dwr.xml目录引用,如果配置多DWR文件参照config-1,名称必须已config开头进行配置。maxWaitAfterWrite为又请求返回响应时间
web.xml
1.
29.
30.
31.
32.
37.
dwr.xml
支持LIST,JS可以直接传数组,默认不支持MAP,如果需要强行转换,去网上参考DWR类型转换。
1.2."/dwr//dwr20.dtd">3.
9.
TestDwr.java
1.public void jsonForDw(Integer st,String local,String callFunction,HttpServletRequest req
uest) {
2. 省略了其他操作。
3. DwrBuntUtil dwrBunt=new DwrBuntUtil();
4. List dwrList=new ArrayList();
5. dwrList.add("xxoo");
6. //dwrBunt.bunt(request, local, callFunction, dwrList);//此为广播方式进行分发
7. dwrBunt.bunt(callFunction, dwrList);//针对当前SESSION进行消息传递
8.}
9.补充:由于对DWR使用不当造成消息广播,因此方法进行改进,相关连带参数没有更改,调用方式更正为 Util util = new Util(WebContextFactory.get().getScriptSession()); 当前请求。本人对此深感歉意!
4、封装类,实现推过程,因util.addFunctionCall支持不够强,也没找到好的解决办法。。自己便利吧。。
DwrBuntUtil.java
1.package com.vstsoft.csi.util;
2.3.import java.util.Collection;
4.import java.util.List;
5.import javax.servlet.http.HttpServletRequest;
6.import org.directwebremoting.ServerContextFactory;
7.import org.directwebremoting.proxy.dwr.Util;
8./**
9. * 使用DWR服务器推技术实现客户端访问超长连接(解决IE下AJAX一小时支持问题)
10. * @author chenyanji
11. *
12. */13.public class DwrBuntUtil {
14. /**
15. * DWR实现推技术
16. * @param request DWR当前请求
17. * @param local 页面地址,以工程同目录真实地址为准,如:/部署名/pages/index.jsp
18. * @param callFunction 回调JS方法名称,如:"count"
19. * @param parameter 回调方法参数数组,最多支持5个参数,数组0-4
20. */21. public void bunt(HttpServletRequest request,String local,String callFunction,List parameter){
22. try{
23. Collection scriptSessionsByPage = ServerContextFactory.get(request.getSession().getServletContext()).getScriptSessionsByPage(local);
24. Util util = new Util(scriptSessionsByPage);
25. int size=parameter.size();
26. if(size==5){
27. util.addFunctionCall(callFunction,parameter.get(0),parameter.get(1),parameter.get(2),parameter.get(3),parameter.get(4));
28. }else if(size==4){
29. util.addFunctionCall(callFunction,parameter.get(0),parameter.get(1),parameter.get(2),parameter.get(3));
30. }else if(size==3){
31. util.addFunctionCall(callFunction,parameter.get(0),parameter.get(1),parameter.get(2));
32. }else if(size==2){
33. util.addFunctionCall(callFunction,parameter.get(0),parameter.get(1));
34. }else if(size==1){
35. util.addFunctionCall(callFunction,parameter.get(0));
36. }else if(size==0){
37. util.addFunctionCall(callFunction);
38. }
39. scriptSessionsByPage=null;
40. util=null;
41. }catch(Exception e){
42. //throw e; 43. }
44. }
45.public void bunt(String callFunction,List parameter){
try{
Util util = new U
til(WebContextFactory.get().getScriptSession());
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);
}
46. util=null;
}catch(Exception e){
//throw e;
}
}
47.}
5、jsp引用,1、3包为必须引用,2包如果没有用到UTIL类可以不引。
testDwr.jsp
1.2.3.6、js调用,最后一参数默认为回掉方法,使用推技术此方法无效,所以置成NULL,目录是详细目录,如果是.do?method=aa 那么此处也必须些,至于又参数 也得传。
test.js
1.function queryDwr(){
2. setActiveReverseDwr(dwr,true,true);
3. TestDwService.jsonForDw(0,"/newsx/pages/test/testDwr.jsp","jspalert",null);
4.}
5.function jspalert(str){
6. lovDwStore.loadData(Ext.decode(str));
7. setActiveReverseDwr(dwr,false,false);
8.}
7、封装JS,本项目使用了EXT,没用的可以自行改造。
common.js
1./**
2. * DWR设置长连接/取消长连接(dwr,true/false,true/false)
3. * (dwr对象,长连接控制,MASK控制)
4. */5.function setActiveReverseDwr(obj,boo,mask){
6. obj.engine.setActiveReverseAjax(boo);
7. if(typeof mask != "undefined"){
8. if(mask){
9. Ext.getBody().mask("正在查询,请稍后...","x-mask-loading");
10. }else{
11. Ext.getBody().unmask();
12. }
13. }
14.}
8、附加Ext.PagingToolbar 控制,当使用分页后默认执行store.load方法,为了评比执行,让程序执行我们自己的代码,需要如下几步修改
增加属性:
1. isDwr : false,//是否起用DWR推查询 2. dwrStart : 0,//查询起位置 3. fn : "", //回调方法 无参数。
修改
1.doLoad : function(C) {
2. if(this.isDwr){
3. this.dwrStart=C;
4. if(this.fn!=""){
5. eval(this.fn+"();");
6. }
7. return false;
8. }
9. var B = {}, A = this.paramNames;
10. B[A.start] = C;
11. B[A.limit] = this.pageSize;
12. this.store.load({
13. params : B
14. })
15. }
增加
1.updateInfoDwr : function(){
2. var SC = this.store.getCount();
3. this.cursor = this.dwrStart;
4. var E = this.getPageData(), B = E.activePage, D = E.pages;
5.
6. this.afterTextEl.el.innerHTML = SC==0?String.format(this.afterPageText,
7. " "):String.format(this.afterPageText,
8. E.pages);
9. this.field.dom.value = SC==0?"":B;
10. this.first.setDisabled(B == 1);
11. this.prev.setDisabled(B == 1);
12. this.next.setDisabled(B == D);
13. st.setDisabled(B == D);
14. this.loading.enable();
15. this.updateInfo();
16. }
创建GRID的BBAR增加属性
1.isDwr:true,
2.fn : "barClick",
JS修改后为
1.function barClick(){
2. queryDwr(lovDwGrid.getBottomToolbar().dwrStart);
3.}
4.function queryDwr(start){
5. setActiveReverseDwr(dwr,true,true);
6. TestDwService.jsonForDw(start,"/newsx/pages/test/testDwr.jsp","jspalert",null);
7.}
8.function jspalert(str){
9. lovDwStore.loadData(Ext.decode(str));
10. lovDwGrid.getBottomToolbar().updateInfoDwr();
11. setActiveReverseDwr(dwr,false,false);
12.}
重要:在JS中调用DWR前加允许长连接,后台配置为activeReverseAjaxEnabled:true支持轮循,当执行成功后回调JS中一定要对当前连接进行关闭,否则直到页面关闭前一直轮循;默认长轮循间隔为1分钟。