针对请求:
(1)页面跳转请求 ,struts2配置事例如下:
<action name="warningSMSIndex" class="warningSMSAction" method="warningSMSIndex">
<result name="success">index_warningSMS.jsp</result>
</action>
(2)json请求,struts2配置事例如下:
<action name="queryWarningSMSList" class="warningSMSAction" method="queryWarningSMSList">
<result name="success" type="json"/>
<result name="error" type="json" />
</action>
这里面的json是自己写的插件,会将strus2的所有属性返回到前台,属性中会包含success,isException,message等
针对返回情况:
(1)请求成功,返回success
(2)请求出现业务异常,在程序中需要处理,action层事例代码如下:
@JSON
public String updateWarningSMS(){
try{
warningSMSService.updateWarningSMS(warningSMSVo );
return this.returnSuccess();
}catch(WarningSMSException e){
return this.returnError(e);
}
}
(3)请求出现系统异常,即无法预知的异常,由strus2的ExceptionInteceptor拦截器处理,处理思路如下
1.如果是页面跳转的请求,会将异常信息转换成html,在前台直接显示
2.如果是json请求,通过@json注解来判断,会将异常信息转换成json格式
extjs前台的处理:
Ext.Ajax.request({
scope: this,
url:url,
waitMsg: '正在保存...',
params : form.getValues(),
success: function( res,form) {
Ext.ux.Toast.msg('提示', '保存成功');
this.getWindow().down("grid[itemId=grd1]").getStore().load();
},
exception:function( res,form){
var json= Ext.decode(res.responseText);
Ext.ux.Toast.msg('业务异常', json.message,'error', 4000);
},
unknownException: function(res, form) {
var json= Ext.decode(res.responseText);
Ext.ux.Toast.msg('系统异常', json.message,'error', 4000);
}
});
这里不是原生的extjs的代码,而是通过加工,加工思路如下:
1.如果正常返回会调用success方法
2.如果出现业务异常,会掉excetion方法
3.如果出现未处理的异常,会调用unknownException方法
核心代码如下,仅供参考
if(contentType.toLowerCase()=='application/json;charset=utf-8') {
var json = Ext.decode(response.responseText);
if(json) {
//业务执行成功
if (json.success && !json.isException) {
Ext.callback(options.success, options.scope, [response, options]);
//业务异常
} else if (!json.success && !json.isException) {
Ext.callback(options.exception, options.scope, [response, options]);
//未知异常
} else if (!json.success && json.isException) {
if(json.stackTrace && json.stackTrace.indexOf("UserNotLoginException") > 0) {
BI.exception.MessageBox.showGoLoginWin();
return;
}
if(json.errorCode == BI.CONFIG.SECURITY_NOTALLOW) {
Ext.ux.Toast.msg('', json.message, 'error');
}
Ext.callback(options.unknownException, options.scope, [response, options]);
}
}
}
个人感言:
我是做个c/s开发的出身的,在c/s开发中处理异常很简单,在application中有一个error事件,会自动捕捉异常,但是在b/s开发下却需要自己来设计,曾经想过,在service层抛出RuntimeException异常,在action曾通过e.getmessage()将异常信息获取出来,然后返回到前台,但是这样一来没所有异常都返回到前台,而我们在开发的时候应该只关注业务异常,这个思路特别好,今天使用了公司的框架,这个框架对异常处理非常好,所以分享出来,由于是公司的框架,不方便把所有代码都贴出来,只提供一个思路,还请谅解