SpringMvc异常处理和SpringMvc拦截器

1. 异常处理思路

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

SpringMVC的异常处理

自定义异常类

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;
    }

    @Override
    public String toString() {
        return "SysException{" +
                "message='" + message + '\'' +
                '}';
    }
}

自定义异常管理器

//配置自定义异常管理器


public class HandlerSysException implements HandlerExceptionResolver {
    /**
     * 自定义异常管理器
     * @param httpServletRequest
     * @param httpServletResponse
     * @param o
     * @param e
     * @return ModelAndView
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        SysException se=null;
        if (e instanceof SysException){
            se=(SysException)e;
        }else{
            se=new SysException("服务器崩溃请联系管理人员---------");
        }
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("errorMessage",se.getMessage());
        modelAndView.setViewName("error");

        return modelAndView;
    }
}

在spring.xml中配置异常管理器

 <!--配置自定义异常管理器-->
    <bean id="handlerSysException" class="com.itheim.exception.HandlerSysException"/>

:SpringMVC框架中的拦截器

1. 拦截器的概述

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

2. 自定义拦截器步骤

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

/**
 * <h3>Springmvc_day01_01_start</h3>
 * <p>定义拦截器</p>
 *
 * @author : Dell
 * @date : 2020-07-31 11:42
 **/
public class MyInterceptor  implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截成功start-----------");
        return true;
    }

    /**
     * 控制器执行后执行
     * @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("控制器执行完毕了-------------------");
    }

    /**
     * 最后执行 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("执行完毕--------------");
    }
}

配置拦截器

<!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--指定要拦截的地址-->
            <mvc:mapping path="/user/*"/>
            <bean id="myInterceptor" class="com.itheim.Interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

3. HandlerInterceptor接口中的方法

  1. preHandle方法是controller方法执行前拦截的方法
  2. 可以使用request或者response跳转到指定的页面
  3. return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
  4. return false不放行,不会执行controller中的方法。
  5. postHandle是controller方法执行后执行的方法,在JSP视图执行前。
  6. 可以使用request或者response跳转到指定的页面
  7. 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
  8. postHandle方法是在JSP执行后执行
  9. request或者response不能再跳转页面了

配置多个拦截器

  1. 再编写一个拦截器的类
  2. 配置2个拦截器
<!-- 配置拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor> <!-- 哪些方法进行拦截 -->
            <mvc:mapping path="/user/*"/> <!-- 哪些方法不进行拦截 <mvc:exclude-mapping path=""/> -->
            <!-- 注册拦截器对象 -->
            <bean class="cn.itcast.demo1.MyInterceptor1"/>
        </mvc:interceptor>
        <mvc:interceptor> <!-- 哪些方法进行拦截 -->
            <mvc:mapping path="/**"/> <!-- 注册拦截器对象 -->
            <bean class="cn.itcast.demo1.MyInterceptor2"/>
        </mvc:interceptor>
    </mvc:interceptors>
posted @ 2020-08-01 15:15  錵開や落幕  阅读(138)  评论(0编辑  收藏  举报