首页 > 其他分享 >Spring-PathMatcher

Spring-PathMatcher

时间:2024-03-06 10:13:06浏览次数:17  
标签:匹配 String PathMatcher Spring list usr pattern path

1. 概述

PathMatcher是Spring的一个概念模型接口,该接口抽象建模了概念"路径匹配器",一个"路径匹配器"是一个用于路径匹配的工具。

位于 Spring-core 包中 util 包下。

2. 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 是否是一个 pattern(模式)
	 * 如果返回值是 false,也就是说 path 不是一个模式,而是一个静态路径(真正的路径字符串),
	 * 那么就不用调用方法 #match 了,因为对于静态路径的匹配,直接使用字符串等号比较就足够了。
	 * @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.
	 * 根据当前 PathMatcher 的匹配策略,检查指定的径 path 和指定的模式 pattern 是否匹配
	 * @param 用于检测路径字符串是否匹配于某个模式时所用的模式
	 * @param path 需要被检测的路径字符串
	 * @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.
	 * 根据当前 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.
	 * 给定一个模式 pattern 和一个全路径 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.
	 * 该方法用于发现路径中的哪一部分是和模式能动态匹配上的部分。它会去除路径中开头静态部分,
	 * 仅仅返回那部分真正和模式匹配的上的部分。
	 * 例子 : "myroot/*.html" 为 pattern , "myroot/myfile.html" 为路径,
	 *  则该方法返回 "myfile.html".  
	 * 具体的检测规则根据当前 PathMatcher 的匹配策略来顶。	
	 * 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 '}').
	 * 给定一个模式和一个路径,提取其中的 URI 模板变量信息。URI模板变量表达式格式为 "{variable}"
	 *      
	 * 例子 : pattern  为 "/hotels/{hotel}" ,路径为 "/hotels/1", 则该方法会返回一个 map ,
     * 内容为 : "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.
	 * 合并两个模式。具体合并的算法由实现类决定。
	 * @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);

}

3. AntPathMatcher

Spring框架自身对概念模型接口也提供了一个缺省的实现AntPathMatcher,用于匹配Ant风格的路径。我们平时使用的路径匹配基本用的都是这个。

1. 通配符

  • ? 表示匹配任意一个字符
System.out.println( matcher.match("/usr/name?", "/usr/name1") );  //true
System.out.println( matcher.match("/usr/name?", "/usr/name111") );  //false
  • * 表示匹配单个路径
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
  • ** 表示匹配多级路径
System.out.println( matcher.match("/usr/**", "/usr/list") );  //true
System.out.println( matcher.match("/usr/**", "/usr/list/again") );  //true
  • 通过 extractPathWithinPattern() 方法匹配
/**
 * extractPathWithinPattern 返回符合匹配的部分路径,去除路径开头静态部分
 **/
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.html

2. 变量绑定

变量绑定可以让我们在匹配过程中提取路径中的参数,并将其赋值给指定的变量。

System.out.println( matcher.extractUriTemplateVariables("/usr/{name}/{age}", "/usr/张三/12") ); //{name=张三, age=12}

标签:匹配,String,PathMatcher,Spring,list,usr,pattern,path
From: https://www.cnblogs.com/cnff/p/18055828

相关文章

  • springboot - 配置文件 @ConfigurationProperties
    1.简单属性@Configuration@ConfigurationProperties(prefix="mail")publicclassConfigProperties{privateStringhostName;privateintport;privateStringfrom;//standardgettersandsetters}注意:如果我们不在POJO中使用@Configurati......
  • SpringBoot中try/catch异常并回滚事务(自动回滚/手动回滚/部分回滚)
    https://www.cnblogs.com/cfas/p/16423510.html https://www.cnblogs.com/konglxblog/p/16229175.htmlSpringBoot异常处理回滚事务详解(自动回滚、手动回滚、部分回滚)(事务失效) 参考:https://blog.csdn.net/zzhongcy/article/details/102893309概念事务定义事务,就是一......
  • SpringBoot3整合Druid数据源的解决方案
    druid-spring-boot-3-starter目前最新版本是1.2.20,虽然适配了SpringBoot3,但缺少自动装配的配置文件,会导致加载时报加载驱动异常。<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.20</version......
  • SpringBoot常用注解
    SpringBoot常用注解  @SpringBootApplication=@SpringBootConfiguration+@ComponentScan+@EnableAutoConfiguration@Configuration注解能够将一个类定义为SpringBoot应用程序中的配置类,等同于spring的XML配置文件,从而使该类中的Bean对象能够被SpringIoC容器进行自动管......
  • spring面试高频问题---springboot自动配置
    springboot自动配置1.springboot自动配置原理自动配置主要依赖于@SpringBootApplication注解,其中还包含了三个注解@SpringBootConfiguration:该注解与@Configuration注解作用相同,用来声明当前也是个配置类。@ComponentScan:组件扫描,默认扫描当前引导类所在包及其子包。@Ena......
  • spring面试高频问题---spring框架中常见的注解常见注解
    Spring-框架中常见的注解1.spring常见注解2.springmvc常见注解3.springboot常见注解......
  • springMVC执行流程--
    springMVC执行流程1.springMVC执行流程Springmvc的执行流程是这个框架最核心的内容视图阶段(老旧JSP等)前后端分离阶段(接口开发,异步)2.视图阶段(jsp)重要的组件:前端控制器、处理器映射器、处理器适配器、视图解析器3.前后端分离阶段(接口开发,异步)4.问题总结......
  • springboot集成报文验证组件validation
    1.引入validation的依赖jar<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>3.2.3</version></dependency>2.请求报文增加字段的校验规则packa......
  • 面试官:说说SpringAOP实现原理?
    AOP(Aspect-OrientedProgramming,面向切面编程)是一种编程技术,它允许开发者在不改变现有代码的情况下,增加新的功能或行为,这些功能或行为被称为“切面”。AOP可以通过预编译方式和运行期动态代理的方式来实现,它的主要目的是降低业务逻辑的耦合性,提高程序的可重用性和开发效率。AOP......