SpringMVC学习04:异常处理和拦截器

SpringMVC学习04:异常处理和拦截器

异常处理

异常处理思路

Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进
行异常的处理

SpringMVC的异常处理

  1. 自定义异常类

    /**
     * 自定义异常类
     */
    public class SysException extends Exception {
    
        private String message;
    
        public SysException(String message) {
            this.message = message;
        }
    
        @Override
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    }
    
  2. 自定义异常处理器,需要实现HandlerExceptionResolver接口

    /**
     * 自定义异常处理器
     */
    public class SysExceptionResolver implements HandlerExceptionResolver {
    
        /**
         * 跳转到具体的错误页面的方法
         * @param httpServletRequest
         * @param httpServletResponse
         * @param o
         * @param e
         * @return
         */
        @Override
        public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
            SysException ex = null;
            //获取异常对象
            if(e instanceof SysException)
                ex = (SysException) e;
            else
                ex = new SysException("请联系管理员");
            ModelAndView mv = new ModelAndView();
            //存入错误的提示信息
            mv.addObject("errorMsg",ex.getMessage());
            mv.setViewName("error");
            return mv;
        }
    }
    
  3. 配置异常处理器,在SpringMVC.xml中添加配置

    <!--配置异常处理器-->
        <bean id="sysExceptionResolver" class="com.chenpeng.exception.SysExceptionResolver"></bean>
    

拦截器

拦截器概述

  1. SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术
  2. 可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链
    中的拦截器会按着定义的顺序执行
  3. 拦截器和过滤器的功能比较类似,有区别
    1. 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术
    2. 拦截器是SpringMVC框架独有的
    3. 过滤器配置了/*,可以拦截任何资源
    4. 拦截器只会对控制器中的方法进行拦截
  4. 拦截器是AOP思想的一种实现方式
  5. 自定义拦截器需要实现HandlerInterceptor接口

自定义拦截器

  1. 创建拦截器类,实现HandlerInterceptor接口,重写需要的方法

    public class MyInterceptor1 implements HandlerInterceptor {
    
        /**
         * controller方法执行前,进行拦截的方法
         * return true 放行
         * return 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拦截方法执行了1");
            return true;
        }
    
        /**
         * controller方法执行后在jsp视图执行前,进行拦截的方法
         * @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拦截方法执行了1");
        }
    
        /**
         * 在jsp视图执行后执行
         * @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拦截方法执行了1");
        }
    }
    

    HandlerInterceptor接口中的方法

    • preHandle方法是controller方法执行前拦截的方法
      • 可以使用request或者response跳转到指定的页面
      • return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法
      • return false不放行,不会执行controller中的方法
    • postHandle是controller方法执行后在jsp视图执行前执行的方法
      • 可以使用request或者response跳转到指定的页面
      • 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示
    • afterCompletion方法是在jsp执行后执行
      • 不能再使用request或者response跳转页面
  2. 配置自定义的拦截器类,在SpringMVC.xml中添加配置

    <!--配置拦截器-->
        <mvc:interceptors>
            <mvc:interceptor>
                <!--哪些方法进行拦截-->
                <mvc:mapping path="/user/*"/>
                <!--哪些方法不拦截
                <mvc:exclude-mapping path=""/>-->
                <!--注册拦截器对象-->
                <bean class="com.chenpeng.interceptor.MyInterceptor1"></bean>
            </mvc:interceptor>
        </mvc:interceptors>
    

配置多个拦截器

配置两个拦截器

<!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--哪些方法进行拦截-->
            <mvc:mapping path="/user/*"/>
            <!--哪些方法不拦截
            <mvc:exclude-mapping path=""/>-->
            <!--注册拦截器对象-->
            <bean class="com.chenpeng.interceptor.MyInterceptor1"></bean>
        </mvc:interceptor>
        <mvc:interceptor>
            <!--哪些方法进行拦截-->
            <mvc:mapping path="/user/*"/>
            <!--哪些方法不拦截
            <mvc:exclude-mapping path=""/>-->
            <!--注册拦截器对象-->
            <bean class="com.chenpeng.interceptor.MyInterceptor2"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

多个拦截器执行的顺序

preHandle拦截方法执行了1
preHandle拦截方法执行了2
testInterceptor执行了
postHandle拦截方法执行了2
postHandle拦截方法执行了1
success.jsp执行了
afterCompletion拦截方法执行了2
afterCompletion拦截方法执行了1
posted @ 2020-04-14 16:57  codeDD  阅读(131)  评论(0编辑  收藏  举报