成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

SpringMVC之源碼分析--HandlerAdapter(三)

Dionysus_go / 2633人閱讀

摘要:概述回顧上兩章,我們主要分析了的概念作業(yè)以及如何使用的組件,本節(jié)以及后續(xù)幾章,將介紹為我們提供的的具體實(shí)現(xiàn)類,基于源碼和設(shè)計(jì)層面進(jìn)行介紹,歡迎大家關(guān)注。本系列文章是基于。

概述

回顧上兩章,我們主要分析了HandlerAdapter的概念、作業(yè)以及Spring MVC如何使用的HandlerAdapter組件,本節(jié)以及后續(xù)幾章,將介紹Spring為我們提供的HandlerAdapter的具體實(shí)現(xiàn)類,基于源碼和設(shè)計(jì)層面進(jìn)行介紹,歡迎大家關(guān)注。

本系列文章是基于Spring5.0.5RELEASE。

SimpleServletHandlerAdapter

SimpleServletHandlerAdapter適配器是Spring MVC提供的實(shí)現(xiàn)HandlerAdapter接口的最簡(jiǎn)單的一個(gè),其功能就是對(duì)javax.servlet.Servlet進(jìn)行適配,從其源碼可知,在support方法中,判斷我們的類是否是Servlet,也即是否繼承Servlet類為條件來(lái)進(jìn)行適配的,并且在handle方法中調(diào)用的service方法,源碼如下:

public class SimpleServletHandlerAdapter implements HandlerAdapter {

    /**
     * 實(shí)現(xiàn)handler的匹配策略,此處以handler是否是Servlet子類進(jìn)行的判斷
     * 也就是說(shuō),判斷我們的handler是否實(shí)現(xiàn)javax.servlet.Servlet接口或者繼承其子類
     */
    @Override
    public boolean supports(Object handler) {
        return (handler instanceof Servlet);
    }
    
    /**
     * 請(qǐng)求處理方法,此處調(diào)用的是handler的service方法
     * 如果我們定義的handler直接實(shí)現(xiàn)了Servlet,那么需要實(shí)現(xiàn)其service方法
     * 但一般我們?cè)谶M(jìn)行Servlet編程時(shí),并不直接實(shí)現(xiàn)此接口,而是繼承HttpServlet抽象類,
     * 該抽象類實(shí)現(xiàn)了Servlet接口的service方法,我們的handler只需要根據(jù)需求,重寫(xiě)doGet、doPost等方法即可
     */
    @Override
    @Nullable
    public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 調(diào)用handler的service方法
        ((Servlet) handler).service(request, response);
        return null;
    }

    
    @Override
    public long getLastModified(HttpServletRequest request, Object handler) {
        return -1;
    }

}

以上就是SimpleSerlvetHandlerAdapter的源碼,這是Spring使用HandlerAdapter最簡(jiǎn)單的方式,此方式是為了在Spring中支持Servlet方式開(kāi)發(fā),即把Servlet適配為處理器handler。

實(shí)戰(zhàn)

好幾篇文章沒(méi)有寫(xiě)這部分了,其實(shí)每一篇文章我都有寫(xiě)過(guò)測(cè)試demo,但是由于篇幅問(wèn)題,沒(méi)有發(fā)布出去,本章內(nèi)容較少,所以跟大家分享下如何驗(yàn)證以及驗(yàn)證的方法。

項(xiàng)目結(jié)構(gòu)

在開(kāi)發(fā)IDE中創(chuàng)建webapp項(xiàng)目,我使用的IDEA,用maven進(jìn)行構(gòu)建,最終的項(xiàng)目結(jié)構(gòu)如下:

-- java目錄是我們存放源代碼的目錄

-- resources是存放配置文件的目錄,如spring-servlet.xml是Spring MVC的配置文件

-- webapp是存放靜態(tài)資源以及view視圖目錄,其中/WEB-INF/web.xml是部署描述文件,在其內(nèi)部配置Spring MVC的DispatcherServlet

項(xiàng)目源碼

pom文件

由于我們使用maven進(jìn)行構(gòu)建,在其pom文件中加入項(xiàng)目依賴,就本項(xiàng)目我們需要添加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配置文件

目前我們是用的傳統(tǒng)的基于xml配置的方式進(jìn)行編程的,故需要?jiǎng)?chuàng)建一個(gè)Spring MVC的配置文件,用于初始化Spring MVC上下文以及配置策略,源碼如下:




    
    
        
            
                servletController
            
        
    
    
    
    
    


本例我們使用的SimpleUrlHandlerMapping注冊(cè)我們的handler的,也可以使用其他HandlerMapping進(jìn)行注冊(cè)。

部署描述文件

在web.xml中配置Spring MVC的DispatcherServlet,代碼如下:



  Archetype Created Web Application

  
    
    dispatcher
    
    org.springframework.web.servlet.DispatcherServlet
    
    
      contextConfigLocation
      classpath:spring-servlet.xml
    
    
    1
    true
  
  
  
    
    dispatcher
    
    /
  


編寫(xiě)Handler

最后我們編寫(xiě)自己的Handler,根據(jù)SimpleServletHandlerAdatper要求,我們的Handler必須實(shí)現(xiàn)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抽象類,其內(nèi)部實(shí)現(xiàn)了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();
            }
            
        }

至此,我們就編寫(xiě)完成了我們的代碼,下面進(jìn)行測(cè)試驗(yàn)證。

測(cè)試驗(yàn)證

我們配置使用了SimpleServletHandlerAdapter適配器,首先驗(yàn)證Spring MVC是不是使用我們配置的適配器,驗(yàn)證方法是在DispatcherServlet的initHandlerAdapters方法上打斷點(diǎn),然后啟動(dòng),具體如下:

有圖可知,Spring MVC確實(shí)使用的是我們配置的SimpleServletHandlerAdapter,驗(yàn)證通過(guò)。

接下來(lái),我們驗(yàn)證用戶請(qǐng)求是否使用的SimpleServletHandlerAdapter適配器進(jìn)行的處理,在DispatcherServlet的doDispatch方法中打斷點(diǎn)以及在我們的handler方法中打斷點(diǎn),并發(fā)起請(qǐng)求http://localhost:8086/servletController,結(jié)果如下圖:

由以上可知,Spring MVC使用SimpleServletHandlerAdapter適配器把請(qǐng)求轉(zhuǎn)發(fā)給我了我們的Handler。跳過(guò)斷點(diǎn),瀏覽器也會(huì)數(shù)據(jù)hello SimpleServletHandlerAdapter,如下圖:

以上我們驗(yàn)證了正確的情況,作為驗(yàn)證肯定不完善,我們還要驗(yàn)證錯(cuò)誤的用例,比如,我們的Handler不繼承HttpServlet,即不實(shí)現(xiàn)Servlet接口,按照SimpleServletHandlerAdatper適配策略,應(yīng)該找不到handler進(jìn)行處理,我們來(lái)驗(yàn)證這個(gè)結(jié)果。

首先修改我們的Handler,去掉extends HttpServlet,然后重啟應(yīng)用再次訪問(wèn),結(jié)果首先界面會(huì)顯示500錯(cuò)誤,并且后臺(tái)也跑異常,如下圖:

至此,我們完成了測(cè)試驗(yàn)證。

總結(jié)

本章主要分析了SimpleServletHandlerAdapter類源碼以及開(kāi)發(fā)了demo用于驗(yàn)證測(cè)試,驗(yàn)證測(cè)試覆蓋了正常測(cè)試和異常測(cè)試,在實(shí)際的工作中,測(cè)試非常重要,不僅要測(cè)試正常情況也要對(duì)異常情況下進(jìn)行測(cè)試,這樣我們最大程度的確保我們開(kāi)發(fā)的程序健壯。本章分析就這些,謝謝大家!

最后創(chuàng)建了qq群方便大家交流,可掃描加入,同時(shí)也可加我qq:276420284,共同學(xué)習(xí)、共同進(jìn)步,謝謝!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69536.html

相關(guān)文章

  • SpringMVC源碼分析--HandlerAdapter(二)

    摘要:概述本章我們主要分析處理組件的處理流程以及其接口源碼。概括來(lái)說(shuō),使用組件分為兩步,首先是注冊(cè)組件,其次是處理用戶請(qǐng)求,以下針對(duì)這兩個(gè)過(guò)程進(jìn)行詳細(xì)的分析。本系列文章是基于。接下來(lái)的幾章將分析提供的適配策略,希望本節(jié)對(duì)大家能有幫助,謝謝。 概述 本章我們主要分析Spring處理HandlerAdapter組件的處理流程以及其接口源碼。概括來(lái)說(shuō),Spring使用HandlerAdapter組...

    Eastboat 評(píng)論0 收藏0
  • SpringMVC源碼分析--HandlerAdapter(一)

    摘要:本系列文章是基于。說(shuō)這么多就是想解釋下什么是適配器。本節(jié)我們主要從整體以及概念上闡述了的,后續(xù)會(huì)逐個(gè)分析提供的四種適配器,希望本節(jié)對(duì)大家能有幫助,謝謝。最后創(chuàng)建了群方便大家交流,可掃描加入,同時(shí)也可加我,共同學(xué)習(xí)共同進(jìn)步,謝謝 概述 本章開(kāi)始,我們分析Spring MVC的另一個(gè)重要組件,即HandlerAdapter,從命名上我即可直觀的理解為處理器適配器,那么處理器適配器是什么意思...

    dingda 評(píng)論0 收藏0
  • “過(guò)時(shí)”的SpringMVC我們到底在用什么?深入分析DispatchServlet源碼

    摘要:?jiǎn)栴}來(lái)了,我們到底還在用嗎答案是,不全用。后者是初始化的配置,主要是的配置。啟動(dòng)類測(cè)試啟動(dòng)項(xiàng)目后,在瀏覽器里面輸入。通過(guò)查詢已裝載的,并且支持該而獲取的。按照前面對(duì)的描述,對(duì)于而言,這個(gè)必定是。的核心在的方法中。 之前已經(jīng)分析過(guò)了Spring的IOC(《零基礎(chǔ)帶你看Spring源碼——IOC控制反轉(zhuǎn)》)與AOP(《從源碼入手,一文帶你讀懂Spring AOP面向切面編程》)的源碼,本次...

    array_huang 評(píng)論0 收藏0
  • SpringMVC源碼分析--ViewResolver(一)

    摘要:概述本章開(kāi)始進(jìn)入另一重要的組件,即視圖組件,處理視圖組件使用兩個(gè)主要的接口是和。接口的作用是用于處理視圖進(jìn)行渲染。延用之前的介紹流程,本章分兩部分進(jìn)行闡述啟動(dòng)初始化和請(qǐng)求處理。 概述 本章開(kāi)始進(jìn)入另一重要的組件,即視圖組件,Spring MVC處理視圖組件使用兩個(gè)主要的接口是ViewResolver和View。根據(jù)名稱可知,ViewResolver即視圖解析器,其作用是把邏輯視圖名稱解...

    pf_miles 評(píng)論0 收藏0
  • spring-MVC源碼解讀(一)

    摘要:處理器是繼前端控制器的后端控制器,在的控制下對(duì)具體的用戶請(qǐng)求進(jìn)行處理。由于涉及到具體的用戶業(yè)務(wù)請(qǐng)求,所以一般情況需要程序員根據(jù)業(yè)務(wù)需求開(kāi)發(fā)。 1、mcv整體架構(gòu)和流程 showImg(https://segmentfault.com/img/bV55Qq?w=860&h=406); 用戶發(fā)送請(qǐng)求至前端控制器 DispatcherServlet DispatcherServlet 收到...

    I_Am 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<