<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?
/**
patrón indica?Me gustaría complementar la respuesta de BalusC con las reglas de mapeo y un ejemplo.
Reglas de mapeo de la especificación Servlet 2.5:
En nuestro ejemplo, hay tres servlets. / es el servlet predeterminado instalado por nosotros. Tomcat instala dos servlets para servir jsp y jspx. Entonces para mapear
http://host:port/context/hello
Para asignar
http://host:port/context/hello.jsp
fuente
Quizás también necesites saber cómo se mapean las URL, ya que sufrí
404
durante horas. Hay dos tipos de manejadores que manejan las solicitudes.BeanNameUrlHandlerMapping
ySimpleUrlHandlerMapping
. Cuando definimos aservlet-mapping
, estamos usandoSimpleUrlHandlerMapping
. Una cosa que necesitamos saber es que estos dos manejadores comparten una propiedad común llamadaalwaysUseFullPath
que por defecto esfalse
.false
aquí significa que Spring no usará la ruta completa para asignar una url a un controlador. Qué significa eso? Significa cuando define unservlet-mapping
:el controlador realmente usará la
*
parte para encontrar el controlador. Por ejemplo, el siguiente controlador enfrentará un404
error cuando lo solicite usando/perfix/api/feature/doSomething
Es una combinación perfecta, ¿verdad? Pero por qué
404
. Como se mencionó anteriormente, el valor predeterminado dealwaysUseFullPath
es falso, lo que significa que en su solicitud, solo/api/feature/doSomething
se usa para encontrar un controlador correspondiente, pero no hay ningún controlador que se preocupe por esa ruta. Debe cambiar su URL/perfix/perfix/api/feature/doSomething
o eliminarlaperfix
de la base MyController@RequestingMapping
.fuente
Creo que la respuesta de Candy es mayormente correcta. Hay una pequeña parte, creo que de lo contrario.
Para asignar host: puerto / contexto / hello.jsp
Creo que por eso "/ *" no coincide con host: port / context / hello porque trata "/ hello" como una ruta en lugar de un archivo (ya que no tiene una extensión).
fuente
La diferencia esencial entre
/*
y/
es que un servlet con asignación/*
se seleccionará antes que cualquier servlet con una asignación de extensión (como*.html
), mientras que un servlet con asignación/
se seleccionará solo después de considerar las asignaciones de extensión (y se utilizará para cualquier solicitud que no t coincide con cualquier otra cosa --- es el "servlet predeterminado").En particular, una
/*
asignación siempre se seleccionará antes de una/
asignación. Tener cualquiera evita que las solicitudes lleguen al servlet predeterminado del contenedor.Cualquiera de los dos se seleccionará solo después de las asignaciones de servlet que son coincidencias exactas (me gusta
/foo/bar
) y aquellas que son asignaciones de ruta más largas que/*
(me gusta/foo/*
). Tenga en cuenta que la asignación de cadena vacía es una coincidencia exacta para la raíz de contexto (http://host:port/context/
).Consulte el Capítulo 12 de la Especificación de Servlet Java, disponible en la versión 3.1 en http://download.oracle.com/otndocs/jcp/servlet-3_1-fr-eval-spec/index.html .
fuente