Ответ 1
Синтаксис переменной пути в шаблоне запроса контроллера spring MVC равен {variable_name:regular_expression}
. Вы можете опционально опустить регулярное выражение, которое приводит к тому, что вы видите чаще, {id}
.
Итак, для примера /index/{endpoint}/{type}/{id:.+}
имя переменной id
, а регулярное выражение - .+
(см. ниже ссылку на spring docs).
Регулярное выражение .+
указывает "сопоставить метасимвол .
один или несколько раз". "." metacharacter представляет любой символ, включая пробел (хотя некоторые реализации не соответствуют символам новой строки). См. http://en.wikipedia.org/wiki/Regular_expression
Регулярное выражение используется, чтобы помочь spring определить значение переменной, потому что у вас могут быть сложные имена переменных или может быть другая важная информация в конце пути, которая в противном случае была бы втянута в значение переменной, если spring просто сказал "идти до конца пути" (например, расширения файлов или переменные пути).
Возможно, что в вашем примере переменная id может содержать специальные символы, которые в противном случае вызывают spring досрочно прервать переменную. Я столкнулся с этой проблемой, прежде чем пытаться использовать имя файла, содержащее расширение файла (foobar.jpg). spring будет возвращать только часть "foobar" переменной, потому что spring предполагал, что я хотел, чтобы она прекратила значение переменной в разделителе периодов. Итак, в этом случае, чтобы убедиться, что "id" соответствует полному значению, вы помещаете регулярное выражение, которое сообщает spring, чтобы идти вперед и сопоставлять все между последней косой чертой и концом пути. SO Ссылка: Spring MVC @PathVariable получает усеченный
Здесь выдержка из документов spring, которая имеет дело с комплексным сопоставлением переменных:
Иногда вам нужно больше точности в определении переменных шаблона URI. Рассмотрите URL-адрес "/ spring-web/spring-web-3.0.5.jar". Как вы разбиваете его на несколько частей?
Аннотации @RequestMapping поддерживают использование регулярных выражений в переменных шаблона URI. Синтаксис: {varName: regex}, где первая часть определяет имя переменной, а вторая - регулярное выражение.
Вот их (довольно сложный) пример:
@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{extension:\\.[a-z]+}")
public void handle(@PathVariable String version, @PathVariable String extension) {
// ...
}
Источник: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html
Пример, который они предоставляют, показывает, как вы выполняете сложные сопоставления от запросов к параметрам метода контроллера, которые вы не сможете использовать, не используя регулярное выражение.