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 能将相同的行组合起来. 当然,我推荐这种操作可以在代码中操作,如果必须在特定情况 ...
- 判断字符串的首字母 ---------startsWith
列: { xtype : 'gridcolumn', ...
- PMBOK学习笔记二-项目管理过程
项目管理过程可归纳为五类,即五大项目管理过程组 启动过程组.定义一个新项目或现有项目的一个新阶段,授权开始该项目或阶段的一组过程..规划过程组.明确项目范围,优化目标,为实现目标制定行动方案的一组过程 ...
- FreeMarker 日期转换
${parameters.fieldDate?date} //标准日期转日期字符串 ${parameters.fie ...
- Spring源码阅读系列总结
最近一段时间,粗略的查看了一下Spring源码,对Spring的两大核心和Spring的组件有了更深入的了解.同时在学习Spring源码时,得了解一些设计模式,不然阅读源码还是有一定难度的,所以一些重 ...
- 挖一挖C#中那些我们不常用的东西之系列(4)——GetHashCode,ExpandoObject
这篇继续分享下GetHashCode和ExpandoObject这两个比较好玩的方法. 一:GetHashCode 从MSDN上可以看到的解释是:用作特定类型的哈希函数,也就是说任何对象的实例都会有一 ...
- 【JavaScript】EasyUI框架的Dialog控件根据浏览器分辨率自动调节宽高
序: 如果单独一个或几个Dialog控件修改成根据浏览器可视界面自动调整高.宽很容易仅仅是一个量变的过程,但如果大量页面都引入了Dialog控件,修改起来是一个很消耗体力的工作.所以接到任务后第一想法 ...
- JSON格式互转集合
在工作中我们经常会遇到格式转换的问题,有的时候是将JSON转换成DataTable.DataSet或是List等,也有可能将DataTable.DataSet或是List转换成JSON的,抽了点时间把 ...
- IE下innerText与FoxFire下textContent属性的不同
<div> 我是中国 人 我<br/>爱 自己 的<div>祖国</div>. <div> IE下输出 我是中国 人 我 爱 自己 的 祖国 ...
- linux-3.14.13 看到mpls gso支持
在net/Kconfig source "net/mpls/Kconfig"