Spring中PathMatcher路徑匹配器的實(shí)現(xiàn)
概述:
PathMatcher是Spring的一個(gè)概念模型接口,該接口抽象建模了概念"路徑匹配器",一個(gè)"路徑匹配器"是一個(gè)用于路徑匹配的工具。位于 Spring-core 包中 util 包下。
PathMatcher 接口源碼
package org.springframework.util;
import java.util.Comparator;
import java.util.Map;
public interface PathMatcher {
/**
* Does the given path represent a pattern that can be matched
* by an implementation of this interface?
* 判斷指定的路徑 path 是否是一個(gè) pattern(模式)
* 如果返回值是 false,也就是說(shuō) path 不是一個(gè)模式,而是一個(gè)靜態(tài)路徑(真正的路徑字符串),
* 那么就不用調(diào)用方法 #match 了,因?yàn)閷?duì)于靜態(tài)路徑的匹配,直接使用字符串等號(hào)比較就足夠了。
* @param path the path String to check
* @return true if the given path represents a pattern
*/
boolean isPattern(String path);
/**
* Match the given path against the given pattern,
* according to this PathMatcher's matching strategy.
* 根據(jù)當(dāng)前 PathMatcher 的匹配策略,檢查指定的徑 path 和指定的模式 pattern 是否匹配
* @param 用于檢測(cè)路徑字符串是否匹配于某個(gè)模式時(shí)所用的模式
* @param path 需要被檢測(cè)的路徑字符串
* @return true 表示匹配, false 表示不匹配
*/
boolean match(String pattern, String path);
/**
* Match the given path against the corresponding part of the given
* pattern, according to this PathMatcher's matching strategy.
* 根據(jù)當(dāng)前 PathMatcher 的匹配策略,檢查指定的徑 path 和指定的模式 pattern 是否之間
* 是否為前綴匹配
* @param pattern the pattern to match against
* @param path the path String to test
* @return true 表示匹配, false 表示不匹配
*/
boolean matchStart(String pattern, String path);
/**
* Given a pattern and a full path, determine the pattern-mapped part.
* 給定一個(gè)模式 pattern 和一個(gè)全路徑 path,判斷路徑中和模式匹配的部分。
*
* This method is supposed to find out which part of the path is matched
* dynamically through an actual pattern, that is, it strips off a statically
* defined leading path from the given full path, returning only the actually
* pattern-matched part of the path.
* 該方法用于發(fā)現(xiàn)路徑中的哪一部分是和模式能動(dòng)態(tài)匹配上的部分。它會(huì)去除路徑中開(kāi)頭靜態(tài)部分,
* 僅僅返回那部分真正和模式匹配的上的部分。
* 例子 : "myroot/*.html" 為 pattern , "myroot/myfile.html" 為路徑,
* 則該方法返回 "myfile.html".
* 具體的檢測(cè)規(guī)則根據(jù)當(dāng)前 PathMatcher 的匹配策略來(lái)頂。
* A simple implementation may return the given full path as-is in case
* of an actual pattern, and the empty String in case of the pattern not
* containing any dynamic parts (i.e. the pattern parameter being
* a static path that wouldn't qualify as an actual #isPattern pattern.
* A sophisticated implementation will differentiate between the static parts
* and the dynamic parts of the given path pattern.
* @param pattern the path pattern
* @param path the full path to introspect
* @return the pattern-mapped part of the given path
* (never null)
*/
String extractPathWithinPattern(String pattern, String path);
/**
* Given a pattern and a full path, extract the URI template variables. URI template
* variables are expressed through curly brackets ('{' and '}').
* 給定一個(gè)模式和一個(gè)路徑,提取其中的 URI 模板變量信息。URI模板變量表達(dá)式格式為 "{variable}"
*
* 例子 : pattern 為 "/hotels/{hotel}" ,路徑為 "/hotels/1", 則該方法會(huì)返回一個(gè) map ,
* 內(nèi)容為 : "hotel"->"1".
* @param pattern the path pattern, possibly containing URI templates
* @param path the full path to extract template variables from
* @return a map, containing variable names as keys; variables values as values
*/
Map<String, String> extractUriTemplateVariables(String pattern, String path);
/**
* Given a full path, returns a Comparator suitable for sorting patterns
* in order of explicitness for that path.
* The full algorithm used depends on the underlying implementation,
* but generally, the returned Comparator will sort a list so that more
* specific patterns come before generic patterns.
* @param path the full path to use for comparison
* @return a comparator capable of sorting patterns in order of explicitness
*/
Comparator<String> getPatternComparator(String path);
/**
* Combines two patterns into a new pattern that is returned.
* The full algorithm used for combining the two pattern depends on the underlying implementation.
* 合并兩個(gè)模式。具體合并的算法由實(shí)現(xiàn)類決定。
* @param pattern1 the first pattern
* @param pattern2 the second pattern
* @return the combination of the two patterns
* @throws IllegalArgumentException when the two patterns cannot be combined
*/
String combine(String pattern1, String pattern2);
}
AntPathMatcher:
Spring框架自身對(duì)概念模型接口也提供了一個(gè)缺省的實(shí)現(xiàn)AntPathMatcher,用于匹配Ant風(fēng)格的路徑。我們平時(shí)使用的路徑匹配基本用的都是這個(gè)。
1.通配符:
? 表示匹配任意一個(gè)字符
System.out.println( matcher.match("/usr/name?", "/usr/name1") ); //true
System.out.println( matcher.match("/usr/name?", "/usr/name111") ); //false
* 表示匹配單個(gè)路徑
System.out.println( matcher.match("/usr/*", "/usr/list")); //true
System.out.println( matcher.match("/usr/*", "/usr/list/again")); //false
System.out.println( matcher.match("/usr/*.app", "/usr/list.app")); //true
System.out.println( matcher.match("/usr/*.app", "/usr/list.html")); //false
** 表示匹配多級(jí)路徑
System.out.println( matcher.match("/usr/**", "/usr/list") ); //true
System.out.println( matcher.match("/usr/**", "/usr/list/again") ); //true
變量綁定匹配
System.out.println( matcher.match("/usr/{name}/{age}", "/usr/張三/12") ); //true
System.out.println( matcher.match("/usr/{name}/{age}", "/usr/張三") ); //false
通過(guò) extractPathWithinPattern() 方法匹配
/**
* extractPathWithinPattern 返回符合匹配的部分路徑,去除路徑開(kāi)頭靜態(tài)部分
**/
System.out.println( matcher.extractPathWithinPattern("/usr/*", "/usr/list") ); //list
System.out.println( matcher.extractPathWithinPattern("/usr/*/again", "/usr/list/again/age") ); // list/again/age
System.out.println( matcher.extractPathWithinPattern("/usr/*.html", "/usr/list") ); //list
System.out.println( matcher.extractPathWithinPattern("/usr/*.html", "/usr/list.html") ); //list.html2.變量綁定
變量綁定可以讓我們?cè)谄ヅ溥^(guò)程中提取路徑中的參數(shù),并將其賦值給指定的變量。
System.out.println( matcher.extractUriTemplateVariables("/usr/{name}/{age}", "/usr/張三/12") ); //{name=張三, age=12}到此這篇關(guān)于Spring中PathMatcher路徑匹配器的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Spring PathMatcher路徑匹配器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot 異步線程間數(shù)據(jù)傳遞的實(shí)現(xiàn)
本文主要介紹了SpringBoot 異步線程間數(shù)據(jù)傳遞的實(shí)現(xiàn),包括異步線程的基本概念、數(shù)據(jù)傳遞的方式、具體實(shí)現(xiàn)方式等,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
SpringBoot基礎(chǔ)教程之集成郵件服務(wù)
這篇文章主要給大家介紹了關(guān)于SpringBoot基礎(chǔ)教程之集成郵件服務(wù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Springboot整合Dubbo+Nacos實(shí)現(xiàn)RPC調(diào)用的示例代碼
隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,越來(lái)越多的企業(yè)和開(kāi)發(fā)者開(kāi)始關(guān)注微服務(wù)架構(gòu),Nacos是阿里巴巴開(kāi)源的一個(gè)動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺(tái),本文講解如何將Spring Boot與Dubbo和Nacos整合,實(shí)現(xiàn)RPC調(diào)用,需要的朋友可以參考下2024-02-02
MyBatis?與?Spring?Data?JPA?核心對(duì)比總結(jié)(選型指南與最佳實(shí)踐)
MyBatis和Spring?Data?JPA是Java兩大主流持久層框架,分別代表SQL可控性與面向?qū)ο箝_(kāi)發(fā)效率的兩種設(shè)計(jì)哲學(xué),本文給大家介紹MyBatis與Spring?Data?JPA核心對(duì)比總結(jié),感興趣的朋友跟隨小編一起看看吧2025-11-11
關(guān)于SpringMVC的異常處理機(jī)制詳細(xì)解讀
這篇文章主要介紹了關(guān)于SpringMVC的異常處理機(jī)制詳細(xì)解讀,SpringMVC是目前主流的Web?MVC框架之一,本文將分析SpringMVC的異常處理內(nèi)容,需要的朋友可以參考下2023-05-05
Java之注解@Data和@ToString(callSuper=true)解讀
在使用Lombok庫(kù)的@Data注解時(shí),若子類未通過(guò)@ToString(callSuper=true)注明包含父類屬性,toString()方法只打印子類屬性,解決方法:1. 子類重寫toString方法;2. 子類使用@Data和@ToString(callSuper=true),父類也應(yīng)使用@Data2024-11-11
java鎖機(jī)制ReentrantLock源碼實(shí)例分析
這篇文章主要為大家介紹了java鎖機(jī)制ReentrantLock源碼實(shí)例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
SpringBoot整合WxJava開(kāi)啟消息推送的實(shí)現(xiàn)
本文主要介紹了SpringBoot整合WxJava開(kāi)啟消息推送,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03

