Что означает двойной шаблон (*) для сервлета, отображающий 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.

В соответствии со спецификацией вторая будет учитываться только для точного соответствия. Он может варьироваться в зависимости от поставщиков серверов.