2008-10-24 25 views
51

Estoy tratando de escribir una aplicación web usando SpringMVC. Normalmente me gustaría asignar una extensión de archivo inventado al controlador frontal de Spring y vivir feliz, pero esta vez voy a buscar URL similares a REST, sin extensiones de nombre de archivo.¿Alguien puede explicar el mapeo de servlets?

Mapeo de todo en mi contexto al controlador frontal (llamémoslo "aplicación") significa que también debería ocuparme de los archivos estáticos, algo que preferiría no hacer (¿por qué reinventar otro weel?), así que alguna combinación con el servlet predeterminado de Tomcat (llamémoslo "tomcat") parece ser el camino a seguir.

que tiene lo que hay que trabajar haciendo algo como

<servlet-mapping> 
    <servlet-name>app</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<servlet-mapping> 
    <servlet-name>tomcat</servlet-name> 
    <url-pattern>*.ext</url-pattern> 
</servlet-mapping> 

y repitiendo este último para cada una de las extensiones de archivo de mi contenido estático. Me pregunto por qué las siguientes configuraciones, que para mí son equivalentes a la anterior, no funcionan.

<!-- failed attempt #1 --> 
<servlet-mapping> 
    <servlet-name>app</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

<servlet-mapping> 
    <servlet-name>tomcat</servlet-name> 
    <url-pattern>*.ext</url-pattern> 
</servlet-mapping> 

<!-- failed attempt #2 --> 
<servlet-mapping> 
    <servlet-name>app</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<servlet-mapping> 
    <servlet-name>tomcat</servlet-name> 
    <url-pattern>/some-static-content-folder/*</url-pattern> 
</servlet-mapping> 

¿Alguien puede arrojar algo de luz?

+0

http://static.springsource.org/spring-webflow/docs/2.0. x/reference/html/ch12s03.html –

+0

_ ** Relacionado: ** _ http://stackoverflow.com/a/14225540/814702 – informatik01

Respuesta

42

Creo que puedo saber lo que está pasando.

En su web.xml de trabajo ha configurado su servlet como el servlet predeterminado (/ por sí mismo es el servlet predeterminado llamado si no hay otras coincidencias), responderá a cualquier solicitud que no coincida con otra asignación.

En error 1 su mapeo/* parece ser un mapeo de ruta válido. Con el mapeo/* en web.xml responde a todas las solicitudes excepto a otras asignaciones de ruta. Según la especificación, las asignaciones de extensión son asignaciones implícitas que se sobrescriben mediante asignaciones explícitas. Es por eso que el mapeo de extensión falló. Todo se asignó explícitamente a la aplicación.

En el error 2, la aplicación es responsable de todo, excepto del contenido que coincide con la asignación de contenido estático. Para mostrar lo que está sucediendo en la prueba rápida que configuré. Aquí hay un ejemplo. /some-static-content-folder/ contiene test.png

Intentar acceder prueba.png Traté:

/some-static-content-folder/test.png 

y no se encontró el archivo. Sin embargo, tratando de

/some-static-content-folder/some-static-content-folder/test.png 

viene arriba. Por lo tanto, parece que el servlet predeterminado de Tomcat (6.0.16 como mínimo) descarta la asignación de servlets e intentará encontrar el archivo utilizando la ruta restante. De acuerdo con esta publicación Servlet for serving static content Jetty ofrece el comportamiento que usted y yo esperábamos.

Hay alguna razón por la que no puede hacer algo como asignar un directorio raíz para sus llamadas de descanso. Algo así como la aplicación asignada a/rest_root/* que usted es responsable de todo lo que sucede en la carpeta rest_root, pero en cualquier otro lugar debe ser manejado por Tomcat, a menos que realice otra asignación explícita. Sugiero configurar su servlet de reposo en un mapeo de ruta porque declara mejor la intención. Usar/o/* no parece apropiado, ya que tienes que trazar las excepciones.El uso de SO como ejemplo, mis asignaciones de descanso sería algo así como

/usuarios/* para el servlet de usuario

/mensajes/* para el servlet mensajes

fin Mapeo

  1. Explicit (Asignaciones de ruta)
  2. Implicit (Mapeos de extensión)
  3. Predeterminado (/)

Corrija cualquier error que haya surgido.

+0

Explicación para "El intento fallido # 1" está muerto en el destino. Todavía no puede entender el otro. – agnul

+0

Si/* ya está asignado al servlet de "aplicación", ¿qué gana al mapear "/" también? –

+0

No hay ganancia de mapeo/si usa/*, ya que nunca se llamará. La desventaja de/* es que tendrá que manejar todo, mientras que con/aún puede configurar asignaciones de extensión. –

2

Nunca he tratado de asignar un servlet como este, pero I sería argumentan que/* técnicamente ambos comienzan con/y terminan con/*, aunque el mismo carácter se usa para ambas coincidencias.

3

Como referencia, el "intento fallido # 2" es perfectamente correcto en la versión de Tomcat> = a 6.0.29.

fue el resultado de un error de Tomcat que se arreglen en la versión 6.0.29:

https://issues.apache.org/bugzilla/show_bug.cgi?id=50026

<!-- Correct for Tomcat >= 6.0.29 or other Servlet containers --> 
<servlet-mapping> 
    <servlet-name>app</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<servlet-mapping> 
    <servlet-name>default</servlet-name> 
    <url-pattern>/some-static-content-folder/*</url-pattern> 
</servlet-mapping> 
Cuestiones relacionadas