国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

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

CKJOKER / 3086人閱讀

摘要:總結(jié)本章主要分析了接口抽象類(lèi)以及對(duì)自定義的幾個(gè)重要屬性進(jìn)行了測(cè)試,希望對(duì)大家有幫助,謝謝。

概述

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

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

接收并處理用戶請(qǐng)求

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

返回ModelAndView

基于Controller開(kāi)發(fā)請(qǐng)求處理Handler的特點(diǎn):

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

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

請(qǐng)求處理Handler與Spring深度耦合

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

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

接口Controller

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

package org.springframework.web.servlet.mvc;

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

}
Spring提供的實(shí)現(xiàn)類(lèi)

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

AbstractController 控制瀏覽器緩存、支持的請(qǐng)求方法等等

ServletForwardingController 將Spring Handler接收的請(qǐng)求轉(zhuǎn)發(fā)給一個(gè)Servlet去執(zhí)行

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

AbstractUrlViewController 根據(jù)請(qǐng)求URL路徑直接轉(zhuǎn)化為邏輯視圖名的支持基類(lèi)

UrlFilenameViewController 將請(qǐng)求URL路徑轉(zhuǎn)換為邏輯視圖名并返回的實(shí)現(xiàn)類(lèi)

ServletWrappingController Servlet包裝控制器

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

AbstractController

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

WebContentGenerator類(lèi)的主要屬性如下:

/** 支持的請(qǐng)求方法類(lèi)型,默認(rèn)支持:GET、HEAD、POST */
@Nullable
private Set supportedMethods;

@Nullable
private String allowHeader;
/** 當(dāng)前請(qǐng)求是否必須有session */
private boolean requireSession = false;

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

@Nullable
private String[] varyByRequestHeaders;

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

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

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

AbstractController類(lèi)源碼如下:

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

/**
 *實(shí)現(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;
    }

    // 檢查是否支持請(qǐng)求方法以及必須的session
    checkRequest(request);
    // 根據(jù)設(shè)置準(zhǔn)備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);
}

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

本章實(shí)戰(zhàn)是通過(guò)繼承AbstractController類(lèi)編寫(xiě)用戶請(qǐng)求handler,測(cè)試如下幾點(diǎn):

繼承AbstractController抽象類(lèi),實(shí)現(xiàn)handlerRequestInternal方法處理用戶請(qǐng)求

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

自定義Controller源碼:

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

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

}

配置文件配置如下:









驗(yàn)證結(jié)果

代碼編寫(xiě)完后,啟動(dòng)應(yīng)用進(jìn)行測(cè)試,AbstractController默認(rèn)支持GET、HEAD、POST方法類(lèi)型,我們使用Postman進(jìn)行測(cè)試,GET請(qǐng)求結(jié)果如下:

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

指定請(qǐng)求方法類(lèi)型

AbstractController默認(rèn)支持GET、HEAD、POST三種請(qǐng)求類(lèi)型,本例通過(guò)設(shè)置supportedMethods屬性來(lái)設(shè)置支持的請(qǐng)求方法類(lèi)型,代碼如下:

配置文件配置如下:



    
    
        
            PUT
            POST
        
    

驗(yàn)證結(jié)果

只需在Controller Bean修改supportMethods屬性接口,測(cè)試PUT請(qǐng)求,結(jié)果如下:

requireSession前置檢查

當(dāng)把requireSession屬性設(shè)置為true時(shí),訪問(wèn)Controller需檢查有無(wú)session,如果沒(méi)有將跑出HttpSessionRequiredException異常,代碼如下:

配置文件配置如下:



    
    
        
            GET
            POST
        
    
    
    



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

request.getSession(true);

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

首先驗(yàn)證沒(méi)有session情況下,結(jié)果如下:

說(shuō)明在訪問(wèn)到自定義Controller前檢查session沒(méi)有,拋出HttpSessionRequiredException異常

我們?cè)黾恿艘粋€(gè)新的controller用于設(shè)置創(chuàng)建session,此時(shí)我們?cè)L問(wèn)一次后,再訪問(wèn)需要驗(yàn)證的session的請(qǐng)求,結(jié)果如下:

通過(guò)結(jié)果可見(jiàn),測(cè)試能正常訪問(wèn)了。

總結(jié)

本章主要分析了Controller接口、AbstractController抽象類(lèi)以及對(duì)自定義Controller的幾個(gè)重要屬性進(jìn)行了測(cè)試,希望對(duì)大家有幫助,謝謝。

最后創(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://m.specialneedsforspecialkids.com/yun/69567.html

相關(guān)文章

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

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

    KevinYan 評(píng)論0 收藏0
  • SpringMVC源碼分析--HandlerMapping(

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

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

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

    OldPanda 評(píng)論0 收藏0
  • SpringMVC源碼分析--LocaleResolver(

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

    HtmlCssJs 評(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

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

0條評(píng)論

CKJOKER

|高級(jí)講師

TA的文章

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