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

SpringMVC中DispatcherServlet的HandlerMapping詳解

 更新時間:2023年10月12日 08:51:10   作者:Evan_L  
這篇文章主要介紹了SpringMVC中DispatcherServlet的HandlerMapping詳解,上回說的Handler,我們說是處理特定請求的,也就是說,不是所有的請求都能處理,那么問題來了,我們怎知道哪個請求是由哪個Handler處理的呢,需要的朋友可以參考下

HandlerMapping

上回說的Handler,我們說是處理特定請求的。也就是說,不是所有的請求都能處理。那么問題來了,我們怎知道哪個請求是由哪個Handler處理的呢?

噔噔當,有請HandlerMapping閃亮登場。HandlerMapping就是處理uri到handler的映射的。從這個角度看他與Map有幾分相似,都是key-value。

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

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

先看看定義:

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

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

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

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

在這里插入圖片描述

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

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

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

并注冊到 org.springframework.web.reactive.handler.AbstractUrlHandlerMapping#handlerMap 。

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

BeanNameUrlHandlerMapping

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

在這里插入圖片描述

與SimpleUrlHandlerMapping類似,他也是基于ApplicationContextAware接口進行擴展而來的能力。

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

封裝HandlerExecutionChain

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

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;
	}

代碼也比較簡單。這里面還讓我們多認識了MappedInterceptor,他可以針對特定的請求進行攔截。

總結(jié)

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

Handler注冊中心則有兩種。

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

但都是簡單Map就能搞定。

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

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

相關(guān)文章

  • JHipster如何修改JDL中的entity

    JHipster如何修改JDL中的entity

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

    詳解java中BigDecimal精度問題

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

    JAVA實現(xiàn)長連接(含心跳檢測Demo)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評論

随州市| 海安县| 黑山县| 青神县| 曲靖市| 荃湾区| 长春市| 佳木斯市| 瑞丽市| 平江县| 长寿区| 杭州市| 武清区| 永济市| 西昌市| 濮阳县| 鹰潭市| 灵台县| 贵定县| 三河市| 扶风县| 兴文县| 松桃| 霍城县| 石嘴山市| 波密县| 汾西县| 曲阜市| 遂川县| 镇远县| 汉中市| 巴林右旗| 乐平市| 浏阳市| 安吉县| 遂川县| 镇平县| 台中县| 闵行区| 德安县| 榆树市|