常用的SpringMVC异常处理方式主要是三种:
  1.使用系统定义好的异常处理器   SimpleMappingExceptionResolver

  2.使用自定义异常处理器

  3.使用异常处理注解

SimpleMappingExecptionResolver 异常处理器

  该方式只需要在SpringMVC配置文件中注册该异常处理器Bean即可。该Bean比较特殊,没有id属性

  无需显示调用或被注入给其他<bean/>,当异常发生时 会自动执行该类

  1.自定义异常类

 public class NameException extends Exception {
public NameException() {
super();
} public NameException(String message) {
super(message);
}
}

  2.修改Controller

 @Controller
@RequestMapping("/test")
public class MyController { @RequestMapping(value = "/exception.do")
public ModelAndView method(String name,int age) throws NameException, AgeException {
//int i = 3 / 0; if(!"beijing".equals(name)){
//当异常抛出时,会自动执行异常处理器类
throw new NameException("用户名不准确!");
} if(age > 65){
throw new AgeException("年龄过大!");
} ModelAndView mv = new ModelAndView();
mv.addObject("name", name);
mv.addObject("age",age);
//需在setViewName() 指定的视图前添加 redirect,(默认添加的 forword)才能重定向到 指定资源
//重定向 后,是一个新的request,当把数据添加到Model中 时,会自动往路径后面添加上参数(a.jsp?name=&age=)
mv.setViewName("redirect:/a.jsp"); return mv;
} }

  3.注册异常处理器

 <!-- 注册 SimpleMappingExceptionResolver 这个异常处理器(系统定义好的), 当异常发生时自动执行该类 -->
<bean
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- 默认的错误页面 -->
<property name="defaultErrorView" value="/WEB-INF/errors/defaultErrorPage.jsp"></property> <!-- 用于指定不同类型的异常对应的 处理页面 -->
<property name="exceptionMappings">
<props>
<prop key="com.springmvc.exceptions.NameException">/WEB-INF/errors/nameErrorPage.jsp</prop>
<prop key="com.springmvc.exceptions.AgeException">/WEB-INF/errors/ageErrorPage.jsp</prop>
</props>
</property> <!-- 得到exceptionAttribute属性 , 得到捕获到的异常对象ex ,可以用ex得到一些异常信息 -->
<!-- 应该是将ex对象放到 request 域中了,前台页面可以取出显示 -->
<property name="exceptionAttribute" value="ex"></property>
</bean>

exceptionMappings:Properties 类型属性,用于指定具体的不同类型的异常所对应的异 常响应页面。Key 为异常类的全限定性类名,value 则为响应页面路径

defaultErrorView:指定默认的异常响应页面。若发生的异常不是 exceptionMappings 中 指定的异常,则使用默认异常响应页面。

exceptionAttribute:捕获到的异常对象。一般异常响应页面中使用。

  

  4.定义异常响应页面

 <body>

       <!--
param.name 的 底层执行的 是 request.getParameter("name");
requestScope.name 的底层执行的 是 request.getAttribute();
--> Age Error Page
${ex.message }
</body>

自定义异常处理器

  使用SpringMVC 定义好的SimpleMappingExeceptionResolver异常处理器,可以发生指定异常后的跳转

  但若要实现 在捕获指定异常时,执行一些操作的目的,它是完成不了的。此时,就需要自定义异常处理器

  自定义异常处理器,需要实现HandlerExeceptionResolver接口,并且该类需要在SpringMVC配置文件中配置

  

  a)定义异常处理器

    当一个类实现了HandlerExeceptionResolver接口后,只要有异常发生,

    无论什么异常,都会自动执行接口方法  resolveExeception()

 //设置自定义 异常处理器的好处:在捕获到指定异常后,可以完成一些操作,SimpleMappingExceptionResolver 只能完成页面的跳转,无法执行更多
public class MyExceptionResolver implements HandlerExceptionResolver { //当一个类实现了 HandlerExceptionResolver 接口后,只要有异常发生,无论什么异常,都会执行resolveException方法 (在该异常处理器 注册了的前提下)
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
ModelAndView mv = new ModelAndView();
//将异常对象加入 数据模型中
mv.addObject("ex",ex); //设置默认的错误处理页面 (需要放在自定义异常的前面,不然自定义异常的页面路径可能会被覆盖)
mv.setViewName("/WEB-INF/errors/defaultErrorPage.jsp"); //设置 NameException的 错误处理页面
if(ex instanceof NameException) {
System.out.println("执行一些操作 NameException");
mv.setViewName("/WEB-INF/errors/nameErrorPage.jsp");
}
//设置 AgeException的 错误处理页面
if(ex instanceof AgeException) {
System.out.println("执行一些操作 AgeException");
mv.setViewName("/WEB-INF/errors/ageErrorPage.jsp");
} return mv;
} }

  b)注册异常处理器

 <!-- 注册 MyExceptionResolver 自定义异常处理器, 当异常发生时自动执行该类 (只需要注册就好,其他都已经到 该处理器里面设置好了)-->
<bean class="com.springmvc.ExceptionResolver.MyExceptionResolver"/>

异常处理注解

  使用注解 @ExceptionHandler 可以将一个方法指定为异常处理方法。该注解只有一个可选属性 value,

  是一个Class<?> 数组,用于指定该注解的方法所要处理的异常类,即所要匹配的异常

  而被注解的方法,其返回值可以是ModelAndView、String或void,方法名随意,方法参数可以是Exeception及其子类对象

  HttpServletRequest、HttpServletResponse等。系统会自动为这些方法参数赋值

  a) 定义异常处理的Controller

 //构造这样一个 父类,让需要用到 这些 异常处理 的 Controller 继承这个父类即可
//如果不抽取出来,只写在某个 Controller 中,那么这些 异常处理方法 只会在该处理器生效时生效
//注意,这里加上 @Controller ,不然里面 方法是不会加载的
@Controller
public class BaseController { // 使用 ExceptionHandler ,将一个方法声明为 异常处理方法,可以使用 value 属性,指定该异常处理方法用于处理哪个异常
// 指明 用于处理 NameException
@ExceptionHandler(value = AgeException.class)
public ModelAndView handlerAgeException(Exception ex) {
ModelAndView mv = new ModelAndView();
mv.addObject("ex", ex);
System.out.println("执行一些操作 AgeException");
mv.setViewName("/WEB-INF/errors/ageErrorPage.jsp"); return mv;
} // 指明 用于处理 AgeException
@ExceptionHandler(value = NameException.class)
public ModelAndView handlerNameException(Exception ex) {
ModelAndView mv = new ModelAndView();
mv.addObject("ex", ex);
System.out.println("执行一些操作 NameException");
mv.setViewName("/WEB-INF/errors/nameErrorPage.jsp"); return mv;
} // 默认异常处理
@ExceptionHandler
public ModelAndView handlerdefaultException(Exception ex) {
ModelAndView mv = new ModelAndView();
mv.addObject("ex", ex);
mv.setViewName("/WEB-INF/errors/defaultErrorPage.jsp");
return mv;
} }

  b) 修改Controller,让普通Controller继承自定义好的异常处理 Controller

 //当MyController 出现异常时,会去找BaseController 是否定义了这个异常
public class MyController extends BaseController {

最新文章

  1. input框只能输入整数和浮点数非数字就不输入
  2. &amp;12 二叉搜索树
  3. 用户Word写毕业论文时的文献引用方法
  4. Python 扫面文件夹中的文件
  5. Linux workqueue疑问【转】
  6. CentOS 7 (无盘安装)PXE服务器的搭建(失败求助版)
  7. mmap的使用
  8. gunicorn启动报错gunicorn.errors.HaltServer
  9. C复习手记(Day4)
  10. unix c 06
  11. MIT6.828 JOS系统 lab2
  12. HDU 4451 Dressing
  13. javascript中函数的call,apply及bind方法
  14. shell变量的替换
  15. 用tp框架来对数据库进行增删改
  16. 出题人的RP值(牛客练习赛38--A题)(排序)
  17. 多线程系列三:Lock和Condition
  18. 08: Django使用haystack借助Whoosh实现全文搜索功能
  19. fd与FILE结构体
  20. BZOJ1086 SCOI2005王室联邦

热门文章

  1. clientdataset的使用
  2. 如果使用 Python3(Flask) 一步一步模拟一个网页微信客户端
  3. WordPress的默认循环
  4. 用cmd命令加密文件夹
  5. XXE漏洞原理及利用
  6. 利用先电云iaas平台搭建apache官方大数据平台(ambari2.7+hdp3.0)
  7. # 【ARM-Linux开发】在Win7的电脑上直接运行安装Ubuntu14.04发生的问题 标签(空格分隔): 【Linux开发】 --- > 一段时间以来,一直是在Windows上安装虚拟机
  8. OpenGL.英文
  9. POJ3311 Hie with the Pie 【状压dp/TSP问题】
  10. DS博客作业--07查找