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

資訊專欄INFORMATION COLUMN

SpringMVC之源碼分析--Controller(一)

CKJOKER / 3091人閱讀

摘要:總結本章主要分析了接口抽象類以及對自定義的幾個重要屬性進行了測試,希望對大家有幫助,謝謝。

概述

Controller是Spring MVC為我們提供的基礎的控制器接口,和HttpServlet一樣,接收request和response參數(shù)處理用戶請求,并返回ModelAndView,從概念上可以類比Struts的Action。

Controller主要實現(xiàn)的如下功能:

接收并處理用戶請求

調(diào)用業(yè)務方法

返回ModelAndView

基于Controller開發(fā)請求處理Handler的特點:

需要實現(xiàn)Controller接口

請求參數(shù)需從請求request中獲取

請求處理Handler與Spring深度耦合

就目前項目開發(fā),幾乎不會使用此方式進行開發(fā),除非維護一些歷史項目。目前是基于注解進行開發(fā),從Spring2.5及之后開始支持。編寫本章內(nèi)容主要是基于知識點的全面性來考慮,大家可以了解了解。

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

接口Controller

Spring提供的Controller接口,定義了一個方法,作用就是處理用戶請求,源碼如下:

package org.springframework.web.servlet.mvc;

public interface Controller {
    
    /**
     *接收request和response參數(shù),處理用戶請求
     *參數(shù)從request中獲取
     *方法返回ModelAndView,Model為模型數(shù)據(jù),View為視圖
     */
    ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;

}
Spring提供的實現(xiàn)類

Spring提供了如下實現(xiàn):

AbstractController 控制瀏覽器緩存、支持的請求方法等等

ServletForwardingController 將Spring Handler接收的請求轉發(fā)給一個Servlet去執(zhí)行

ParameterizableViewController 參數(shù)化視圖控制器,根據(jù)參數(shù)的邏輯視圖名直接選擇需要展示的視圖

AbstractUrlViewController 根據(jù)請求URL路徑直接轉化為邏輯視圖名的支持基類

UrlFilenameViewController 將請求URL路徑轉換為邏輯視圖名并返回的實現(xiàn)類

ServletWrappingController Servlet包裝控制器

以上是Spring MVC為我們提供Controller接口的默認實現(xiàn),下面我們接著分析這些實現(xiàn)類。

AbstractController

該抽象類繼承WebContentGenerator并實現(xiàn)Controller接口,其中WebContentGenerator類用于瀏覽器緩存控制、自定義Controller支持的請求方法類型(默認支持:GET/HEAD/POST)等。

WebContentGenerator類的主要屬性如下:

/** 支持的請求方法類型,默認支持:GET、HEAD、POST */
@Nullable
private Set supportedMethods;

@Nullable
private String allowHeader;
/** 當前請求是否必須有session */
private boolean requireSession = false;

@Nullable
private CacheControl cacheControl;
/** 緩存過期時間,正數(shù)表示需要緩存,負數(shù)表示不做任何事情 */
private int cacheSeconds = -1; 

@Nullable
private String[] varyByRequestHeaders;

/** 是否使用HTTP1.0協(xié)議過期響應頭:如果true則會在響應頭添加“Expires:”;需要配合cacheSeconds使用 */
private boolean useExpiresHeader = false;

/** 是否使用HTTP1.1協(xié)議的緩存控制響應頭,如果true則會在響應頭添加;需要配合cacheSeconds使用 */
private boolean useCacheControlHeader = true;

/** 是否使用HTTP 1.1協(xié)議的緩存控制響應頭,如果true則會在響應頭添加;需要配合cacheSeconds使用 */
private boolean useCacheControlNoStore = true;

AbstractController類源碼如下:

/** 表示該控制器是否在執(zhí)行時同步session,從而保證該會話的用戶串行訪問該控制器 */
private boolean synchronizeOnSession = false;

/**
 *實現(xiàn)Controller接口的handleRequest方法
 */
@Override
@Nullable
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
        throws Exception {

    if (HttpMethod.OPTIONS.matches(request.getMethod())) {
        response.setHeader("Allow", getAllowHeader());
        return null;
    }

    // 檢查是否支持請求方法以及必須的session
    checkRequest(request);
    // 根據(jù)設置準備response
    prepareResponse(response);

    // 如果必要順序執(zhí)行handleRequestInternal方法
    if (this.synchronizeOnSession) {
        HttpSession session = request.getSession(false);
        if (session != null) {
            Object mutex = WebUtils.getSessionMutex(session);
            synchronized (mutex) {
                return handleRequestInternal(request, response);
            }
        }
    }
    
    return handleRequestInternal(request, response);
}

/**
 * 需要子類實現(xiàn)的模板方法
 */
@Nullable
protected abstract ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
        throws Exception;
實戰(zhàn)

本章實戰(zhàn)是通過繼承AbstractController類編寫用戶請求handler,測試如下幾點:

繼承AbstractController抽象類,實現(xiàn)handlerRequestInternal方法處理用戶請求

通過前幾篇及上面的分析,SimpleControllerHandlerAdapter類可以適配實現(xiàn)了Controller接口的類,AbstractController實現(xiàn)了Controller接口的handleRequest方法,并預留了handleRequestInternal模板方法供子類實現(xiàn),用戶處理用戶請求,根據(jù)這個思路,我們要使用SimpleControllerHandlerAdapter適配Controller時,只需繼承AbstractController類并實現(xiàn)handleRequestInternal方法即可,具體源碼如下:

自定義Controller源碼:

/**
 *繼承AbstractController并實現(xiàn)handleRequestInternal方法
 */
public class HelloWorldController extends AbstractController {

    /**
     *通過response直接回寫數(shù)據(jù),也可通過ModelAndView指定邏輯視圖并回寫數(shù)據(jù)
     */
    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
        Writer writer = response.getWriter();
        writer.write("hello AbstractController");
        writer.flush();
        return null;
    }

}

配置文件配置如下:









驗證結果

代碼編寫完后,啟動應用進行測試,AbstractController默認支持GET、HEAD、POST方法類型,我們使用Postman進行測試,GET請求結果如下:

HEAD、POST也能處理,但如果發(fā)起PUT請求則返回不支持方法類型,如下圖:

指定請求方法類型

AbstractController默認支持GET、HEAD、POST三種請求類型,本例通過設置supportedMethods屬性來設置支持的請求方法類型,代碼如下:

配置文件配置如下:



    
    
        
            PUT
            POST
        
    

驗證結果

只需在Controller Bean修改supportMethods屬性接口,測試PUT請求,結果如下:

requireSession前置檢查

當把requireSession屬性設置為true時,訪問Controller需檢查有無session,如果沒有將跑出HttpSessionRequiredException異常,代碼如下:

配置文件配置如下:



    
    
        
            GET
            POST
        
    
    
    



新增的HelloWorld2Controller與HelloWorldController代碼基礎上增加獲取session的代碼,如下:

request.getSession(true);

測試驗證

首先驗證沒有session情況下,結果如下:

說明在訪問到自定義Controller前檢查session沒有,拋出HttpSessionRequiredException異常

我們增加了一個新的controller用于設置創(chuàng)建session,此時我們訪問一次后,再訪問需要驗證的session的請求,結果如下:

通過結果可見,測試能正常訪問了。

總結

本章主要分析了Controller接口、AbstractController抽象類以及對自定義Controller的幾個重要屬性進行了測試,希望對大家有幫助,謝謝。

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

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

轉載請注明本文地址:http://systransis.cn/yun/69567.html

相關文章

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

    摘要:概述上篇文章主要分析了提供的及抽象類,本章繼續(xù)分析其具體的幾個實現(xiàn)類。源碼由繼承關系繼承抽象類,并實現(xiàn)模板方法,完成將接收的請求進行轉發(fā),源碼如下實現(xiàn)父類模板方法獲取部署文件中定義的,傳入?yún)?shù)。 概述 上篇文章主要分析了Spring提供的Controller及抽象類AbstractController,本章繼續(xù)分析其具體的幾個實現(xiàn)類。 本系列文章是基于Spring5.0.5RELEAS...

    KevinYan 評論0 收藏0
  • SpringMVC源碼分析--HandlerMapping(

    摘要:接口接口作用是將請求映射到處理程序,以及預處理和處理后的攔截器列表,映射是基于一些標準的,其中的細節(jié)因不同的實現(xiàn)而不相同。該參數(shù)是類型,作用是檢查所有的映射解析器或使用或為的,默認為,即從上下文中檢查所有的。 概述 在Spring MVC啟動章節(jié)https://segmentfault.com/a/1190000014674239,介紹到了DispatcherServlet的onRef...

    ralap 評論0 收藏0
  • SpringMVC源碼分析--ThemeResolver(三)

    摘要:類繼承關系如下該類實現(xiàn)接口,實現(xiàn)解析設置主題功能繼承類,以具備操作功能。新增并更換一張不同的圖片。配置文件只要替換即可,代碼如下配置默認的主題文件視圖和控制器視圖和控制器代碼與上一章一致,參考上章代碼。 概述 上節(jié)介紹了SessionThemeResolver解析器,本章分析下CookieThemeResolver,兩個解析器實現(xiàn)的功能是一樣的,只是使用的主題載體有區(qū)別而已,Sessi...

    OldPanda 評論0 收藏0
  • SpringMVC源碼分析--LocaleResolver(

    摘要:概述為我們提供國際化支持,通過設置系統(tǒng)的環(huán)境,根據(jù)運行環(huán)境使用不同的語言顯示。提供接口的作用是解析客戶端使用的地區(qū),目的是為了根據(jù)這些信息實現(xiàn)視圖多語言即國際化。接口繼承接口,增加時區(qū)支持。 概述 Spring MVC為我們提供國際化支持,通過設置系統(tǒng)的環(huán)境,根據(jù)運行環(huán)境使用不同的語言顯示。Spring提供LocaleResolver接口的作用是解析客戶端使用的地區(qū)(Locale),目...

    HtmlCssJs 評論0 收藏0
  • SpringMVC源碼分析--HandlerAdapter(

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

    dingda 評論0 收藏0

發(fā)表評論

0條評論

CKJOKER

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<