SpringMVC进阶(自定义拦截器以及异常处理)

📅 发布时间:2026/8/28 22:22:48
SpringMVC进阶(自定义拦截器以及异常处理) 文章目录* *1.自定义拦截器 * * * 1.基本介绍 * * 1.说明 * 2.自定义拦截器的三个方法 * 3.流程图 * 2.快速入门 * * 1.Myinterceptor01.java * 2.FurnHandler.java * 3.springDispatcherServlet-servlet.xml配置拦截器 * 4.单元测试 * 3.拦截特定路径 * * 1.拦截指定路径 * 2.通配符配置路径 * 4.细节说明 * 5.多个拦截器 * * 1.执行流程图 * 2.应用实例 * * 1.FurnHandler.java目标方法 * 2.拦截器 * 3.结果展示 * 2.异常处理 * * * 1.基本介绍 * 2.局部异常处理器 * * 1.需求分析 * 2.抛出问题 * * 1.MyExceptionHandler.java * 2.不处理异常则交给tomcat处理 * 3.局部异常实例 * * 1.MyExceptionHandler.java * 2.exception_mes.jsp * 3.结果展示 * 3.全局异常处理器 * 1.基本介绍 * 2.全局异常实例 * * * 1.MyGlobalException.java * 2.global_exception.jsp * 3.结果展示 * 3.细节说明 * * 1.局部异常优先级高于全局异常 * 2.处理异常机制 * 4.自定义异常 * * 1.基本介绍 * 2.自定义异常应用实例 * * 1.SelfException.java * 2.selfex.java * 3.结果展示 * 3.可以使用有参构造抛出异常交给异常处理器接管 * * 1.SelfException.java * 2.selfex.java抛出自定义异常并制定message * 3.MyGlobalException.java捕获自定义异常 * 4.结果展示 * 5.统一异常处理器 * * 1.基本介绍 * 2.需求分析 * 3.具体实现 * * 1.MyExceptionHandler.java抛出数组越界异常 * 2.springDispatcherServlet-servlet.xml配置统一异常处理器 * 3.arrEx.jsp异常处理页面 * 4.结果展示 * 6.对未知异常进行统一处理 * * 1.具体实现 * * 1.MyExceptionHandler.java抛出异常 * 2.springDispatcherServlet-servlet.xml修改统一异常处理器 * 3.allEx.jsp所有未知异常的处理 * 4.结果展示 * 7.异常处理的优先级 * * 1.局部异常处理器 * 2.全局异常处理器 * 3.统一异常处理器 * 4.Tomcat默认机制 * 3.springMVC阶段的配置文件 * * * 1.springDispatcherServlet-servlet.xml * 2.web.xml### 1.自定义拦截器##### 1.基本介绍###### 1.说明###### 2.自定义拦截器的三个方法###### 3.流程图##### 2.快速入门###### 1.Myinterceptor01.java package com.sun.web.interceptor; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * author 孙显圣 * version 1.0/ Component //注入容器 public class Myinterceptor01 implements HandlerInterceptor { /* * 在目标方法执行前被调用如果返回false目标方法不会被执行 * * param request * param response * param handler * return * throws Exception/ Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println(“preHandle”); return true; } /* * 在目标方法执行后被调用可以获取目标方法返回的ModelAndView可以根据业务进行二次处理 * * param request * param response * param handler * param modelAndView * throws Exception/ Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println(“postHandle”); } /* * 在渲染之后会被调用可以进行资源清理工作 * * param request * param response * param handler * param ex * throws Exception/ Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println(“afterCompletion”); } } ###### 2.FurnHandler.java package com.sun.web.interceptor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /* * author 孙显圣 * version 1.0/ Controller public class FurnHandler { RequestMapping(“/hi”) public String hi() { System.out.println(“hi方法被调用”); return “success”; } RequestMapping(“/hello”) public String hello() { System.out.println(“hello方法被调用”); return “success”; } } ###### 3.springDispatcherServlet-servlet.xml配置拦截器 mvc:interceptors /mvc:interceptors ###### 4.单元测试##### 3.拦截特定路径###### 1.拦截指定路径 mvc:interceptors mvc:interceptor mvc:mapping path“/hi”/ /mvc:interceptor /mvc:interceptors###### 2.通配符配置路径 mvc:interceptors mvc:interceptor mvc:mapping path/h/ mvc:exclude-mapping path“/hi”/ /mvc:interceptor /mvc:interceptors##### 4.细节说明##### 5.多个拦截器###### 1.执行流程图###### 2.应用实例###### 1.FurnHandler.java目标方法 RequestMapping(“/topic”) public String topic() { System.out.println(“topic执行”); return “success”; } ###### 2.拦截器 Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //只要参数中有topic是topic就直接响应 String topic request.getParameter(“topic”); if (topic.equals(“topic”)) { response.setContentType(“text/html;charsetutf-8”); response.getWriter().write(“请不要乱说话”); } //后面的不再执行 return false; } ###### 3.结果展示### 2.异常处理##### 1.基本介绍##### 2.局部异常处理器###### 1.需求分析###### 2.抛出问题###### 1.MyExceptionHandler.java package com.sun.web.exception; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; /** * author 孙显圣 * version 1.0/ Controller public class MyExceptionHandler { RequestMapping(“/getNum/{num}”) public String getNUm(PathVariable(“num”) Integer num) { //这里如果传进来的是0则会出现异常 System.out.println(10 / num); return “success”; } } ###### 2.不处理异常则交给tomcat处理###### 3.局部异常实例###### 1.MyExceptionHandler.java package com.sun.web.exception; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; /* * author 孙显圣 * version 1.0/ Controller public class MyExceptionHandler { RequestMapping(“/getNum/{num}”) public String getNUm(PathVariable(“num”) Integer num) { //这里如果传进来的是0则会出现异常 System.out.println(10 / num); return “success”; } //处理异常 ExceptionHandler({ArithmeticException.class, NullPointerException.class}) //参数是一个数组可以接受多个异常类型 public String exceptionHandler(Exception ex, HttpServletRequest request) { //当出现异常时异常会自动封装到ex中数据绑定 System.out.println(“异常的信息” ex.getMessage()); //可以将异常信息请求转发给下一个页面 request.setAttribute(“reason”, ex.getMessage()); return “exception_mes”; } } ###### 2.exception_mes.jsp %-- Date: 2024/3/1 Time: 8:47 User: 孙显圣 Version:1.0 --% % page contentType“text/html;charsetUTF-8” language“java” %Title出现异常异常信息是KaTeX parse error: Expected EOF, got # at position 57: …/html #̲##### 3.结果展示![i…{requestScope.reason}###### 3.结果展示##### 3.细节说明###### 1.局部异常优先级高于全局异常###### 2.处理异常机制先从发生异常的方法所在的类中查找有ExceptionHandler注解的方法如果异常不匹配则进行下一步* 从有ControllerAdvice注解的类查找有ExceptionHandler注解的方法如果匹配异常则处理无法匹配则交给tomcat处理##### 4.自定义异常###### 1.基本介绍###### 2.自定义异常应用实例###### 1.SelfException.java package com.sun.web.exception; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; /** * author 孙显圣 * version 1.0/ //reason指的是返回的异常原因信息value指的是返回的响应状态 ResponseStatus(reason “年龄需要在1-120之间”, value HttpStatus.BAD_REQUEST) public class SelfException extends RuntimeException{ } ###### 2.selfex.java package com.sun.web.exception; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /* * author 孙显圣 * version 1.0/ Controller public class selfex { RequestMapping(“/selfex”) public void ex() { throw new SelfException(); } } ###### 3.结果展示###### 3.可以使用有参构造抛出异常交给异常处理器接管###### 1.SelfException.java package com.sun.web.exception; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; /* * author 孙显圣 * version 1.0/ //reason指的是返回的异常原因信息value指的是返回的响应状态 ResponseStatus(reason “年龄需要在1-120之间”, value HttpStatus.BAD_REQUEST) //注意这个是给tomcat看的 public class SelfException extends RuntimeException{ public SelfException() { } //这样就可以从全局异常里获取message了 public SelfException(String message) { super(message); } } ###### 2.selfex.java抛出自定义异常并制定message package com.sun.web.exception; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /* * author 孙显圣 * version 1.0/ Controller public class selfex { RequestMapping(“/selfex”) public void ex() { throw new SelfException(“年龄需要在1-100”); //指定message } } ###### 3.MyGlobalException.java捕获自定义异常 package com.sun.web.exception; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import javax.servlet.http.HttpServletRequest; /* * author 孙显圣 * version 1.0/ ControllerAdvice //表示这个是处理全局异常的类 public class MyGlobalException { //处理自定义异常 ExceptionHandler(SelfException.class) public String selfex(Exception ex, HttpServletRequest request) { //将全局异常信息请求转发 request.setAttribute(“reason”, ex.getMessage()); return “global_exception”; } } ###### 4.结果展示##### 5.统一异常处理器###### 1.基本介绍###### 2.需求分析###### 3.具体实现###### 1.MyExceptionHandler.java抛出数组越界异常 package com.sun.web.exception; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /* * author 孙显圣 * version 1.0/ Controller public class MyExceptionHandler { //抛出数组越界异常局部异常处理器和全局异常处理器都没有处理则会交给统一异常处理器来处理 RequestMapping(“/arr”) public String array() { int[] ints {1, 2, 3}; System.out.println(ints[1222]); //交给统一异常处理器来处理 return “success”; } } ###### 2.springDispatcherServlet-servlet.xml配置统一异常处理器 arrEx ###### 3.arrEx.jsp异常处理页面 %-- Date: 2024/3/1 Time: 10:02 User: 孙显圣 Version:1.0 --% % page contentType“text/html;charsetUTF-8” language“java” %Title数组越界异常###### 4.结果展示##### 6.对未知异常进行统一处理###### 1.具体实现###### 1.MyExceptionHandler.java抛出异常 package com.sun.web.exception; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /* * author 孙显圣 * version 1.0/ Controller public class MyExceptionHandler { //没有归类的异常 RequestMapping(“/test”) public String test() { String str “hello”; char c str.charAt(10); //这里会抛出异常 return “success”; } } ###### 2.springDispatcherServlet-servlet.xml修改统一异常处理器 arrEx allEx ###### 3.allEx.jsp所有未知异常的处理 %-- Date: 2024/3/1 Time: 10:12 User: 孙显圣 Version:1.0 --% % page contentType“text/html;charsetUTF-8” language“java” %Title所有未知异常的处理界面###### 4.结果展示##### 7.异常处理的优先级###### 1.局部异常处理器方法上加ExceptionHandler({ArithmeticException.class, NullPointerException.class}) //参数是一个数组可以接受多个异常类型###### 2.全局异常处理器* 类上加ControllerAdvice //表示这个是处理全局异常的类* 方法上加ExceptionHandler({ArithmeticException.class, NullPointerException.class}) //参数是一个数组可以接受多个异常类型###### 3.统一异常处理器* 匹配方式是匹配尽可能具体的类型跟配置的顺序无关* 在Spring配置文件中配置 arrEx allEx ###### 4.Tomcat默认机制### 3.springMVC阶段的配置文件##### 1.springDispatcherServlet-servlet.xml ?xml version1.0 encodingUTF-8? context:component-scan base-package“com.sun.web”/ mvc:annotation-driven/mvc:annotation-driven mvc:default-servlet-handler/ mvc:interceptors mvc:interceptor mvc:mapping path“/topic”/ /mvc:interceptor /mvc:interceptors arrEx allEx ##### 2.web.xml ?xml version1.0 encodingUTF-8? CharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 CharacterEncodingFilter / HiddenHttpMethodFilter org.springframework.web.filter.HiddenHttpMethodFilter HiddenHttpMethodFilter / springDispatcherServlet org.springframework.web.servlet.DispatcherServlet 1 springDispatcherServlet /