Spring5 также давно отсутствует, и в нем есть несколько новых способов игры, которые нам нужно медленно раскрывать.Нет, когда Song Ge недавно изучал исходный код SpringMVC, он увидел этот фрагмент кода:
protected String initLookupPath(HttpServletRequest request) {
if (usesPathPatterns()) {
request.removeAttribute(UrlPathHelper.PATH_ATTRIBUTE);
RequestPath requestPath = ServletRequestPathUtils.getParsedRequestPath(request);
String lookupPath = requestPath.pathWithinApplication().value();
return UrlPathHelper.defaultInstance.removeSemicolonContent(lookupPath);
}
else {
return getUrlPathHelper().resolveAndCacheLookupPath(request);
}
}
Этот метод вышел из Spring5, и раньше такого метода не было. В старом SpringMVC, когда нам нужно получить текущий адрес запроса, мы можем получить его напрямую следующим образом:
String lookupPath = this.getUrlPathHelper().getLookupPathForRequest(request);
Но теперь он изменился, и теперь способ получить текущий URL-адрес запроса выглядит следующим образом:
String lookupPath = initLookupPath(request);
Если сравнивать эти два метода, основная причина заключается в том, что в методе initLookupPath есть больше вариантов использованияPathPatterns, что является новой вещью в Spring5, поэтому сегодня Сонг Гэ поделится с вами тем, что такое UsePathPatterns и как их воспроизвести в простой статье!
Это не маленькое изменение! Особенно, если вы используете WebFlux в своем проекте, то эта штука особенно важна!
AntPathMatcher
Когда мы используем аннотацию @RequestMapping для обозначения интерфейса запроса (или используем аналогичные методы, такие как @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping), мы можем использовать некоторые подстановочные знаки для сопоставления URL-адресов, для простого примера. , предположим, у меня есть следующие пять интерфейсов:
@GetMapping("/hello/**/hello")
public String hello() {
return "/hello/**/hello";
}
@GetMapping("/h?llo")
public String hello2() {
return "/h?llo";
}
@GetMapping("/**/*.html")
public String hello3() {
return "/**/*.html";
}
@GetMapping("/hello/{p1}/{p2}")
public String hello4(@PathVariable String p1, @PathVariable String p2) {
System.out.println("p1 = " + p1);
System.out.println("p2 = " + p2);
return "/hello/{p1}/{p2}";
}
@GetMapping("/{name:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{ext:\\.[a-z]+}")
public void handle(@PathVariable String name, @PathVariable String version, @PathVariable String ext) {
System.out.println("name = " + name);
System.out.println("version = " + version);
System.out.println("ext = " + ext);
}
Прежде чем объяснять значение интерфейса, давайте поговорим о значении этих подстановочных знаков:
подстановочный знак | значение |
---|---|
** |
соответствует нулю или более каталогам |
* |
соответствует нулю или более символов |
? |
соответствует любому одиночному символу |
Зная значение подстановочных знаков, поговорим о том, какие запросы может принимать каждый интерфейс:
- Первый интерфейс может получать, например,
/hello/123/123/hello
,/hello/a/hello
а также/hello/hello
такой запрос, потому что промежуточный**
Представляет ноль или более каталогов. - Второй интерфейс может получать, например,
/hallo
,/hello
,/hMllo
такие как запросы, обратите внимание, что он не может получать/haallo
или/hllo
,так как?
Представляет персонаж. - Третий интерфейс может принимать любые
.html
для постфиксных запросов, например./aaa/bb/cc.html
,/aa.html
или/aa/aa.html
. - Четвертые интерфейсы оценили, что мы более знакомы, это оценивается, мы использовали в дизайне интерфейса Stretful стилей, который получил аналогичный формат запроса
/hello/aa/bb
, где параметр p1 соответствует aa, а параметр p2 соответствует bb. - В пятом интерфейсе используются регулярные выражения. Три формата параметров: имя, версия и расширение выражаются в регулярных выражениях. Он может принимать, например,
/spring-web-3.0.5.jar
Запрос формата, имя конечного параметраspring-web
, версия3.0.5
, доб..jar
.
Это функция, которая существовала в SpringMVC раньше, независимо от того, использовали вы ее или нет, она все равно существует.
Так кто поддерживает эту функцию? Это AntPathMatcher.
AntPathMatcher — это средство сопоставления путей, реализующее стиль Ant.Правила пути в стиле Ant на самом деле представляют собой три средства сопоставления путей, которые мы представили вам ранее, которые очень просты. Это правило сопоставления путей исходит из проекта Apache Ant (ant.apache.org), ApacheВообще-то Ant мы сейчас редко используем, его заменой является всем известный Maven, если вам посчастливится поддерживать какие-то старые проекты до 2010 года, вы можете соприкоснуться с Ant.
AntPathMatcher на самом деле имеет очень широкий спектр приложений в SpringMVC, не только для определения интерфейсов в @RequestMapping, но и для других мест, связанных с сопоставлением адресов.Например, мы настраиваем статическую фильтрацию ресурсов в файле конфигурации SpringMVC, а также сопоставление путей в стиле Ant :
<mvc:resources mapping="/**" location="/"/>
Кроме того, такие как регистрация путей перехвата в перехватчике, сопоставление путей при междоменной обработке и т. д., используются средства сопоставления путей в стиле Ant.
В целом, AntPathMatcher — относительно примитивное решение для сопоставления путей в Spring, хотя оно относительно простое, но неэффективное и неудобное при работе с кодировкой URL.
Поэтому в Spring5 есть PathPattern.
PathPattern
PathPattern разработан специально для веб-приложений, большинство его функций аналогичны предыдущему AntPathMatcher, но, конечно, есть небольшие отличия, о которых Сонгге расскажет позже.
Если это приложение-сервлет, в настоящее время официально рекомендуемым решением для сопоставления URL-адресов является PathPattern (конечно, вы также можете выбрать более раннюю версию AntPathMatcher).Хотя официальная рекомендация — PathPattern, фактически по умолчанию используется AntPathMatcher; единственное решение.
Обратите внимание, что PathPattern — это очень новая вещь. В настоящее время последняя версия Spring — 5.3.4. До Spring 5.3 мы могли выбирать только AntPathMatcher в приложениях Servlet. После Spring 5.3 мы можем использовать PathPattern.
PathPattern будет предварительно анализировать правила URL-адресов в PathContainer, который быстрее обрабатывает сопоставление URL-адресов. Различия между PathPattern и AntPathMatcher в основном отражаются в двух аспектах:
Во-первых, PathPattern поддерживает использование только конечной части**
, если используется в середине пути**
Будет сообщено об ошибке. Первый и третий интерфейсы выше сообщат об ошибке в режиме PathPattern следующим образом:
потому что в середине или начать использовать**
Очень запутанно, поэтому PathPattern поддерживается только в конце**
.
Во-вторых, PathPattern поддерживает использование таких методов, как{*path}
Метод сопоставления путей также можно использовать для сопоставления многоуровневых путей и присвоения совпадающего значения переменной пути, например, в следующем интерфейсе:
@GetMapping("/javaboy/{*path}")
public void hello6(@PathVariable String path) {
System.out.println("path = " + path);
}
Если путь запросаhttp://localhost:8080/javaboy/aa
, то значение пути параметра равно/aa
;
Если путь запросаhttp://localhost:8080/javaboy/aa/bb/cc/dd
, то значение пути параметра равно/aa/bb/cc/dd
;
Этот способ записи также является относительно новым, потому что в предыдущем AntPathMatcher такого не было.
как пользоваться
По умолчанию AntPathMatcher по-прежнему используется в SpringMVC, так как же включить PathPattern? Это очень просто, вам нужно всего лишь добавить следующую конфигурацию в проект SpringBoot:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setPatternParser(new PathPatternParser());
}
}
После добавления этой конфигурации в коде, размещенном в начале нашей статьи, он войдет в ветку if, а затем использует PathPattern для разбора URL-адреса запроса.
резюме
Хорошо, сегодня я так много говорил с друзьями, вы можете испытать это, но обратите внимание на выбор версии Spring, обязательно выберите версию выше 5.3 ~ Всем хороших выходных ~