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配置拦截器
4.单元测试
3.拦截特定路径
1.拦截指定路径
2.通配符配置路径
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;charset=utf-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
Title
出现异常
异常信息是${requestScope.reason}
3.结果展示
3.全局异常处理器
1.基本介绍
2.全局异常实例
1.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(ArithmeticException.class) //这个是处理算数异常的算数异常处理器 public String globalException(Exception ex, HttpServletRequest request) { System.out.println("全局异常信息是=" + ex.getMessage()); //将全局异常信息请求转发 request.setAttribute("reason", ex.getMessage()); return "global_exception"; } }
2.global_exception.jsp
Title
出现异常
全局异常信息是${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异常处理页面
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所有未知异常的处理
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
arrEx allEx
2.web.xml
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 /
- 方法上加@ExceptionHandler({ArithmeticException.class, NullPointerException.class}) //参数是一个数组,可以接受多个异常类型
相关阅读:
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理!
部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!
图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!