本文算是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统一异常处理的更多相关文章

  1. 在依赖的框架中已经有统一异常处理的情况下,如何定制自己的统一异常处理spring boot版本

    spring boot 环境下的统一异常处理大家已经非常熟悉了,不熟悉的化可以参考 <<Spring Boot中Web应用的统一异常处理>>.公司内部的统一异常处理如下: @E ...

  2. SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>

    此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...

  3. Struts2,Spring,Hibernate框架的优缺点

    Struts2,Spring,Hibernate框架的优缺点 Struts2框架(MVC框架)的优点如下:         1)  实现了MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现:   ...

  4. 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回

    作者:ssslinppp      时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...

  5. 基于Maven的S2SH(Struts2+Spring+Hibernate)框架搭建

    1. 前言 基于Maven的开发方式开发项目已经成为主流.Maven能很好的对项目的层次及依赖关系进行管理.方便的解决大型项目中复杂的依赖关系.S2SH(Struts2+Spring+Hibernat ...

  6. 在Spring Boot框架下使用WebSocket实现聊天功能

    上一篇博客我们介绍了在Spring Boot框架下使用WebSocket实现消息推送,消息推送是一对多,服务器发消息发送给所有的浏览器,这次我们来看看如何使用WebSocket实现消息的一对一发送,模 ...

  7. 在Spring Boot框架下使用WebSocket实现消息推送

    Spring Boot的学习持续进行中.前面两篇博客我们介绍了如何使用Spring Boot容器搭建Web项目(使用Spring Boot开发Web项目)以及怎样为我们的Project添加HTTPS的 ...

  8. struts2 + spring + mybatis 框架整合详细介绍

    struts2 + spring + mybatis  框架整合详细介绍 参考地址: https://blog.csdn.net/qq_22028771/article/details/5149898 ...

  9. Spring Boot 框架下使用MyBatis访问数据库之基于XML配置的方式

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...

随机推荐

  1. PlateSpin 完全复制由于LVM没有可用空闲空间导致失败

    使用PlateSpin复制居然会由于LVM的卷组VG没有空闲可用的空间(available free space in the LVM volume group)创建快照而导致失败,特此记录一下:免得 ...

  2. 十五天精通WCF——第十天 学会用SvcConfigEditor来简化配置

    我们在玩wcf项目的时候,都是自己手工编写system.serviceModel下面的配置,虽然在webconfig中做wcf的服务配置的时候,vs提供大多 数的代码提示,但对于不太熟悉服务配置的小鸟 ...

  3. 用struts2获取session、request、parmeter的方法

    package com.hanqi.action; import java.util.Map; import com.opensymphony.xwork2.ActionContext; public ...

  4. hibernate 实现分页查询语句、单条查询语句、多条查询语句、修改、删除语句

    package com.hanqi.test; import java.util.Date; import java.util.List; import org.hibernate.Query; im ...

  5. 简单阐述下Ajax以get方式请求的步骤 初学,不对的话,跟我说下,谢谢!

    首先, 在GET提交中"=,&"等字符与请求字符串的关键字相混淆.所以: 第一步,先对get提交过来的数据进行编码. 第二步,实例化ajax对象. 第三步,创建对服务器的连 ...

  6. itextpd f生成 pdf 文件

    一.简介 itextpdf 是一个开源的允许你去创建和操作PDF文档的库.它使的开发者可以提高web和其他应用来动态地生成或操作PDF文档.通过iText 中的Document和PdfWriter类, ...

  7. 烂泥:vsftpd单用户多目录配置

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb. 一.实际问题 在使用vsftpd过程中,我们会经常发现vsftpd在默认情况下一个用户 ...

  8. linux批量删除进程

    在虚拟机用脚本跑了几十个client程序用来测试服务器,然后发现参数设置错误,得重来,就傻眼了,不知道怎么关这么多client进程,总不能一个一个关.还好,学习一下,想出了以下的命令.   ps -e ...

  9. x01.os.5: DOS 功能调用

    DOS 功能调用(INT 21)-------------------------------AH = 0-2E 适用 DOS 1.0 以上版本AH = 2F-57 适用 DOS 2.0 以上版本AH ...

  10. Android开发中XML布局的常用属性说明

    <!-- 常用属性说明: android:id="@+id/button" 为控件指定Id android:text="NNNNNNNNNN" 指定控件的 ...