SpringMVC的异常处理主要有以下四种方式:
- 使用SpringMVC自带的异常处理类:SimpleMappingExceptionResolver
- 自定义异常处理类:实现HandlerExceptionResolver接口
- 使用注解:@ExpceptionHander
- 使用注解:@ExceptionHandler + @ControllerAdvice
目录
一、使用SpringMVC自带的异常处理类:SimpleMappingExceptionResolver
二、自定义异常处理类:实现HandlerExceptionResolver接口
四、 使用注解:@ExceptionHandler + @ControllerAdvice
一、使用SpringMVC自带的异常处理类:SimpleMappingExceptionResolver
配置文件中设置如下:
<!--异常处理 方案一,用系统自带的类--> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="java.lang.ArithmeticException">/WEB-INF/page/error/runtime.jsp</prop> <prop key="java.io.IOException">/WEB-INF/page/error/io.jsp</prop> <prop key="java.lang.ClassNotFoundException">/WEB-INF/page/error/not.jsp</prop> </props> </property> <!--异常对象属性名,可以通过EL表达式访问--> <property name="exceptionAttribute" value="ex"/> <property name="defaultErrorView" value="/WEB-INF/page/error/default.jsp"/> </bean>
二、自定义异常处理类:实现HandlerExceptionResolver接口
自定义类的实现如下:
@Component public class MyExceptionResolver2 implements HandlerExceptionResolver { public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { ModelAndView mv = new ModelAndView(); mv.addObject("ex",ex); mv.addObject("name","xiaomage"); if (ex instanceof RuntimeException) { mv.setViewName("/WEB-INF/page/error/runtime.jsp"); } else { mv.setViewName("/WEB-INF/page/error/default.jsp"); } return mv; } }
三、使用注解:@ExpceptionHander
这种方式用的比较少,因为异常处理和注解都必须在同一个controller,配置如下:
@RequestMapping("/test3") public String test3() throws Exception { throw new IOException("test3"); } @RequestMapping("/test4") public String test4() { throw new ClassCastException("test4"); } @ExceptionHandler({ArithmeticException.class, IOException.class}) public ModelAndView resolveException1(Exception ex) { ModelAndView mv = new ModelAndView(); mv.addObject("ex",ex); System.out.println(ex); mv.setViewName("/WEB-INF/page/error/runtime.jsp"); return mv; } @ExceptionHandler() public ModelAndView resolveException2(Exception ex) { ModelAndView mv = new ModelAndView(); mv.addObject("ex",ex); mv.setViewName("/WEB-INF/page/error/default.jsp"); return mv; }
四、 使用注解:@ExceptionHandler + @ControllerAdvice
这种方式也需要创建一个类,但是不需要实现接口,代码如下:
@ControllerAdvice public class MyExceptionResolver { @ExceptionHandler({ArithmeticException.class, IOException.class}) public ModelAndView resolveException1(Exception ex) { ModelAndView mv = new ModelAndView(); mv.addObject("ex",ex); System.out.println(ex); mv.setViewName("/WEB-INF/page/error/runtime.jsp"); return mv; } @ExceptionHandler() public ModelAndView resolveException2(Exception ex) { ModelAndView mv = new ModelAndView(); mv.addObject("ex",ex); mv.setViewName("/WEB-INF/page/error/default.jsp"); return mv; } }
相关配置文件如下:
<%-- Created by IntelliJ IDEA. User: majiancheng Date: 2022/10/13 Time: 上午9:37 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> This is runtime.jsp.异常信息:${ex} </body> </html>
web.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--配置SpringMVC自带的DispatchCherServlet--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--Spring的配置文件位置--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </init-param> <!--项目一旦部署到服务器,就会创建servlet ,值越小越先创建--> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!--拦截所有请求--> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>