<url-pattern>/*</url-pattern>
/*
в сервлете переопределяет все остальные сервлеты, включая все сервлеты, предоставляемые сервлет-контейнером, такие как сервлет по умолчанию и сервлет JSP. Какую бы просьбу вы не уволили, она окажется в этом сервлете Таким образом, это плохой шаблон URL для сервлетов. Обычно вы хотите использовать /*
только на Filter
. Он может разрешить выполнение запроса любому сервлету, прослушивающему более конкретный шаблон URL, вызвав FilterChain#doFilter()
.
<url-pattern>/</url-pattern>
/
не переопределяет любой другой сервлет. Он заменяет только встроенный сервлет по умолчанию для сервлет-контейнера для всех запросов, который не соответствует ни одному другому зарегистрированному сервлету. Обычно это вызывается только для статических ресурсов (CSS / JS / image / etc) и списков каталогов. Встроенный в сервлет контейнер сервлетов по умолчанию также способен обрабатывать запросы кеша HTTP, потоковую передачу мультимедиа (аудио / видео) и возобновление загрузки файлов. Обычно вы не хотите переопределять сервлет по умолчанию, так как в противном случае вам придется позаботиться обо всех его задачах, что не совсем тривиально (служебная библиотека JSF OmniFaces имеет открытый исходный код пример ). Таким образом, это также плохой шаблон URL для сервлетов. Почему JSP-страницы не попадают в этот сервлет, это потому, что будет вызван встроенный сервлет JSP сервлет-контейнера, который уже по умолчанию сопоставлен с более конкретным шаблоном URL *.jsp
.
<url-pattern></url-pattern>
Тогда есть также шаблон URL пустой строки
. Это будет вызвано при запросе корневого контекста. Это отличается от подхода <welcome-file>
тем, что он не вызывается при запросе любой подпапки. Скорее всего, это шаблон URL, который вы на самом деле ищете, если вам нужен " сервлет домашней страницы ". Надо только признать, что я интуитивно ожидал, что шаблон URL пустой строки
и шаблон URL-адреса косой черты /
будут определены совершенно наоборот, поэтому я могу понять, что многие начинающие пользователи запутались в этом. Но это то, что есть.
Фронт-контроллер
В случае, если вы на самом деле намереваетесь иметь сервлет фронт-контроллера, лучше всего сопоставить его с более конкретным шаблоном URL, таким как *.html
, *.do
, /pages/*
, /app/*
и т. д. Вы можете скрыть шаблон URL-адреса фронт-контроллера и скрыть статические ресурсы в общем шаблоне URL, например /resources/*
, /static/*
и т. д., с помощью фильтра сервлетов. См. Также Как предотвратить обработку статических ресурсов сервлетом фронт-контроллера, который отображается в / *. Следует отметить, что Spring MVC имеет встроенный сервлет статических ресурсов, поэтому вы можете сопоставить его фронт-контроллер с /
, если вы настроите общий шаблон URL для статических ресурсов в Spring. См. Также Как обрабатывать статический контент в Spring MVC?