摘要:概述回顧上兩章,我們主要分析了的概念作業以及如何使用的組件,本節以及后續幾章,將介紹為我們提供的的具體實現類,基于源碼和設計層面進行介紹,歡迎大家關注。本系列文章是基于。
概述
回顧上兩章,我們主要分析了HandlerAdapter的概念、作業以及Spring MVC如何使用的HandlerAdapter組件,本節以及后續幾章,將介紹Spring為我們提供的HandlerAdapter的具體實現類,基于源碼和設計層面進行介紹,歡迎大家關注。
本系列文章是基于Spring5.0.5RELEASE。
SimpleServletHandlerAdapterSimpleServletHandlerAdapter適配器是Spring MVC提供的實現HandlerAdapter接口的最簡單的一個,其功能就是對javax.servlet.Servlet進行適配,從其源碼可知,在support方法中,判斷我們的類是否是Servlet,也即是否繼承Servlet類為條件來進行適配的,并且在handle方法中調用的service方法,源碼如下:
public class SimpleServletHandlerAdapter implements HandlerAdapter { /** * 實現handler的匹配策略,此處以handler是否是Servlet子類進行的判斷 * 也就是說,判斷我們的handler是否實現javax.servlet.Servlet接口或者繼承其子類 */ @Override public boolean supports(Object handler) { return (handler instanceof Servlet); } /** * 請求處理方法,此處調用的是handler的service方法 * 如果我們定義的handler直接實現了Servlet,那么需要實現其service方法 * 但一般我們在進行Servlet編程時,并不直接實現此接口,而是繼承HttpServlet抽象類, * 該抽象類實現了Servlet接口的service方法,我們的handler只需要根據需求,重寫doGet、doPost等方法即可 */ @Override @Nullable public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 調用handler的service方法 ((Servlet) handler).service(request, response); return null; } @Override public long getLastModified(HttpServletRequest request, Object handler) { return -1; } }
以上就是SimpleSerlvetHandlerAdapter的源碼,這是Spring使用HandlerAdapter最簡單的方式,此方式是為了在Spring中支持Servlet方式開發,即把Servlet適配為處理器handler。
實戰好幾篇文章沒有寫這部分了,其實每一篇文章我都有寫過測試demo,但是由于篇幅問題,沒有發布出去,本章內容較少,所以跟大家分享下如何驗證以及驗證的方法。
項目結構
在開發IDE中創建webapp項目,我使用的IDEA,用maven進行構建,最終的項目結構如下:
-- java目錄是我們存放源代碼的目錄
-- resources是存放配置文件的目錄,如spring-servlet.xml是Spring MVC的配置文件
-- webapp是存放靜態資源以及view視圖目錄,其中/WEB-INF/web.xml是部署描述文件,在其內部配置Spring MVC的DispatcherServlet
項目源碼
pom文件
由于我們使用maven進行構建,在其pom文件中加入項目依賴,就本項目我們需要添加Spring MVC的依賴,最終源碼如下:
4.0.0 com.github.dalianghe spring-mvc-handleradapter 1.0-SNAPSHOT war spring-mvc-handleradapter Maven Webapp http://www.example.com UTF-8 1.8 1.8 org.springframework spring-webmvc 5.0.5.RELEASE javax.servlet javax.servlet-api 3.1.0 provided spring-mvc-handlermapping org.apache.tomcat.maven tomcat7-maven-plugin 2.2 / 8086
Spring MVC配置文件
目前我們是用的傳統的基于xml配置的方式進行編程的,故需要創建一個Spring MVC的配置文件,用于初始化Spring MVC上下文以及配置策略,源碼如下:
servletController
本例我們使用的SimpleUrlHandlerMapping注冊我們的handler的,也可以使用其他HandlerMapping進行注冊。
部署描述文件
在web.xml中配置Spring MVC的DispatcherServlet,代碼如下:
Archetype Created Web Application dispatcher org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:spring-servlet.xml 1 true dispatcher /
編寫Handler
最后我們編寫自己的Handler,根據SimpleServletHandlerAdatper要求,我們的Handler必須實現javax.servlet.Servlet接口,代碼如下:
package com.github.dalianghe.controller; import org.springframework.lang.Nullable; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.Writer; /** * 本例我們繼承HttpServlet抽象類,其內部實現了Servlet接口的service方法
*/ public class ServletController extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Writer writer = resp.getWriter(); writer.write("hello SimpleServletHandlerAdapter!"); writer.flush(); } } 至此,我們就編寫完成了我們的代碼,下面進行測試驗證。
測試驗證
我們配置使用了SimpleServletHandlerAdapter適配器,首先驗證Spring MVC是不是使用我們配置的適配器,驗證方法是在DispatcherServlet的initHandlerAdapters方法上打斷點,然后啟動,具體如下:
有圖可知,Spring MVC確實使用的是我們配置的SimpleServletHandlerAdapter,驗證通過。
接下來,我們驗證用戶請求是否使用的SimpleServletHandlerAdapter適配器進行的處理,在DispatcherServlet的doDispatch方法中打斷點以及在我們的handler方法中打斷點,并發起請求http://localhost:8086/servletController,結果如下圖:
由以上可知,Spring MVC使用SimpleServletHandlerAdapter適配器把請求轉發給我了我們的Handler。跳過斷點,瀏覽器也會數據hello SimpleServletHandlerAdapter,如下圖:
以上我們驗證了正確的情況,作為驗證肯定不完善,我們還要驗證錯誤的用例,比如,我們的Handler不繼承HttpServlet,即不實現Servlet接口,按照SimpleServletHandlerAdatper適配策略,應該找不到handler進行處理,我們來驗證這個結果。
首先修改我們的Handler,去掉extends HttpServlet,然后重啟應用再次訪問,結果首先界面會顯示500錯誤,并且后臺也跑異常,如下圖:
至此,我們完成了測試驗證。
總結本章主要分析了SimpleServletHandlerAdapter類源碼以及開發了demo用于驗證測試,驗證測試覆蓋了正常測試和異常測試,在實際的工作中,測試非常重要,不僅要測試正常情況也要對異常情況下進行測試,這樣我們最大程度的確保我們開發的程序健壯。本章分析就這些,謝謝大家!
最后創建了qq群方便大家交流,可掃描加入,同時也可加我qq:276420284,共同學習、共同進步,謝謝!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69536.html
摘要:概述本章我們主要分析處理組件的處理流程以及其接口源碼。概括來說,使用組件分為兩步,首先是注冊組件,其次是處理用戶請求,以下針對這兩個過程進行詳細的分析。本系列文章是基于。接下來的幾章將分析提供的適配策略,希望本節對大家能有幫助,謝謝。 概述 本章我們主要分析Spring處理HandlerAdapter組件的處理流程以及其接口源碼。概括來說,Spring使用HandlerAdapter組...
摘要:本系列文章是基于。說這么多就是想解釋下什么是適配器。本節我們主要從整體以及概念上闡述了的,后續會逐個分析提供的四種適配器,希望本節對大家能有幫助,謝謝。最后創建了群方便大家交流,可掃描加入,同時也可加我,共同學習共同進步,謝謝 概述 本章開始,我們分析Spring MVC的另一個重要組件,即HandlerAdapter,從命名上我即可直觀的理解為處理器適配器,那么處理器適配器是什么意思...
摘要:問題來了,我們到底還在用嗎答案是,不全用。后者是初始化的配置,主要是的配置。啟動類測試啟動項目后,在瀏覽器里面輸入。通過查詢已裝載的,并且支持該而獲取的。按照前面對的描述,對于而言,這個必定是。的核心在的方法中。 之前已經分析過了Spring的IOC(《零基礎帶你看Spring源碼——IOC控制反轉》)與AOP(《從源碼入手,一文帶你讀懂Spring AOP面向切面編程》)的源碼,本次...
摘要:概述本章開始進入另一重要的組件,即視圖組件,處理視圖組件使用兩個主要的接口是和。接口的作用是用于處理視圖進行渲染。延用之前的介紹流程,本章分兩部分進行闡述啟動初始化和請求處理。 概述 本章開始進入另一重要的組件,即視圖組件,Spring MVC處理視圖組件使用兩個主要的接口是ViewResolver和View。根據名稱可知,ViewResolver即視圖解析器,其作用是把邏輯視圖名稱解...
摘要:處理器是繼前端控制器的后端控制器,在的控制下對具體的用戶請求進行處理。由于涉及到具體的用戶業務請求,所以一般情況需要程序員根據業務需求開發。 1、mcv整體架構和流程 showImg(https://segmentfault.com/img/bV55Qq?w=860&h=406); 用戶發送請求至前端控制器 DispatcherServlet DispatcherServlet 收到...
閱讀 3499·2021-11-24 11:17
閱讀 2285·2021-11-15 11:38
閱讀 3371·2021-10-14 09:42
閱讀 2943·2019-08-30 15:54
閱讀 2028·2019-08-28 18:09
閱讀 542·2019-08-26 11:48
閱讀 1635·2019-08-26 10:48
閱讀 2154·2019-08-26 10:45