最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC中DispatcherServlet的HandlerMapping詳解

 更新時(shí)間:2023年10月12日 08:51:10   作者:Evan_L  
這篇文章主要介紹了SpringMVC中DispatcherServlet的HandlerMapping詳解,上回說的Handler,我們說是處理特定請(qǐng)求的,也就是說,不是所有的請(qǐng)求都能處理,那么問題來了,我們?cè)踔滥膫€(gè)請(qǐng)求是由哪個(gè)Handler處理的呢,需要的朋友可以參考下

HandlerMapping

上回說的Handler,我們說是處理特定請(qǐng)求的。也就是說,不是所有的請(qǐng)求都能處理。那么問題來了,我們?cè)踔滥膫€(gè)請(qǐng)求是由哪個(gè)Handler處理的呢?

噔噔當(dāng),有請(qǐng)HandlerMapping閃亮登場(chǎng)。HandlerMapping就是處理uri到handler的映射的。從這個(gè)角度看他與Map有幾分相似,都是key-value。

然鵝,并不一樣!Spring的命名,你不得不服,就這點(diǎn)也給你整的明明白白。他是Handler+Mapping。

是映射Handler沒錯(cuò),但不是Map。我們的Handler可以處理特定的請(qǐng)求沒錯(cuò),但沒說只能處理一個(gè)特定請(qǐng)求啊。也可能是一個(gè)類似的patern的一系列路徑。

先看看定義:

public interface HandlerMapping {
	/**
	 * 獲取Handler
	 */
	@Nullable
	HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}
public interface MatchableHandlerMapping extends HandlerMapping {
	/**
	 * 匹配請(qǐng)求路徑
	 */
	@Nullable
	RequestMatchResult match(HttpServletRequest request, String pattern);
}

我們可以發(fā)現(xiàn),他有兩個(gè)接口,其中MatchableHandlerMapping是HandlerMapping的派生接口。多了請(qǐng)求匹配接口方法。

這里介紹以下他的三個(gè)重要實(shí)現(xiàn):

實(shí)現(xiàn)介紹
SimpleUrlHandlerMapping用于簡(jiǎn)單映射URL到Handler。主要提供給客戶定制使用的,因此不會(huì)自動(dòng)配置
BeanNameUrlHandlerMapping如果Handler的beanName帶“/”的,就是由他來進(jìn)行映射的。他會(huì)自動(dòng)掃描容器中的beanName來識(shí)別handler,自動(dòng)建立映射關(guān)系。在沒有配置HandlerMapping的情況下,會(huì)自動(dòng)配置。
RequestMappingHandlerMapping看名字就知道,他是為了@RequestMapping進(jìn)行映射的。在沒有配置HandlerMapping的情況下,會(huì)自動(dòng)配置

在這里插入圖片描述

PS:社區(qū)版只能這樣看class diagrams了,勉強(qiáng)看吧。旗艦版的氪金大佬可以右鍵看氪金版的。 言歸正傳,SimpleUrlHandlerMapping特別簡(jiǎn)單,只要告訴他哪個(gè)請(qǐng)求由哪個(gè)handler處理就行??梢哉{(diào)用他的setMapping(Properties mapping)方法,或者是setUrlMap。前者會(huì)被轉(zhuǎn)成Map給屬性u(píng)rlMap賦值,而后者則是直接對(duì)urlMap賦值。

從繼承關(guān)系看,他繼承于AbstractUrlHandlerMapping。 AbstractUrlHandlerMapping實(shí)現(xiàn)了一系列基于url實(shí)現(xiàn)的HandlerMapping通用功能。

主要體現(xiàn)在,他通過ApplicationContextAware接口獲取到ApplicationContext,并且在該方法中獲取handler的beanName并轉(zhuǎn)換為實(shí)際handler對(duì)象。

并注冊(cè)到 org.springframework.web.reactive.handler.AbstractUrlHandlerMapping#handlerMap 。

得,到這里,應(yīng)該知道,我們是在什么時(shí)候建立起URL跟Handler的關(guān)系了吧。

BeanNameUrlHandlerMapping

相較于SimpleUrlHandlerMapping,BeanNameUrlHandlerMapping則完全不需要用戶自己定義url到handler的關(guān)系。,而是自動(dòng)檢測(cè)發(fā)現(xiàn)。前提是,你的handler在定義的時(shí)候beanName以“/”開頭。而關(guān)于他的秘密也同樣在他的繼承關(guān)系圖里:

在這里插入圖片描述

與SimpleUrlHandlerMapping類似,他也是基于ApplicationContextAware接口進(jìn)行擴(kuò)展而來的能力。

在獲得上下文后,通過上下文遍歷所有的beanName,就能知道這個(gè)bean是不是一個(gè)handler了。

封裝HandlerExecutionChain

此時(shí),必須提醒一下大家,HandlerMapping接口的返回值是HandlerExecutionChain,并不是Handler。前面不管是說哪個(gè)HandlerMapping,都只是在說怎么尋找Handler、以及怎么注冊(cè)。可沒有說HandlerExecutionChain。其實(shí),這得益于他們公共的父類方法 org.springframework.web.servlet.handler.AbstractHandlerMapping#getHandler 。這也意味著,封裝HandlerExecutionChain是在每個(gè)請(qǐng)求進(jìn)來的時(shí)候才封裝的。具體代碼:

protected HandlerExecutionChain getHandlerExecutionChain(Object handler, HttpServletRequest request) {
		HandlerExecutionChain chain = (handler instanceof HandlerExecutionChain ?
				(HandlerExecutionChain) handler : new HandlerExecutionChain(handler));
		for (HandlerInterceptor interceptor : this.adaptedInterceptors) {
			if (interceptor instanceof MappedInterceptor) {
				MappedInterceptor mappedInterceptor = (MappedInterceptor) interceptor;
				if (mappedInterceptor.matches(request)) {
					chain.addInterceptor(mappedInterceptor.getInterceptor());
				}
			}
			else {
				chain.addInterceptor(interceptor);
			}
		}
		return chain;
	}

代碼也比較簡(jiǎn)單。這里面還讓我們多認(rèn)識(shí)了MappedInterceptor,他可以針對(duì)特定的請(qǐng)求進(jìn)行攔截。

總結(jié)

上面講的兩款都是基于AbstractUrlHandlerMapping擴(kuò)展出來的HandlerMapping。而AbstractUrlHandlerMapping處理的都是基于URL來處理的,意味著不會(huì)有其他的可以匹配的條件。

Handler注冊(cè)中心則有兩種。

Handler注冊(cè)方式Handler注冊(cè)中心
基于URL 注冊(cè)Map<String, Object> handlerMap = new LinkedHashMap<>();
基于pattern注冊(cè)的Map<PathPattern, Object> pathPatternHandlerMap = new LinkedHashMap<>();

但都是簡(jiǎn)單Map就能搞定。

  • HandlerMapping的作用是尋找匹配的Handler,與Handler的類型無關(guān),不存在一一對(duì)應(yīng)關(guān)系。
  • 封裝HandlerExecutionChain是在獲取Handler時(shí),在公共父類AbstractHandlerMapping里實(shí)現(xiàn)的。

到此這篇關(guān)于SpringMVC中DispatcherServlet的HandlerMapping詳解的文章就介紹到這了,更多相關(guān)HandlerMapping詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JHipster如何修改JDL中的entity

    JHipster如何修改JDL中的entity

    這篇文章主要介紹了JHipster如何修改JDL中的entity問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 詳解java中BigDecimal精度問題

    詳解java中BigDecimal精度問題

    這篇文章主要介紹了java BigDecimal精度問題,對(duì)精確計(jì)算感興趣的同學(xué),可以參考下
    2021-05-05
  • JAVA實(shí)現(xiàn)長(zhǎng)連接(含心跳檢測(cè)Demo)

    JAVA實(shí)現(xiàn)長(zhǎng)連接(含心跳檢測(cè)Demo)

    這篇文章主要介紹了JAVA實(shí)現(xiàn)長(zhǎng)連接(含心跳檢測(cè)Demo),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Java下界通配符(? super Type)的使用

    Java下界通配符(? super Type)的使用

    在Java中,? super Type是一個(gè)下界通配符,本文主要介紹了Java下界通配符(? super Type)的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • 使用Java?Socket實(shí)現(xiàn)GPS定位數(shù)據(jù)處理

    使用Java?Socket實(shí)現(xiàn)GPS定位數(shù)據(jù)處理

    在許多應(yīng)用場(chǎng)景中,如車輛追蹤、移動(dòng)設(shè)備定位等,GPS定位數(shù)據(jù)的實(shí)時(shí)獲取和處理至關(guān)重要,本文將介紹如何使用Java?Socket編程來接收GPS設(shè)備發(fā)送的數(shù)據(jù)并進(jìn)行處理,需要的朋友可以參考下
    2024-07-07
  • SpringBoot webSocket實(shí)現(xiàn)發(fā)送廣播、點(diǎn)對(duì)點(diǎn)消息和Android接收

    SpringBoot webSocket實(shí)現(xiàn)發(fā)送廣播、點(diǎn)對(duì)點(diǎn)消息和Android接收

    這篇文章主要介紹了SpringBoot webSocket實(shí)現(xiàn)發(fā)送廣播、點(diǎn)對(duì)點(diǎn)消息和Android接收,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • hystrix服務(wù)降級(jí)方法使用介紹

    hystrix服務(wù)降級(jí)方法使用介紹

    什么是服務(wù)降級(jí)?當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)實(shí)際業(yè)務(wù)情況及流量,對(duì)一些服務(wù)和頁面有策略的不處理或換種簡(jiǎn)單的方式處理,從而釋放服務(wù)器資源以保證核心交易正常運(yùn)作或高效運(yùn)作
    2022-09-09
  • 利用IDEA社區(qū)版創(chuàng)建SpringBoot項(xiàng)目的詳細(xì)圖文教程

    利用IDEA社區(qū)版創(chuàng)建SpringBoot項(xiàng)目的詳細(xì)圖文教程

    大家應(yīng)該都知道Idea社區(qū)版本,默認(rèn)是不能創(chuàng)建SpringBoot項(xiàng)目的,下面這篇文章主要給大家介紹了關(guān)于利用IDEA社區(qū)版創(chuàng)建SpringBoot項(xiàng)目的詳細(xì)圖文教程,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • Java生產(chǎn)1-100的隨機(jī)數(shù)簡(jiǎn)單實(shí)例(分享)

    Java生產(chǎn)1-100的隨機(jī)數(shù)簡(jiǎn)單實(shí)例(分享)

    下面小編就為大家?guī)硪黄狫ava生產(chǎn)1-100的隨機(jī)數(shù)簡(jiǎn)單實(shí)例(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • Javaweb實(shí)戰(zhàn)之實(shí)現(xiàn)蛋糕訂購系統(tǒng)

    Javaweb實(shí)戰(zhàn)之實(shí)現(xiàn)蛋糕訂購系統(tǒng)

    隨著網(wǎng)絡(luò)的普及與發(fā)展,網(wǎng)上購物逐漸成為一種主流消費(fèi)的方式。這篇文章主要介紹了通過JavaWeb制作一個(gè)線上蛋糕訂購系統(tǒng),文中示例代碼講解詳細(xì),需要的朋友可以參考一下
    2021-12-12

最新評(píng)論

洪洞县| 大新县| 永顺县| 凤山市| 萝北县| 婺源县| 汉川市| 三穗县| 榆中县| 东乡族自治县| 西华县| 宿松县| 舞钢市| 石台县| 仙游县| 泸定县| 辽阳市| 枣强县| 东城区| 赫章县| 微山县| 盈江县| 古丈县| 屏东县| 延寿县| 铜梁县| 罗源县| 犍为县| 尼勒克县| 正镶白旗| 琼结县| 辛集市| 恩平市| 富民县| 文安县| 永吉县| 绥芬河市| 昭觉县| 治多县| 晋城| 保康县|