Что означает двойной шаблон (*) для сервлета, отображающий URL-образец?
Мне интересно, какая разница в использовании одиночных или двойных подстановок для описания url-шаблона при отображении сервлета.
Например: какая разница ниже?
1)
<servlet-mapping id="...">
<servlet-name>BuyServlet</servlet-name>
<url-pattern>/buy/*</url-pattern>
</servlet-mapping>
2)
<servlet-mapping id="...">
<servlet-name>ShopServlet</servlet-name>
<url-pattern>/shop/**</url-pattern>
</servlet-mapping>
EDIT:
@Andrew прав, спецификация говорит только об одном шаблоне (*).
Я дважды проверил свой код и заметил, что место, где я нашел двойные подстановочные знаки (**), было в Spring SimpleUrlHandlerMapping bean.
В этом случае это имеет смысл. Согласно класс doc, он использует AntPathMatcher, который гласит:
Отображение соответствует URL-адресам, используя следующие правила:? соответствует одному персонаж * соответствует нулю или больше символов ** соответствует нулю или больше "каталогов" в пути
Ответы
Ответ 1
В разделе 11.2 спецификации сервлета (версия 2.5) указано следующее:
В дескрипторе развертывания веб-приложения для определения используется следующий синтаксис отображения:
- Используется строка, начинающаяся с символа '/и заканчивая суффиксом'/* для отображения пути.
- Строка, начинающаяся с символа '*. префикс используется как отображение расширений.
- Строка, содержащая только символ /, указывает "сервлет по умолчанию" приложение. В этом случае путь сервлета является URI запроса минус контекст путь и информация о пути - null.
- Все остальные строки используются только для точных совпадений.
Итак, я предполагаю, что второй вариант (**
) не имеет смысла.
P.S. Я просто попытался настроить такое сопоставление, и кажется, что только этот точный url /shop/**
будет сопоставлен (Tomcat 6.0.32).
Ответ 2
Сама спецификация Servlet (версия 3.0, глава 12.2) определяет только два типа подстановочных карт:
- Если шаблон URL заканчивается на "/*", он соответствует всем запросам к предыдущему пути.
- Если шаблон URL начинается с "*.", он сопоставляет все запросы с любым ресурсом, заканчивающимся следующим расширением.
например. "/foo/" будет соответствовать всем запросам для URL-адресов, начинающихся с "http://server/context/foo/" и ".jsp", будет соответствовать всем запросам для URL-адреса, заканчивающегося на ".jsp".
Следуя спецификации, пустая строка ( ") и одна косая черта (" / ") имеют определенные значения." Все остальные строки используются только для точных совпадений".
В соответствии со спецификацией строго второй пример не является шаблоном подстановочных знаков, но должен точно соответствовать "/shop/**". Однако большинство контейнеров Servlet менее строги и позволяют использовать подстановочный знак * в произвольном месте или предлагать еще более сложные варианты соответствия шаблонов.
Ответ 3
Нет, где в спецификации говорить о втором случае.
По спецификация сервлета 12.2
Строка, начинающаяся с символа '/и заканчивая суффиксом'/*, используется для отображение пути
All other strings are used for exact matches only.
В соответствии со спецификацией вторая будет учитываться только для точного соответствия. Он может варьироваться в зависимости от поставщиков серверов.