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

2024-06-04 4370阅读

文章目录

    • 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.说明

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

                                                        2.自定义拦截器的三个方法

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

                                                        3.流程图

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

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

                                                        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.单元测试

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

                                                        3.拦截特定路径
                                                        1.拦截指定路径
                                                            
                                                            
                                                                
                                                                
                                                                    
                                                                    
                                                                
                                                            
                                                        

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

                                                        2.通配符配置路径
                                                            
                                                            
                                                                
                                                                
                                                                    
                                                                    
                                                                    
                                                                    
                                                                    
                                                                
                                                            
                                                        

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

                                                        4.细节说明

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

                                                        5.多个拦截器
                                                        1.执行流程图

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

                                                        2.应用实例

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

                                                        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.结果展示

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

                                                        2.异常处理

                                                        1.基本介绍

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

                                                        2.局部异常处理器
                                                        1.需求分析

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

                                                        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处理

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

                                                        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.结果展示

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

                                                        3.全局异常处理器
                                                        1.基本介绍

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

                                                        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.结果展示

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

                                                        3.细节说明
                                                        1.局部异常优先级高于全局异常
                                                        2.处理异常机制
                                                        • 先从发生异常的方法所在的类中查找有@ExceptionHandler 注解的方法,如果异常不匹配则进行下一步
                                                        • 从有@ControllerAdvice 注解的类查找有@ExceptionHandler 注解的方法,如果匹配异常则处理,无法匹配则交给tomcat处理
                                                          4.自定义异常
                                                          1.基本介绍

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

                                                          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.结果展示

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

                                                          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.结果展示

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

                                                          5.统一异常处理器
                                                          1.基本介绍

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

                                                          2.需求分析

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

                                                          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.结果展示

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

                                                          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.结果展示

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

                                                          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
                                                                        
                                                                        /
                                                                    
                                                                
                                                                

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]