1. 程式人生 > >JavaEE開發之SpringMVC中的自定義攔截器及異常處理

JavaEE開發之SpringMVC中的自定義攔截器及異常處理

上篇部落格我們聊了《》,本篇部落格我們就聊一下自定義攔截器的實現、以及使用ModelAndView物件將Controller的值載入到JSTL上、最後再聊一下異常的捕獲處理。這些在日常開發中都是經常使用的東西。具體請看下方內容。

一、自定義攔截器

顧名思義,攔截器是負責攔截某些東西的工具。本部分我們建立的攔截器是負責攔截請求的。這個攔截器類似於高速收費站,只要是想上高速的,都得經過我這個攔截器才可以。也就是說,接下來我們所建立的攔截器就類似於收費站的作用、所有的使用者請求都會經過我們這個攔截器。廢話少說,接下來我們就來建立一個攔截器,並部署到我們的Spring中。

1、自定義攔截器的建立

接下來我們就要建立自定義攔截器了,首先我們建立一個Java類,命名為CustomInterceptor

。因為我們要建立的是Spring中的攔截器,所以要繼承與springframework中的HandlerInterceptorAdapter抽象類。建立CustomInterceptor類的過程如下

  

HandlerInterceptorAdapter是Spring框架中自定義攔截器的介面卡,我們可以看一下HandlerInterceptorAdapter抽象類的具體實現,下方是我們關聯的Spring框架的原始碼中的HandlerInterceptorAdapter抽象類的實現。

從下方原始碼中我們不難看出HandlerInterceptorAdapter抽象類實現了AsyncHandlerInterceptor

介面,在HandlerInterceptorAdapter的每個方法中並沒有具體實現什麼東西,所以我們繼承HandlerInterceptorAdapter後,要對相應的方法進行實現。這些方法會在攔截使用者請求的特定階段去執行,下方會具體介紹到。

  

2、自定義攔截器中相應方法的重寫

下方程式碼段就是我們CustomInterceptor類中所重寫的方法。preHandle()方法會在請求處理之前執行,postHandle()方法會在請求處理後執行,afterCompletion()方法會在請求完成並攔截完成後執行。下方是對相應的方法進行了重寫。

 1 public class CustomInterceptor extends
HandlerInterceptorAdapter { 2 //請求處理之前執行的方法 3 @Override 4 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 5 throws Exception { 6 System.out.println("在請求處理之前執行該方法-preHandle"); 7 request.setAttribute("startTime", System.currentTimeMillis()); 8 return true; 9 } 10 11 //在請求處理之後執行該方法 12 @Override 13 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 14 ModelAndView modelAndView) throws Exception { 15 System.out.println("在請求處理之後執行該方法-postHandle"); 16 long startTime = (Long) request.getAttribute("startTime"); 17 long handleTime = System.currentTimeMillis() -startTime; 18 System.out.println("本次請求花費了:" + handleTime + "ms\n"); 19 } 20 21 //請求處理完成所執行的方法 22 @Override 23 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 24 throws Exception { 25 System.out.println("請求處理完成所執行的方法-afterCompletion"); 26 } 27 28 }

3.配置自定義攔截器

建立完相應的攔截器後,我們還需將其配置到Spring中該攔截器才起作用。因為我們的Spring配置類繼承了WebMvcConfigurerAdapter抽象類,而在WebMvcConfigurerAdapter抽象類中就有新增攔截器的方法addInterceptors()。我們可以重寫此方法,通過該方法我們可以新增多個攔截器。

下方截圖中的程式碼段就是在Spring的配置檔案中來配置Interceptor的程式碼段。首先我們建立了一個自定義攔截器Bean,然後將攔截器的Bean通過addInterceptors()方法新增到Spring中即可。如下所示:

  

4、攔截器的測試

建立以及配置好攔截器後,我們就開始測試了。Tomcat重啟後,我們發起網路請求。下方是控制檯打出的log資訊。從輸出結果我們不難看出,只要有網路請求,就會執行攔截器中相應的方法。如下所示:

  

二、將Controller返回的資訊展示到JSP模板(ModelAndView)

本部分是為下一部分做鋪墊的,本部分所做的事情就是將Controller中路由所對映的方法所返回的內容輸出到JSTL模板上。當然主要還是用到了spring框架中的ModelAndView物件。該物件會將返回的資訊與JSTL模板上的引數進行繫結,然後在JPS頁面上進行顯示,當然這與PHP中的Smarty模板引擎的工作方式是極為相似的。下方就使用ModelAndView物件將資訊輸出到JSTL模板上。

1.建立JSTL模板檔案

首先我們建立接納Controller返回資訊的頁面模板,在此我們在src/main/resources目錄的views下面建立一個message.jsp檔案。文字內容比較簡單,只有一個JSTL標籤${message_key}, 該標籤可以接受Controller中相應的方法所返回的資訊。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
</head>
<body>
    <h1>${message_key}</h1>
</body>
</html>

2、給JSTL標籤賦值

接下來所做的就是在相應的Controller相應的方法中給message_key標籤繫結相應的值,並在相應的模板檔案中進行顯示。接下來我們就來建立一個ModelViewController控制器類,來負責值的繫結。下方程式碼段就是我們的ModeViewController的實現內容。

主要還是ModelAndView的使用。首先我們建立了一個ModelAndView的物件,在ModelAndView的構造器中傳入的引數就是JSTL模板所在的JSP頁面的檔名。然後ModelAndView物件通過呼叫addObject()方法對“message_key”進行了“Hello world”的值的繫結,最後將modelAndView物件進行返回。如下所示:

  

3、對頁面的訪問

實現完Controller以及相應的JSP檔案後,接下來我們就該對其進行訪問了。下方是對相應路由的訪問結果,從輸出結果中我們可以看出,${message_key}的值就是相應Controller中所返回的值。

  

三、異常的統一處理

接下來我們就來捕獲丟擲的異常,並將異常資訊通過ModelAndView的物件交付給指定錯誤處理頁面來顯示。要實現該功能,主要用到的註解是@ControllerAdvice和@ExceptionHandel註解。首先我們將建立的Java類ExceptionHandlerAdvice使用註解@ControllerAdvice進行修飾,然後將exception()方法使用@ExceptionHandler進行註解,使其成為處理異常的方法。

在exception()方法中使用ModelAndView物件將錯誤資訊交付給error.jsp進行顯示即可。

  

定義完處理異常的Advice後,接下來就該丟擲個異常來測試一下我們異常處理的方法了。下方的這個AdviceController就是我們測試類,其中丟擲了一個異常。具體程式碼如下所示:

  

下方是我們訪問“/advice”路由所返回的結果,可以看出,丟擲的異常以及在exception()方法中進行處理了。

  

今天的部落格就先到這兒吧、下篇部落格會繼續更新關於SpringMVC的東西。