前面学习过struts2的异常处理,今天来看下spring mvc4的异常处理:

一、Servlet配置文件修改

     <bean id="exceptionResolver"
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="errors/error" />
<property name="exceptionMappings">
<props>
<prop key="java.lang.Throwable">errors/error</prop>
</props>
</property>
</bean>

增加上面这一节,大意是:只要有异常就跳到/WEB-INF/views/errors/error.jsp这个页面,当然如果要实现个性化的错误处理,比如:业务错误跳到页面A,SQL错误跳到页面B...,直接在props节点下,根据不同的异常类型,自行扩充 (注:404之类的错误,仍然参考struts2异常处理中的做法,在web.xml中配置解决)

二、创建一个BaseController基类,里面放一个以下方法:

     @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);
return resultViewName;
}

记录异常日志、根据不同的异常类型转到不同的处理页面、友好异常转换(如果需要的话),都在上面的方法中处理了

三、所有Controller都继承自BaseController

这个,就不解释了

四、error.jsp页面

 <%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%
Exception e = (Exception) request.getAttribute("ex");
%>
<html>
<head>
<title>师傅,有妖怪:error</title>
</head>
<body>
<H2>
错误:<%=e.getClass().getSimpleName()%></H2>
<hr />
<P>
<strong>错误描述:</strong><%=e.getMessage()%>
</P> <P>
<strong>详细信息:</strong>
</P>
<pre>
<%
e.printStackTrace(new java.io.PrintWriter(out));
%>
</pre>
</body>
</html>

上面的内容只是示意,大家可以根据需要自行美化

另:前文struts2的异常处理中,采用的是拦截器思想,spring mvc中也有拦截器,而且拦截的点更灵活:

 package com.cnblogs.yjmyzz.interceptor;

 import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; public class ExcpetionInterceptor extends HandlerInterceptorAdapter { protected Logger logger = LogManager.getLogger(); @Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("ExcpetionInterceptor.preHandle");
// 演示:限制仅允许从本机访问
if (request.getLocalAddr().equals("127.0.0.1")
|| request.getLocalAddr().equals("0.0.0.0")) {
return true;
}
logger.error("非法入侵:" + request.getLocalAddr());
return false;
} @Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("ExcpetionInterceptor.postHandle");
} @Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("ExcpetionInterceptor.afterCompletion");
if (ex != null) {
logger.error(handler);
logger.error(ex.getMessage(), ex);
}
} @Override
public void afterConcurrentHandlingStarted(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out
.println("ExcpetionInterceptor.afterConcurrentHandlingStarted");
} }

拦截器创建后,依然要在servlet配置文件中注册:

    <mvc:interceptors>
<bean class="com.cnblogs.yjmyzz.interceptor.ExcpetionInterceptor"></bean>
</mvc:interceptors>

spring mvc的拦截器提供了4个处理方法:

preHandle在Controller被调用前,先执行,可以在这里执行一些安全检查(上面示意了如何对IP做限制)

postHandle在Controller调用后执行,这时,可以修改ModelAndView,比如转到其它view之类

afterCompletion在Controller调用全部完成后执行,如果ex变量不为空,表示有异常了,这里可以记录异常日志

afterConcurrentHandlingStarted这个没怎么研究过,暂时不做评价

值得一提的是:spring-mvc中的拦截器,虽然可以在afterCompletion中记录异常日志,但如果按前面的baseController配合@ExceptionHandler做了处理,这里的ex就变成了null,因为异常在前面已经得到了处理,所以这二种方法不推荐混用,另外afterCompletion方法中,如果要根据不同的异常类型转到不同处理页面,并不方便。

附:ajax的统一异常处理,请移步 Struts2、Spring MVC4 框架下的ajax统一异常处理

spring mvc4:异常处理的更多相关文章

  1. Struts2、Spring MVC4 框架下的ajax统一异常处理

    本文算是struts2 异常处理3板斧.spring mvc4:异常处理 后续篇章,普通页面出错后可以跳到统一的错误处理页面,但是ajax就不行了,ajax的本意就是不让当前页面发生跳转,仅局部刷新, ...

  2. Spring Boot异常处理详解

    在Spring MVC异常处理详解中,介绍了Spring MVC的异常处理体系,本文将讲解在此基础上Spring Boot为我们做了哪些工作.下图列出了Spring Boot中跟MVC异常处理相关的类 ...

  3. Spring Boot 异常处理

    Spring Boot 异常处理 本节介绍一下 Spring Boot 启动时是如何处理异常的?核心类是 SpringBootExceptionReporter 和 SpringBootExcepti ...

  4. Spring Boot异常处理

    一.默认映射 我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况.Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局 ...

  5. Spring全局异常处理的三种方式

    在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作 ...

  6. Spring 全局异常处理

    [参考文章]:Spring全局异常处理的三种方式 [参考文章]:Spring Boot 系列(八)@ControllerAdvice 拦截异常并统一处理 [参考文章]:@ControllerAdvic ...

  7. Spring MVC异常处理SimpleMappingExceptionResolver

    Spring MVC异常处理SimpleMappingExceptionResolver[转] (2012-12-07 13:45:33) 转载▼ 标签: 杂谈 分类: 技术分享 Spring3.0中 ...

  8. Spring统一异常处理

    1.为什么要用Spring的统一异常处理? 项目中无论是controller层.service层还是dao层都会有异常发生.每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量 ...

  9. Spring Mvc4 新特性(一)

    前言 Spring Framework的Web层,由spring-web,spring-webmvc,spring-websocket和spring-webmvc-portlet模块组成. 很多人刚学 ...

随机推荐

  1. 十五天精通WCF——第十四天 一起聊聊FaultException

     我们在玩web编程的时候,可能你会不经意的见到一些http500的错误,我想你应该不会陌生的,原因你应该也知道,服务器异常嘛, 这时候clr会把这个未处理的异常抛给iis并且包装成http500的错 ...

  2. IE10 11的css hack

    一.@media -ms-high-contrast @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none){ ...

  3. Docker是什么

    Docker是什么 相信我们很多人都使用多VM(Virtual Machine),也就是虚拟机,简单的来说Docker就是类是于VM的容器,但Docker要轻量得多,VM(Virtual Machin ...

  4. linux 添加用户、权限

    # useradd –d /usr/sam -m sam 此命令创建了一个用户sam,其中-d和-m选项用来为登录名sam产生一个主目录/usr/sam(/usr为默认的用户主目录所在的父目录). 假 ...

  5. (转)android.intent.action.MAIN与android.intent.category.LAUNCHER

    android.intent.action.MAIN决定应用程序最先启动的Activity android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里 在网上看到 ...

  6. linux-3.14.13 看到mpls gso支持

    在net/Kconfig source "net/mpls/Kconfig"

  7. Angular+Flask搭建一个记录工具

    平时用的最多的文本编辑器就是Notepad++,很多东西都是通过Notepad++直接记录的: 没有看完的网页链接 要整理.收藏的网页 读书笔记 要处理的事情 待看/看过的文档和电子书 等等... 随 ...

  8. 单调队列优化DP,多重背包

    单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...

  9. stanford coursera 机器学习编程作业 exercise 6(支持向量机-support vector machines)

    在本练习中,先介绍了SVM的一些基本知识,再使用SVM(支持向量机 )实现一个垃圾邮件分类器. 在开始之前,先简单介绍一下SVM ①从逻辑回归的 cost function 到SVM 的 cost f ...

  10. Hibernate中的inverse

    inverse inverse的英文意思是反向的,倒转的 Hibernate配置文件中的inverse正是这一真实反映,inverse属性只在Hibernate配置文件的集合元素上(list,set, ...