1. 程式人生 > 實用技巧 >SpringMvc異常處理和SpringMvc攔截器

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>