javascript默认是同步执行的,但是DWR是异步执行的,所以如果需要取回后台传回的数据的时候,必须设置同步,这样保证数据完整取到,不然会出现undefined错误;
代码如下:
function test(){ var result; dwr.engine.setAsync(false); DwrTest.hello(function(data){result=data;}); dwr.engine.setAsync(true); return result; }
这样就可以获取到返回值了;
另外关于Dwr在监视浏览器关闭事件的应用:
首先需求说明:在系统需要用js捕获关闭浏览器的事件,然后在捕获后对session中的一些数据(如利用某些字段更新数据库)进行一定的处理。然后关闭浏览器。这里注意window没有onclose事件, 标签只有onload\onunload\onbeforeunload事件,而没有onclose事件。不管页面是关闭还是刷新都会执行onunload事件。
页面加载时只执行onload ,页面关闭时只执行onunload ,页面刷新时先执行onbeforeunload,然后onunload,最后onload。
这样我们可以在onbeforeunload中加一个标记,在onunload中判断该标记,即可达到判断页面是否真的关闭了。
错误提示:我使用的是DWR方式处理,下面是错误的代码:
//处理关闭浏览器带来的session失效 window.onbeforeunload = onbeforeunload_handler; function onbeforeunload_handler(){ DwrSystemService.browserClose(function(data){ alert(data); return; }); }
后台错误提示:
WARN - Exception while processing batch
java.lang.IllegalArgumentException: Failed to find parameter: scriptSessionId
at org.directwebremoting.dwrp.Batch.extractParameter(Batch.java:91)
at org.directwebremoting.dwrp.Batch.<init>(Batch.java:59)
at org.directwebremoting.dwrp.CallBatch.<init>(CallBatch.java:46)
at org.directwebremoting.dwrp.BaseCallHandler.handle(BaseCallHandler.java:72)
at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:120)
at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:141)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
DEBUG - Refurbishing idle resources - Tue Aug 07 16
经过网上查询:错误原因是:为了实现关闭浏览器的同时能够关闭用户的session,需要锁定session,不然你试图注销session,将会出现报错信息: Failed to find parameter: scriptSessionId
session同步锁 dwr.engine.setAsync(false);
session异步锁 dwr.engine.setAsync(true);
dwr常用关键句
1、加载信息:
dwr.util.useLoadingMessage();
2、设置同步(各版本有区别):
DWREngine.setAsync(false); /dwr.engine.setAsync(false);
3、设置异步:
DWREngine.setAsync(true); /dwr.engine.setAsync(true);
最终解决办法:
//关闭浏览器造成的session失效 window.onbeforeunload =session_handler; function session_handler(){ dwr.engine.setAsync(false); // DwrSystemService.browserClose(function(data){ // alert(data); return; }); dwr.engine.setAsync(true); } window.onunload=function(){ if(onbeforeunload.flag) return; // alert('unload'); }