微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

DWR的异常处理及session过期

DWR的后台server调用可能会产生Exception,如果不处理,前台的反应就是页面js报错了。这对于用户是很不友好的。
最近这个项目里的DWR异常处理,是参考网友的经验做的。下面简单谈谈: DWR有很多种异常处理方式,有全局的,有针对某种方法的。
1、先说全局处理

最简单的如下面,一个方法就搞定了。

function errh(errorString,exception) {  
    alert("提示自定义的全局出错信息。");  
}  
dwr.engine.setErrorHandler(errh);  
当然我在项目中是类似这么处理的:
服务端

public class ErrDemo {  
    public String getData() {  
        Date when = new Date();//FooException extend Exception  
        throw new FooException("异常的详细信息",when);  
        //FooException 实现getWhen() method  
    }  
}  
如果不设置FooException的Message,认是“Error”。
客户端
function eh(msg,ex) {  
    alert(msg + ",date=" + ex.when);  
    //alertMessagesBox('alert-messages-Box',"" + dwr.util.toDescriptiveString(exc,2),true,msg) ;  
}  
  
DWrengine.setErrorHandler(eh);  

DWR.toDescriptiveString()是DWRutil.js的一个函数
带debug信息的toString,第一个为将要debug的对象,第二个参数为处理等级。等级如下:

0: Single line of debug 单行调试
1: Multi-line debug that does not dig into child objects 不分析子元素的多行调试
2: Multi-line debug that digs into the 2nd layer of child objects 最多分析到第二层子元素的多行调试


在dwr.xml里面配置

<convert match="com.db.exception.FooException" converter="exception">   
    <param name="include" value="message"/>   
</convert>  
当执行 ErrDemo.getData(function(data) { alert("123"); });时,出现alert("异常的详细信息,date=xxxxxxxxxx");

2、再说说局部处理
Demo.method(params,{  
    callback:function(data) { alert("it worked"); },errorHandler:function(message) { alert("it broke"); },timeout:1000  
});  
对某一个function来进行超时\警告\错误处理。
下面列出 engine.js中 一些常用方法
DWrengine.setErrorHandler(function)对错误的处理  
DWrengine.setWarningHandler(function)对警告的处理  
DWrengine.setTimeout() 设置超时的时间   
DWrengine.setAsync(false);设置DWR为同步调用  
DWrengine.setAsync(true);设置DWR为异步调用  


3、最后说说Session超时的情况
使用DWR,还需要考虑session超时的情况,当session超时了,系统应该友好地提示用户,并跳转到login页面
网上有大致由两种处理方法,我在项目用了其中一种,如下:

创建一个DWRSessionService.java

public class DWRSessionService {  
	public String query(String param,HttpSession session) throws Exception {
		logger.info(param);
		if (session.getAttribute(Constants.SESSION_USER) == null) {
			WebContext ctx = WebContextFactory.get();
			Util utilThis = new Util(ctx.getScriptSession());  
			utilThis.addScript(new ScriptBuffer("logout()"));  
			//ctx.getHttpServletResponse().sendRedirect(ctx.getHttpServletRequest().getcontextpath()+"/login/login");
			return null;
		} else {
			Map queryMap = new HashMap();
			queryMap.put("obj",param);
			//List<Map> listIis1 = reportDao.select4MapParam(queryMap,"currentsql");
			List<Map> listIis2 =reportDao.select4MapParam(queryMap,"test123");
			return JSONArray.fromObject(listIis2).toString();
		}
	}
}
页面上(当然最好是加在公共的header.jsp里,这样只需要加一处就ok了)
function logout(){  
        alertDialog("Session timeout",SESSION_TIMEOUT_MSG,'alert-messages-Box',function(){  
           window.location.href = "<%=request.getcontextpath() %>/wms/login.jsp";  
        });  
 }  
这样就大功告成了。
注:session处理方法参考http://blog.163.com/zjut_jing/blog/static/131136457200910481526388/

参考:http://blog.csdn.net/wangchsh2008/article/details/6652809

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐