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

上篇博客咱們聊了《JavaEE開發之SpringMVC中的路由配置及參數傳遞詳解》,本篇博客咱們就聊一下自定義攔截器的實現、以及使用ModelAndView對象將Controller的值加載到JSTL上、最後再聊一下異常的捕獲處理。這些在平常開發中都是常常使用的東西。具體請看下方內容。html

 

1、自定義攔截器java

顧名思義,攔截器是負責攔截某些東西的工具。本部分咱們建立的攔截器是負責攔截請求的。這個攔截器相似於高速收費站,只要是想上高速的,都得通過我這個攔截器才能夠。也就是說,接下來咱們所建立的攔截器就相似於收費站的做用、全部的用戶請求都會通過咱們這個攔截器。廢話少說,接下來咱們就來建立一個攔截器,並部署到咱們的Spring中。git

 

一、自定義攔截器的建立github

接下來咱們就要建立自定義攔截器了,首先咱們建立一個Java類,命名爲CustomInterceptor。由於咱們要建立的是Spring中的攔截器,因此要繼承與springframework中的HandlerInterceptorAdapter抽象類。建立CustomInterceptor類的過程以下spring

  

 

HandlerInterceptorAdapter是Spring框架中自定義攔截器的適配器,咱們能夠看一下HandlerInterceptorAdapter抽象類的具體實現,下方是咱們關聯的Spring框架的源代碼中的HandlerInterceptorAdapter抽象類的實現。網絡

從下方源代碼中咱們不難看出HandlerInterceptorAdapter抽象類實現了AsyncHandlerInterceptor接口,在HandlerInterceptorAdapter的每一個方法中並無具體實現什麼東西,因此咱們繼承HandlerInterceptorAdapter後,要對相應的方法進行實現。這些方法會在攔截用戶請求的特定階段去執行,下方會具體介紹到。框架

  

 

 

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

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

 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中便可。以下所示:

  

 

 

四、攔截器的測試

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

  

 

 

2、將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>

 

 

二、給JSTL標籤賦值

接下來所作的就是在相應的Controller相應的方法中給message_key標籤綁定相應的值,並在相應的模板文件中進行顯示。接下來咱們就來建立一個ModelViewController控制器類,來負責值的綁定。下方代碼段就是咱們的ModeViewController的實現內容。

主要仍是ModelAndView的使用。首先咱們建立了一個ModelAndView的對象,在ModelAndView的構造器中傳入的參數就是JSTL模板所在的JSP頁面的文件名。而後ModelAndView對象經過調用addObject()方法對「message_key」進行了「Hello world」的值的綁定,最後將modelAndView對象進行返回。以下所示:

  

 

 

三、對頁面的訪問

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

  

 

 

 

3、異常的統一處理

接下來咱們就來捕獲拋出的異常,並將異常信息經過ModelAndView的對象交付給指定錯誤處理頁面來顯示。要實現該功能,主要用到的註解是@ControllerAdvice和@ExceptionHandel註解。首先咱們將建立的Java類ExceptionHandlerAdvice使用註解@ControllerAdvice進行修飾,而後將exception()方法使用@ExceptionHandler進行註解,使其成爲處理異常的方法。

在exception()方法中使用ModelAndView對象將錯誤信息交付給error.jsp進行顯示便可。

  

 

定義完處理異常的Advice後,接下來就該拋出個異常來測試一下咱們異常處理的方法了。下方的這個AdviceController就是咱們測試類,其中拋出了一個異常。具體代碼以下所示:

  

 

下方是咱們訪問「/advice」路由所返回的結果,能夠看出,拋出的異常以及在exception()方法中進行處理了。

  

 

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

github代碼分享地址:https://github.com/lizelu/SpringMVCWithMaven

相關文章
相關標籤/搜索