一:说明
1.介绍
Springmvc提供HandlerExceptionResolver处理异常,包括Handler映射,数据绑定,以及目标方法执行。
2.几个接口的实现类
AnnotationMethodHandlerExceptionResolver
DefaultHandlerExceptionResolver
ResponseStatusExceptionResolver
SimpleMappingExceptonResolver
ExceptionHandlerExceptionResolver
当开发的时候,如果配置了<mvc:annotation-driven>时,就默认配置了一下的实现类:
ExceptionHandlerExceptionResolver,ResponseStatusExceptionResolver,DefaultHandlerExceptionResolver
二:ExceptionHandlerExceptionResolver
1.介绍
2.程序
可以做到,出现异常,使用springmvc的注解进行处理异常。
1 package com.spring.it.exception; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.ExceptionHandler; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.bind.annotation.RequestParam; 7 8 @Controller 9 public class ExceptionHandlerDemo { 10 /** 11 *异常处理类 12 */ 13 @RequestMapping("/testExceptionHandlerExceptionResolver") 14 public String testExceptionHandlerExceptionResolver(@RequestParam("i") int i) { 15 System.out.println("result="+(10/i)); 16 return "success"; 17 } 18 19 /** 20 * 异常的处理 21 */ 22 @ExceptionHandler({ArithmeticException.class}) 23 public String handlerArithmeticException(Exception ex) { 24 System.out.println("come a exception:"+ex); 25 return "error"; 26 } 27 28 }
3.error.jsp
1 <%@ page language="java" contentType="text/html; charset=ISO-8859-1" 2 pageEncoding="ISO-8859-1"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <h3>Error page</h3> 11 </body> 12 </html>
4.效果
5.页面显示异常的方式
@ExceptionHandler方法的入参中不能传入Map,若是希望将异常的信息导入到页面,需要使用ModelAndView方法作为返回值。
1 package com.spring.it.exception; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.ExceptionHandler; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.bind.annotation.RequestParam; 7 import org.springframework.web.servlet.ModelAndView; 8 9 @Controller 10 public class ExceptionHandlerDemo { 11 /** 12 *异常处理类 13 */ 14 @RequestMapping("/testExceptionHandlerExceptionResolver") 15 public String testExceptionHandlerExceptionResolver(@RequestParam("i") int i) { 16 System.out.println("result="+(10/i)); 17 return "success"; 18 } 19 20 /** 21 * 异常的处理 22 */ 23 @ExceptionHandler({ArithmeticException.class}) 24 public ModelAndView handlerArithmeticException(Exception ex) { 25 System.out.println("come a exception:"+ex); 26 ModelAndView mv=new ModelAndView("error"); 27 mv.addObject("exception", ex); 28 return mv; 29 } 30 31 }
6.error。jsp
获取异常信息
1 <%@ page language="java" contentType="text/html; charset=ISO-8859-1" 2 pageEncoding="ISO-8859-1"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <h3>Error page</h3> 11 ${exception } 12 </body> 13 </html>
7.效果
8.优先级
如果出现多个异常的处理方法,走哪一个方法呢?
是找与异常匹配度更高的处理异常方法。
9.@ControllerAdvice
如果在当前的@ExceptionHandler处理当前方法出现的异常,则去由@ControllerAdvice标记的类中查找@ExceptionHandler标记的方法
结构:
ExceptionHandlerDemo:
1 package com.spring.it.exception; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.ExceptionHandler; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.bind.annotation.RequestParam; 7 import org.springframework.web.servlet.ModelAndView; 8 9 @Controller 10 public class ExceptionHandlerDemo { 11 /** 12 *异常处理类 13 */ 14 @RequestMapping("/testExceptionHandlerExceptionResolver") 15 public String testExceptionHandlerExceptionResolver(@RequestParam("i") int i) { 16 System.out.println("result="+(10/i)); 17 return "success"; 18 } 19 20 21 }
HandlerException:
1 package com.spring.it.exception; 2 3 import org.springframework.web.bind.annotation.ControllerAdvice; 4 import org.springframework.web.bind.annotation.ExceptionHandler; 5 import org.springframework.web.servlet.ModelAndView; 6 7 @ControllerAdvice 8 public class HandlerException { 9 /** 10 * 异常的处理 11 */ 12 @ExceptionHandler({ArithmeticException.class}) 13 public ModelAndView handlerArithmeticException(Exception ex) { 14 System.out.println("come a exception:"+ex); 15 ModelAndView mv=new ModelAndView("error"); 16 mv.addObject("exception", ex); 17 return mv; 18 } 19 20 }
三:ResponseStatusExceptionResolvler
1.介绍
2.@ResponseStatus注解的类
1 package com.spring.it.exception; 2 3 import org.springframework.http.HttpStatus; 4 import org.springframework.web.bind.annotation.ResponseStatus; 5 6 @ResponseStatus(value=HttpStatus.FORBIDDEN,reason="用户名与密码不匹配") 7 public class UserNameNotMatchPasswordException extends RuntimeException{ 8 private static final long serialVersionUID=1L; 9 }
3.处理异常类
1 package com.spring.it.exception; 2 3 import org.apache.tomcat.util.buf.UEncoder; 4 import org.springframework.stereotype.Controller; 5 import org.springframework.web.bind.annotation.ExceptionHandler; 6 import org.springframework.web.bind.annotation.RequestMapping; 7 import org.springframework.web.bind.annotation.RequestParam; 8 import org.springframework.web.servlet.ModelAndView; 9 10 @Controller 11 public class ExceptionHandlerDemo { 12 /** 13 *异常处理类,test ExceptionHandlerExceptionResolver 14 */ 15 @RequestMapping("/testExceptionHandlerExceptionResolver") 16 public String testExceptionHandlerExceptionResolver(@RequestParam("i") int i) { 17 System.out.println("result="+(10/i)); 18 return "success"; 19 } 20 21 /** 22 *异常处理类,test ExceptionHandlerExceptionResolver 23 */ 24 @RequestMapping("/testResponseStatusExceptionResolver") 25 public String testResponseStatusExceptionResolver(@RequestParam("i") int i) { 26 if(i==12) { 27 throw new UserNameNotMatchPasswordException(); 28 }else { 29 System.out.println("conmmon execute"); 30 } 31 return "success"; 32 } 33 34 35 36 }
4.效果
四:DefaultHandlerExceptionResolver
1.介绍
五:SimpleMappingExceptionResolver
1.介绍
2.处理类
1 package com.spring.it.exception; 2 3 import org.apache.tomcat.util.buf.UEncoder; 4 import org.springframework.stereotype.Controller; 5 import org.springframework.web.bind.annotation.ExceptionHandler; 6 import org.springframework.web.bind.annotation.RequestMapping; 7 import org.springframework.web.bind.annotation.RequestParam; 8 import org.springframework.web.servlet.ModelAndView; 9 10 @Controller 11 public class ExceptionHandlerDemo { 12 /** 13 *异常处理类,test ExceptionHandlerExceptionResolver 14 */ 15 @RequestMapping("/testExceptionHandlerExceptionResolver") 16 public String testExceptionHandlerExceptionResolver(@RequestParam("i") int i) { 17 System.out.println("result="+(10/i)); 18 return "success"; 19 } 20 21 /** 22 *异常处理类,test ExceptionHandlerExceptionResolver 23 */ 24 @RequestMapping("/testResponseStatusExceptionResolver") 25 public String testResponseStatusExceptionResolver(@RequestParam("i") int i) { 26 if(i==12) { 27 throw new UserNameNotMatchPasswordException(); 28 }else { 29 System.out.println("conmmon execute"); 30 } 31 return "success"; 32 } 33 34 /** 35 *异常处理类,test ExceptionHandlerExceptionResolver 36 */ 37 @RequestMapping("/testSimpleMappingExceptionResolver") 38 public String testSimpleMappingExceptionResolver(@RequestParam("i") int i) { 39 String[] array=new String[10]; 40 String num=array[i]; 41 System.out.println("num:"+num); 42 return "success"; 43 } 44 45 46 47 }
2.效果
3.解决方式
这个异常可以有SimpleMappingExceptionResolver来处理。
在xml中注册。
出现什么异常转到哪一个页面。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context-4.0.xsd 10 http://www.springframework.org/schema/mvc 11 http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> 12 <!-- 配置自定义扫描的包 --> 13 <context:component-scan base-package="com.spring.it" ></context:component-scan> 14 15 <!-- 配置视图解析器 --> 16 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 17 <property name="prefix" value="/WEB-INF/views/" /> 18 <property name="suffix" value=".jsp" /> 19 </bean> 20 21 <mvc:annotation-driven></mvc:annotation-driven> 22 23 <!-- 转换器 --> 24 <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> 25 <property name="converters"> 26 <set> 27 <ref bean="employeeConverter"/> 28 </set> 29 </property> 30 </bean> 31 <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> 32 33 <mvc:default-servlet-handler/> 34 <mvc:annotation-driven ignore-default-model-on-redirect="true"></mvc:annotation-driven> 35 36 <!-- 国家化 --> 37 <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 38 <property name="basename" value="i18n"></property> 39 </bean> 40 41 <!-- <mvc:view-controller path="/i18n" view-name="i18n"/> --> 42 <mvc:view-controller path="/i18n2" view-name="i18n2"/> 43 44 <!-- 配置SessionLocaleResolver --> 45 <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean> 46 47 48 <mvc:interceptors> 49 <!-- 配置自定义拦截器 --> 50 <bean class="com.spring.it.interceptors.FirstInterceptor"></bean> 51 <!-- 配置拦截器的作用路径 --> 52 <mvc:interceptor> 53 <mvc:mapping path="/emps"/> 54 <bean class="com.spring.it.interceptors.SecondInterceptor"></bean> 55 </mvc:interceptor> 56 57 <!-- 配置LocaleChangeInterceter拦截器 --> 58 <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean> 59 </mvc:interceptors> 60 61 <!-- 配置CommonsMultipartResolver --> 62 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 63 <property name="defaultEncoding" value="UTF-8"></property> 64 <property name="maxUploadSize" value="102400"></property> 65 </bean> 66 67 <!-- 配置SimpleMappingExceptionResolver来映射异常 --> 68 <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 69 <property name="exceptionMappings"> 70 <props> 71 <prop key="java.lang.ArrayIndexOutOfBoundsException">error</prop> 72 </props> 73 </property> 74 </bean> 75 </beans>
4.效果
在页面上可以看到异常的情况。