`
yuexiaodong
  • 浏览: 68526 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

DWR获取返回值

    博客分类:
  • js
阅读更多

        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');
	     }

 

分享到:
评论
1 楼 1021082712 2014-01-28  
lz,总结的太到位了,最近正在做监视在线用户,这太受用了!!!

相关推荐

Global site tag (gtag.js) - Google Analytics