Struts2、Spring MVC4 框架下的ajax统一异常处理
本文算是struts2 异常处理3板斧、spring mvc4:异常处理 后续篇章,普通页面出错后可以跳到统一的错误处理页面,但是ajax就不行了,ajax的本意就是不让当前页面发生跳转,仅局部刷新,从而改善用户体验,基本思路是:把异常转换成json数据返回,这样ajax的回调函数,就能解析出错误原因。
一、如何区分ajax请求与普通请求
打开firefox的调试工具观察一下:
普通的页面请求

jquery发起的ajax请求

对比一下,可以发现jquery发生的ajax请求,Request Headers里多出了x-requested-with,用它就可以判断是否ajax请求。
二、struts2框架
a) 先定义一个ajax通用异常
package com.cnblogs.yjmyzz.exception;
public class AjaxException extends Exception {
private static final long serialVersionUID = -8503861588580421151L;
public AjaxException(String message) {
super(message);
}
}
b) 然后修改异常拦截器
package com.cnblogs.yjmyzz.interceptor;
import javax.servlet.http.HttpServletRequest; import org.apache.logging.log4j.*;
import org.apache.struts2.ServletActionContext;
import org.springframework.util.StringUtils;
import com.cnblogs.yjmyzz.exception.AjaxException;
import com.opensymphony.xwork2.*;
import com.opensymphony.xwork2.interceptor.*; public class ExceptionInterceptor extends AbstractInterceptor { private static final long serialVersionUID = -6358803554282730952L;
Logger logger = LogManager.getLogger(); @Override
public String intercept(ActionInvocation ai) throws Exception {
String result = null;
try {
result = ai.invoke();
} catch (Exception e) {
logger.error(ai.toString(), e);
ai.getStack().push(new ExceptionHolder(e));
result = "error"; HttpServletRequest request = ServletActionContext.getRequest();
String xRequestedWith = request.getHeader("X-Requested-With");
if (!StringUtils.isEmpty(xRequestedWith)) {
// ajax请求
// 转换成ajax异常,并放入stack中
ai.getStack().push(
new ExceptionHolder(new AjaxException(e.getMessage())));
result = "ajax-error";
}
}
return result;
} }
c) 修改struts.xml文件
<package name="base-default" extends="struts-default">
<global-results>
<result name="ajax-error">/WEB-INF/common/ajax-error.jsp</result>
<result name="error">/WEB-INF/common/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="com.cnblogs.yjmyzz.exception.AjaxException"
result="ajax-error" />
<exception-mapping exception="java.lang.Exception"
result="error" />
</global-exception-mappings>
</package>
即:返回ajax-error,异常类型为AjaxException,则交给/WEB-INF/common/ajax-error.jsp处理
d) ajax-error.jsp页面
<%@ page contentType="application/json;charset=UTF-8" language="java"%><%@ taglib prefix="s" uri="/struts-tags"%>{"error":"<s:property value="exception" />"}
即:如果出错,最终返回的是json串,类似:{"error":"com.cnblogs.yjmyzz.exception.AjaxException: / by zero"}
e) 然后调用ajax的地方
$.ajax({
type:"GET",
url:"${pageContext.request.contextPath}/rest/orders/x",
success: function(data, textStatus, jqXHR){
if (data.error!=undefined){
alert("错误:" + data.error);
return false;
}
//正常处理
alert("ajax请求成功!");
},
error: function(jqXHR, textStatus, errorThrown){
alert('error: ' + textStatus);
}
});
如果服务端出异常,则ajax调用完成后,会弹出异常信息,否则按正常流程处理
三、Spring MVC4
a) 先修改Controller基类里的异常处理方法
@ExceptionHandler
public String exp(HttpServletRequest request, Exception ex) {
String resultViewName = "errors/error"; // 记录日志
logger.error(ex.getMessage(), ex); // 根据不同错误转向不同页面
if (ex instanceof BusinessException) {
resultViewName = "errors/biz-error";
} else {
// 异常转换
ex = new Exception("系统太累了,需要休息!");
}
request.setAttribute("ex", ex); String xRequestedWith = request.getHeader("X-Requested-With");
if (!StringUtils.isEmpty(xRequestedWith)) {
// ajax请求
resultViewName = "errors/ajax-error"; } return resultViewName;
}
大致意思是,如果发现是ajax请求,则有异常,则交给"errors/ajax-error"视图处理
b) ajax-error.jsp页面
<%@ page contentType="application/json;charset=UTF-8" language="java"%><%Exception e = (Exception) request.getAttribute("ex");%>{"error":"<%=e.getClass().getSimpleName()%>","detail":"<%=e.getMessage()%>"}
c) 调用ajax的页面
$.ajax({
type:"GET",
url:"${pageContext.request.contextPath}/common-exception",
success: function(d, textStatus, jqXHR){
if (d.error!=undefined){
alert("错误:" + d.detail);
return false;
}
//其它正常处理
alert("ajax请求成功!");
},
error: function(jqXHR, textStatus, errorThrown){
alert('error: ' + textStatus);
}
});
如果服务端返回异常,ajax得到的反馈内容大概是:{"error":"Exception","detail":"系统太累了,需要休息!"}
Struts2、Spring MVC4 框架下的ajax统一异常处理的更多相关文章
- 在依赖的框架中已经有统一异常处理的情况下,如何定制自己的统一异常处理spring boot版本
spring boot 环境下的统一异常处理大家已经非常熟悉了,不熟悉的化可以参考 <<Spring Boot中Web应用的统一异常处理>>.公司内部的统一异常处理如下: @E ...
- SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>
此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...
- Struts2,Spring,Hibernate框架的优缺点
Struts2,Spring,Hibernate框架的优缺点 Struts2框架(MVC框架)的优点如下: 1) 实现了MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现: ...
- 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回
作者:ssslinppp 时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...
- 基于Maven的S2SH(Struts2+Spring+Hibernate)框架搭建
1. 前言 基于Maven的开发方式开发项目已经成为主流.Maven能很好的对项目的层次及依赖关系进行管理.方便的解决大型项目中复杂的依赖关系.S2SH(Struts2+Spring+Hibernat ...
- 在Spring Boot框架下使用WebSocket实现聊天功能
上一篇博客我们介绍了在Spring Boot框架下使用WebSocket实现消息推送,消息推送是一对多,服务器发消息发送给所有的浏览器,这次我们来看看如何使用WebSocket实现消息的一对一发送,模 ...
- 在Spring Boot框架下使用WebSocket实现消息推送
Spring Boot的学习持续进行中.前面两篇博客我们介绍了如何使用Spring Boot容器搭建Web项目(使用Spring Boot开发Web项目)以及怎样为我们的Project添加HTTPS的 ...
- struts2 + spring + mybatis 框架整合详细介绍
struts2 + spring + mybatis 框架整合详细介绍 参考地址: https://blog.csdn.net/qq_22028771/article/details/5149898 ...
- Spring Boot 框架下使用MyBatis访问数据库之基于XML配置的方式
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...
随机推荐
- mysql一些小技巧
1 强制命中索引:force index 某些时候查询,索引会失效,可以进行强制命中索引 2 group_concat 能将相同的行组合起来. 当然,我推荐这种操作可以在代码中操作,如果必须在特定情况 ...
- mysql metadata lock(一)
想必玩过mysql的人对Waiting for table metadata lock肯定不会陌生,一般都是进行alter操作时被堵住了,导致了我们在show processlist 时,看到线程的状 ...
- python写的分析mysql binlog日志工具
因为数据库增删改突然暴增,需要查询是那些表的操作特别频繁,写了一个用来分析bin-log的小工具,找出增删改查的表,并按照操作次数降序排列,以下是代码: 1 2 3 4 5 6 7 8 9 10 11 ...
- 用自己的算法实现startsWith和endsWith功能。
String str=new String(); str="erty"; Scanner sc= new Scanner(System.in); System.out.printl ...
- JS实现别踩白块小游戏
最近有朋友找我用JS帮忙仿做一个别踩白块的小游戏程序,但他给的源代码较麻烦,而且没有注释,理解起来很无力,我就以自己的想法自己做了这个小游戏,主要是应用JS对DOM和数组的操作. 程序思路:如图:将游 ...
- iOS解决隐藏导航栏后,打开照片选择器后导航栏不显示的问题以及更换导航栏背景色
问题描述: 遇到一种情况,在一个控制器上(隐藏了导航栏),打开照片选择器 UIImagePickerController后,照片选择器头部一片空白,且上滑相册时,信息会有错乱效果. 原因分析: 通过查 ...
- 使用.Net自带的GZipStream进行流压缩与解压
using System.IO; using System.IO.Compression; using System.Text; namespace CS.Utility { /// <summ ...
- MT7620a openwrt barrier_breaker编译后wan口dhcp无法获得地址
前言 我司准备使用openwrt barrier_breaker版本做二次开发.在烧入固件后发现wan口,dhcp无法获得地址.经如下修改后,mt7620a的路由器可以正常获得地址. 修改dts文件 ...
- java基础算法之冒泡排序
接触冒泡算法还是大一了,学习C语言的冒泡算法.现在唯一记得就是冒泡与选择了.出来刚刚工作的时候觉的算法基本没撒用处,现在发现这些都是很好的基础.因此自己也准备重新拾起这些知识. 冒泡排序 泡排序是一种 ...
- CleanBlog(个人博客+源码)
CleanBlog是一个高端(低调).大气(简洁)的个人博客系统,之前在网上看到了好多个人博客网站,感觉很酷的,自己也想搭建一个,最近 刚学完SSM(Spring/SpringMVC/MyBatis) ...