最近在使用dwr, 与之前相比 除了让人非常蛋疼的问题, 先描述如下:
第一个问题是服务器向客户端推送的时候,
1 Browser.withCurrentPage(new Runnable() { 2 ScriptBuffer sb = new ScriptBuffer(); 3 public void run() { 4 // ScriptSessions.addFunctionCall("receiveMessages", msg); 5 6 //ScriptBuffer sb = new ScriptBuffer(); 7 sb.appendScript("receiveMessages("); 8 sb.appendData(msg); 9 sb.appendScript(")"); 10 WebContextFactory.get().getScriptSession().addScript(sb); 11 12 } 13 });
使用该方法推送给当前的session使用, 可是我之前测试总是在全部推送完毕后, 才在页面做接收, 也就是看不到 一条一条记录推送的效果! 无奈研究了一天, 使用了N种办法都没有得到 解决, 无奈使用
ScriptSessions.addFunctionCall("receiveMessages", msg);
该句进行全部推送, 本来以为 就风平浪静了!
事情总是事与愿违啊, 今天用到项目中后,紧接着第二个问题出现了,那么是什么呢,就是每次推送到最后一条记录的时候 , 会把前边的一次在全部推送出来, 比如 我送了记录一 记录2 记录3 当推送到 记录3的时候 会再把1,2,3 重新显示一边!
也就是出来的效果是 结果1,结果2 , 结果3, 结果1, 结果2, 结果3!
简直是蛋疼无比!
于是乎 我展开了 百度 google 无尽的搜索当中, 皇天不负有心人, 终于在无意之中看到一个帖子, 哎, 如果英文好, 何必现在呢, 早就应该能搜索到了!
搜到的帖子如下 http://directwebremoting.org/bugs/browse/DWR-364 来自其官方的网站 bugs提交。
后来在页面 引用了 其中一段代码,竟然神奇的好了! 单独提送也没有问题了!
1 function initReverseAjax() { 2 if (dwr.engine._scriptSessionId == null) { 3 setTimeout("initReverseAjax()", 2000); 4 } else { 5 dwr.engine.setActiveReverseAjax(true); 6 } 7 } 8 9 10 function onLoadPage() { 11 dwr.engine.setNotifyServerOnPageUnload(true); 12 // dwr.engine.setActiveReverseAjax(true); 13 initReverseAjax(); 14 dwr.engine.setErrorHandler(errorHandler); 15 //刷新页面时 销毁 原先创建的scriptSession 16 17 doImport.dwrImport(${modelId}, ${importType}, '${matchStr}'); 18 }
特发帖以此纪念! 这蛋疼的js 这蛋疼的dwr!