<url-pattern>/*</url-pattern>
El /*
en un servlet anula todos los demás servlets, incluidos todos los servlets proporcionados por el contenedor de servlet, como el servlet predeterminado y el servlet JSP. Cualquier solicitud que dispare, terminará en ese servlet. Por lo tanto, este es un mal patrón de URL para servlets. Por lo general, desea utilizar /*
en una Filter
única. Puede permitir que la solicitud continúe a cualquiera de los servlets que escuchan en un patrón de URL más específico llamando FilterChain#doFilter()
.
<url-pattern>/</url-pattern>
El /
no anula ningún otro servlet. Solo reemplaza el servlet predeterminado incorporado del contenedor de servlet para todas las solicitudes que no coinciden con ningún otro servlet registrado. Esto normalmente solo se invoca en recursos estáticos (CSS / JS / image / etc) y listados de directorios. El servlet por defecto incorporado del servletcontainer también es capaz de manejar solicitudes de caché HTTP, transmisión de medios (audio / video) y reanudación de descarga de archivos. Por lo general, no desea anular el servlet predeterminado ya que de lo contrario tendría que ocuparse de todas sus tareas, lo que no es exactamente trivial (la biblioteca de utilidades JSF OmniFaces tiene un ejemplo de código abierto ) Por lo tanto, este también es un mal patrón de URL para servlets. En cuanto a por qué las páginas JSP no llegan a este servlet, se debe a que se invocará el servlet JSP incorporado del contenedor de servlet, que ya está asignado de forma predeterminada en el patrón de URL más específico *.jsp
.
<url-pattern></url-pattern>
Luego también está el patrón de URL de cadena vacía
. Esto se invocará cuando se solicite la raíz de contexto. Esto es diferente del <welcome-file>
enfoque de que no se invoca cuando se solicita una subcarpeta. Este es probablemente el patrón de URL que está buscando en caso de que desee un " servlet de página de inicio ". Solo tengo que admitir que intuitivamente espero que el patrón de URL de cadena vacía
y el patrón de barra diagonal /
se definan exactamente al revés, por lo que puedo entender que muchos entrantes se confundieron con esto. Pero es lo que es.
Controlador frontal
En caso de que en realidad la intención de tener un servlet controlador frontal, entonces sería mejor mapa en un patrón de URL más específica como *.html
, *.do
, /pages/*
, /app/*
, etc Usted puede ocultar los recursos estáticos patrón URL controlador frontal y la cubierta en un patrón de URL común como /resources/*
, /static/*
etc. con la ayuda de un filtro de servlet. Consulte también Cómo evitar que los recursos estáticos sean manejados por el servlet del controlador frontal que se asigna en / * . Se debe tener en cuenta que Spring MVC tiene un servlet de recursos estáticos incorporado, por lo que podría asignar su controlador frontal /
si configura un patrón de URL común para recursos estáticos en Spring. Consulte también ¿Cómo manejar el contenido estático en Spring MVC?