自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Spring5 里邊的新玩法!這種 URL 請(qǐng)求讓我漲見識(shí)了!

網(wǎng)絡(luò) 通信技術(shù)
AntPathMatcher 是一個(gè)實(shí)現(xiàn)了 Ant 風(fēng)格的路徑匹配器,Ant 風(fēng)格的路徑規(guī)則實(shí)際上就是我們前面給大家介紹的那三種路徑匹配符,很 Easy。

[[385769]]

Spring5 也已經(jīng)出來(lái)好久了,里邊有一些新玩法也需要我們?nèi)ヂ议_面紗,這不,松哥最近在研究 SpringMVC 源碼的時(shí)候,就看到這樣一段代碼:

  1. protected String initLookupPath(HttpServletRequest request) { 
  2.  if (usesPathPatterns()) { 
  3.   request.removeAttribute(UrlPathHelper.PATH_ATTRIBUTE); 
  4.   RequestPath requestPath = ServletRequestPathUtils.getParsedRequestPath(request); 
  5.   String lookupPath = requestPath.pathWithinApplication().value(); 
  6.   return UrlPathHelper.defaultInstance.removeSemicolonContent(lookupPath); 
  7.  } 
  8.  else { 
  9.   return getUrlPathHelper().resolveAndCacheLookupPath(request); 
  10.  } 

這個(gè)方法就是 Spring5 里邊出來(lái)的,以前是沒(méi)有這個(gè)方法的。在舊的 SpringMVC 中,當(dāng)我們需要獲取當(dāng)前請(qǐng)求地址的時(shí)候,直接通過(guò)如下方式獲?。?/p>

  1. String lookupPath = this.getUrlPathHelper().getLookupPathForRequest(request); 

但是現(xiàn)在變了,現(xiàn)在獲取當(dāng)前請(qǐng)求 URL 地址時(shí),方式如下:

  1. String lookupPath = initLookupPath(request); 

兩種方式相比,主要是 initLookupPath 方法中多了 usesPathPatterns 選項(xiàng),這是 Spring5 中的新玩意,所以今天松哥就通過(guò)一篇簡(jiǎn)單的文章來(lái)和大家分享一下 usesPathPatterns 到底是什么,該怎么玩!

這可不是一個(gè)小變化哦!特別是如果你在項(xiàng)目中使用了 WebFlux,那么這個(gè)東西就顯得尤為重要了!

AntPathMatcher

當(dāng)我們使用 @RequestMapping 注解去標(biāo)記請(qǐng)求接口的時(shí)候(或者使用它的類似方法如 @GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping),我們可以使用一些通配符去匹配 URL 地址,舉個(gè)簡(jiǎn)單例子,假設(shè)我有下面五個(gè)接口:

  1. @GetMapping("/hello/**/hello"
  2. public String hello() { 
  3.     return "/hello/**/hello"
  4. @GetMapping("/h?llo"
  5. public String hello2() { 
  6.     return "/h?llo"
  7. @GetMapping("/**/*.html"
  8. public String hello3() { 
  9.     return "/**/*.html"
  10. @GetMapping("/hello/{p1}/{p2}"
  11. public String hello4(@PathVariable String p1, @PathVariable String p2) { 
  12.     System.out.println("p1 = " + p1); 
  13.     System.out.println("p2 = " + p2); 
  14.     return "/hello/{p1}/{p2}"
  15. @GetMapping("/{name:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{ext:\\.[a-z]+}"
  16. public void handle(@PathVariable String name, @PathVariable String version, @PathVariable String ext) { 
  17.     System.out.println("name = " + name); 
  18.     System.out.println("version = " + version); 
  19.     System.out.println("ext = " + ext); 

在解釋接口的含義之前,先來(lái)說(shuō)說(shuō)這幾個(gè)通配符的含義:

通配符 含義
** 匹配0個(gè)或者多個(gè)目錄
* 匹配0個(gè)或者多個(gè)字符
? 匹配任意單個(gè)字符

了解了通配符的含義,我們?cè)賮?lái)說(shuō)說(shuō)各個(gè)接口都能接收哪些請(qǐng)求:

  • 第一個(gè)接口,可以接收諸如 /hello/123/123/hello、/hello/a/hello 以及 /hello/hello 這樣的請(qǐng)求,因?yàn)橹虚g的 ** 代表 0 個(gè)或者多個(gè)目錄。
  • 第二個(gè)接口,可以接收諸如 /hallo、/hello、/hMllo 之類的請(qǐng)求,注意它不能接收 /haallo 或者 /hllo,因?yàn)?? 表示一個(gè)字符。
  • 第三個(gè)接口可以接收任意以 .html 為后綴的請(qǐng)求,例如 /aaa/bb/cc.html、/aa.html 或者 /aa/aa.html。
  • 第四個(gè)接口估計(jì)大家都比較熟悉,在 RESTful 風(fēng)格的接口設(shè)計(jì)中估計(jì)大家都用過(guò),它接收的請(qǐng)求格式類似于 /hello/aa/bb,其中參數(shù) p1 就對(duì)應(yīng) aa,參數(shù) p2 對(duì)應(yīng) bb。
  • 第五個(gè)接口則用到了正則,name、version 以及 ext 三個(gè)參數(shù)格式用正則表達(dá)出來(lái),它可以接收諸如 /spring-web-3.0.5.jar 格式的請(qǐng)求,最終的參數(shù) name 就是spring-web,version 就是 3.0.5,ext 則是 .jar。

這是 SpringMVC 中之前就存在的功能,不管你用沒(méi)用過(guò),反正它一致存在。

那么是誰(shuí)支撐了這個(gè)功能呢?那就是 AntPathMatcher。

AntPathMatcher 是一個(gè)實(shí)現(xiàn)了 Ant 風(fēng)格的路徑匹配器,Ant 風(fēng)格的路徑規(guī)則實(shí)際上就是我們前面給大家介紹的那三種路徑匹配符,很 Easy。這種路徑匹配規(guī)則源自 Apache Ant 項(xiàng)目(https://ant.apache.org),Apache Ant 我們現(xiàn)在其實(shí)已經(jīng)很少會(huì)用到了,它的替代品就是大家所熟知的 Maven,如果你有幸維護(hù)一些 2010 年之前的老項(xiàng)目的話,有可能會(huì)接觸到 Ant。

AntPathMatcher 實(shí)際上在 SpringMVC 中有非常廣泛的應(yīng)用,不僅僅是在 @RequestMapping 中定義接口用到,在其他一些涉及到地址匹配的地方也會(huì)用到,例如我們?cè)?SpringMVC 的配置文件中配置靜態(tài)資源過(guò)濾時(shí),也是 Ant 風(fēng)格路徑匹配:

  1. <mvc:resources mapping="/**" location="/"/> 

另外像攔截器里的攔截路徑注冊(cè)、跨域處理時(shí)的路徑匹配等等,都會(huì)用到 Ant 風(fēng)格的路徑匹配符。

整體上來(lái)說(shuō),AntPathMatcher 是 Spring 中一種比較原始的路徑匹配解決方案,雖然比較簡(jiǎn)單,但是它的效率很低,并且在處理 URL 編碼的時(shí)候也很不方便。

因此,才有了 Spring5 中的 PathPattern。

PathPattern

PathPattern 專為 Web 應(yīng)用設(shè)計(jì),它與之前的 AntPathMatcher 功能大部分比較類似,當(dāng)然也有一些細(xì)微差異,這個(gè)松哥后面會(huì)說(shuō)。

如果是 Servlet 應(yīng)用,目前官方推薦的 URL 匹配解決方案就是 PathPattern(當(dāng)然你也可以選擇較早的 AntPathMatcher),雖然官方推薦的是 PathPattern,但實(shí)際上默認(rèn)使用的依然是 AntPathMatcher;如果你用的是 WebFlux,PathPattern 就是唯一解決方案了。

注意,PathPattern 是一個(gè)非常新鮮的玩藝,目前 Spring 最新版是 5.3.4,在 Spring5.3 之前,我們?cè)?Servlet 應(yīng)用中,也只能選擇 AntPathMatcher,從 Spring5.3 之后,我們才可以使用 PathPattern 了。

PathPattern 會(huì)將 URL 規(guī)則預(yù)解析為 PathContainer,它對(duì) URL 地址匹配的處理更加快速,PathPattern 與 AntPathMatcher 的差異主要體現(xiàn)在兩個(gè)方面:

第一,PathPattern 只支持結(jié)尾部分使用 **,如果在路徑的中間使用 ** 就會(huì)報(bào)錯(cuò),上文中第一個(gè)和第三個(gè)接口,在 PathPattern 模式下會(huì)報(bào)錯(cuò),如下:

 

因?yàn)樵谥虚g或者開始使用 ** 極易造成混亂,因此 PathPattern 只支持在結(jié)尾使用 **。

第二,PathPattern 支持使用諸如 {*path} 的方式進(jìn)行路徑匹配,這種寫法也可以匹配到多層路徑,并且將匹配到的值賦值給 path 變量,例如如下一個(gè)接口:

  1. @GetMapping("/javaboy/{*path}"
  2. public void hello6(@PathVariable String path) { 
  3.     System.out.println("path = " + path); 

如果請(qǐng)求路徑是 http://localhost:8080/javaboy/aa,那么參數(shù) path 的值就是 /aa;

如果請(qǐng)求路徑是 http://localhost:8080/javaboy/aa/bb/cc/dd,那么參數(shù) path 的值就是 /aa/bb/cc/dd;

這個(gè)寫法也比較新穎,因?yàn)橹暗?AntPathMatcher 里邊沒(méi)有這個(gè)。

如何使用

默認(rèn)情況下,SpringMVC 中使用的還是 AntPathMatcher,那么如何開啟 PathPattern 呢?很簡(jiǎn)單,在 SpringBoot 項(xiàng)目中只需要添加如下配置即可:

  1. @Configuration 
  2. public class WebConfig implements WebMvcConfigurer { 
  3.     @Override 
  4.     public void configurePathMatch(PathMatchConfigurer configurer) { 
  5.         configurer.setPatternParser(new PathPatternParser()); 
  6.     } 

添加了這個(gè)配置后,在我們文章一開始貼出來(lái)的代碼里,就會(huì)進(jìn)入到 if 分支中,進(jìn)而使用 PathPattern 去解析請(qǐng)求 URL。

 

小結(jié)

好啦,今天就和小伙伴們聊這么多,大家可以體驗(yàn)一把這個(gè)東東,不過(guò)注意選擇 Spring 的版本哦,一定選擇 5.3 之上的版本~大家周末愉快哦~

本文轉(zhuǎn)載自微信公眾號(hào)「江南一點(diǎn)雨」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系江南一點(diǎn)雨公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: 江南一點(diǎn)雨
相關(guān)推薦

2020-08-20 07:38:51

Java字符串整形

2021-04-16 10:45:02

SQLJava函數(shù)

2020-06-07 16:07:57

Python開發(fā)工具

2019-08-23 09:20:35

Spring 5編程Java

2018-03-01 07:11:16

2021-12-21 18:14:59

戴爾

2024-07-26 10:47:10

2021-06-23 15:03:55

Spring5PathPatternAntPathMatc

2021-12-10 08:17:48

字符串拼接場(chǎng)景

2024-05-17 09:37:26

format屬性Spring

2017-07-12 09:46:00

5G社會(huì)網(wǎng)絡(luò)

2022-02-17 11:29:17

數(shù)據(jù)治理項(xiàng)目數(shù)據(jù)使用

2011-06-27 08:35:28

2024-05-27 08:39:17

Vue3變量響應(yīng)式

2021-01-21 14:50:01

微信紅包移動(dòng)應(yīng)用

2022-07-07 14:18:43

SpringWeb應(yīng)用設(shè)計(jì)

2021-07-24 13:16:31

Android 代碼操作系統(tǒng)

2015-08-25 10:56:21

大數(shù)據(jù)

2018-01-03 15:35:13

人工智能區(qū)塊鏈虛擬偶像

2021-09-01 11:45:10

Spring循環(huán)依賴面試
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)