2012-04-19 10 views
5

He configurado mi servlet spring-mvc para que coincida con * .página solicitudes. He fijado el welcome-file-list en web.xml para ser index.pagewelcome-file en web.xml con spring not working?

Esto funciona cuando voy a la raíz de mi servidor web:

http://me.com pone redirigidos a http://me.com/index.page correctamente.

Sin embargo, no redirige cuando uso subdirectoris:

http://me.com/dashboard qué no redirecciona a http://me.com/dashboard/index.page

¿Hay alguna manera de conseguir este trabajo de mapeo?

Mi archivo web.xml (extracto):

<welcome-file-list> 
    <welcome-file>index.page</welcome-file> 
</welcome-file-list> 

<servlet-mapping> 
    <servlet-name>spring-mvc</servlet-name> 
    <url-pattern>*.page</url-pattern> 
</servlet-mapping> 

Mi webdefault.xml (de muelle):

<init-param> 
     <param-name>dirAllowed</param-name> 
     <param-value>false</param-value> 
    </init-param> 
    <init-param> 
     <param-name>welcomeServlets</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <init-param> 
     <param-name>redirectWelcome</param-name> 
     <param-value>false</param-value> 
    </init-param> 

Respuesta

3

sólo funcionará para los directorios reales, físicas, no no lo hará trabajo para mapeos de servlets arbitrarios que simulan la estructura de directorios.

Spring MVC permite asignaciones de URL muy complejos, por lo que manejaría mejor este escenario con @RequestMapping

+0

Hola Bozho. ¿Estás seguro? La documentación http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp/web_xml.html#1026980 hace que parezca que los directorios deben ser compatibles. –

+0

podría ser la forma en que lo implementaron en WebLogic. Pero Jetty probablemente esté interpretando el estándar de manera diferente. Pruébalo en una aplicación completamente nueva, sin resorte, solo para probar – Bozho

+0

Funcionó en una nueva aplicación de primavera. Sin embargo, la diferencia es que tenía archivos reales en directorios reales, en lugar de apuntar a servlets. Tal vez ese es el problema ... –

0

Esto es algo que tienes que probablemente fijado en su servidor web, y así, a lo mejor servidor específico

Para Apache HTTP Server se puede lograr esto mediante la creación de DirectoryIndex así: DirectoryIndex index.page

al parecer, alguien ya ha hecho esta pregunta, y ha aceptado una respuesta a web.xml default file in directory (for jetty, or tomcat)? - ver si funciona para usted.

+0

Hola Ryan. Eso es lo que estoy haciendo en este momento, pero desafortunadamente solo funciona en la raíz del contexto, y no en los subdirectorios. –

12

El <welcome-file> debe representar físicamente un archivo existente en una carpeta arbitraria que le gustaría servir cada vez que el usuario final solicita una carpeta (como la raíz /, pero también puede ser cualquier otra carpeta, como /foo/). Solo necesita comprender que el servletcontainer probará su existencia física antes de realizar un reenvío, si no existe, se devolverá un error de página HTTP 404 no encontrado.

En su caso particular, no tiene un archivo físico index.page en su carpeta raíz. Tiene realmente un archivo index.jsp en su carpeta raíz. El index.page es simplemente una URL virtual. Por lo que el servletcontainer no será capaz de encontrar el archivo físico index.page y por lo tanto el error con un 404.

Puede solucionar este engañando al servletcontainer mediante la colocación de un archivo existente físicamente index.page junto al archivo index.jsp en la misma carpeta . Ese archivo puede mantenerse completamente vacío. El servletcontainer buscará el archivo y luego lo reenviará a index.page, que invocará el servlet del controlador que a su vez servirá el index.jsp como vista. Eso funcionará bien.

+0

Hola BalusC. Hay un parámetro especial en webdefault.xml en Jetty llamado welcomeServlets. Si lo configura en verdadero, Jetty buscará un servlet que satisfaga el archivo de bienvenida si no existe un archivo físico. Tengo ese conjunto en true, y funcionó para el contexto raíz, pero no funciona para subdirectorios desafortunadamente. –

+0

Crear un archivo vacío para engañar al contenedor es un poco ingenioso. ¡Gracias! – Kal

+0

Eres un genio. –

2

Para evitar el reenvío del archivo de bienvenida, es mejor agregar una asignación para él.

<servlet-mapping> 
    <servlet-name>spring-mvc</servlet-name> 
    <url-pattern>index.html</url-pattern> 
    </servlet-mapping> 

Y en el caso de la configuración de Java se puede reemplazar dos métodos en la clase que se extiende WebMvcConfigurerAdapter

@Override 
public void addViewControllers(ViewControllerRegistry registry) { 
    registry.addViewController("/").setViewName("/index"); 
} 

@Override 
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
    configurer.enable(); 
} 

si quieres servir a index.html de forma explícita, lo convierten en un recurso reemplazar un método en el mismo la clase de la siguiente manera:

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("/index.html").addResourceLocations("/WEB-INF/views/index.html"); 
} 

Por supuesto addResourceLocations mosto sigue la carpeta elegido para sostener sus puntos de vista.

Ver these samples