191 votos

¿Spring MVC 3 y manejo de contenido estático - te estoy perdiendo algo?

Estoy desarrollando una aplicación web utilizando Spring MVC 3 y tiene la DispatcherServlet de la captura de todas las solicitudes a '/' así (web.xml):

  <servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>

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

Ahora, este funciona como se anuncia, sin embargo ¿cómo puedo manejar contenido estático? Previamente, antes de usar de Descanso Url, me hubiera cogido a todos *.html por ejemplo, y enviado a la DispatcherServlet, pero ahora es otro juego de pelota.

Tengo un /static/ carpeta que incluye /estilos/, /js/, /images/ etc y me gustaría excluir /static/* del DispatcherServlet.

Ahora podía obtener recursos estáticos de trabajo cuando hice esto:

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

Pero quiero que tenga buen Url (el punto de mí con Spring MVC 3) no la página de destino se www.domain.com/app/

Yo también no quieren una solución junto a tomcat o cualquier otro contenedor de servlets, y debido a que esta es (relativamente) poco tráfico, no necesito un servidor web (como apache httpd) de enfrente.

Hay una solución limpia para esto?

259voto

Joris Puntos 2048

Desde que me pasé un montón de tiempo en este tema, yo pensé en compartir mi solución. Desde la primavera de 3.0.4, hay un parámetro de configuración que se llama <mvc:resources/> (más sobre esto en la documentación de referencia del sitio web) que puede ser utilizado para servir a los recursos estáticos mientras se utiliza la DispatchServlet en el raíz del sitio.

Con el fin de utilizar esto, utiliza una estructura de directorios que tiene el siguiente aspecto:

src/
 springmvc/
  web/
   MyController.java
WebContent/
  resources/
   img/
    image.jpg
  WEB-INF/
    jsp/
      index.jsp
    web.xml
    springmvc-servlet.xml

El contenido de los archivos debe verse como:

src/springmvc/web/HelloWorldController.java:

package springmvc.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloWorldController {

 @RequestMapping(value="/")
 public String index() {
  return "index";
 }
}

WebContent/WEB-INF/web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

 <servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>

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

WebContent/WEB-INF/springmvc-servlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
 xmlns:mvc="http://www.springframework.org/schema/mvc"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 http://www.springframework.org/schema/mvc
 http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!-- not strictly necessary for this example, but still useful, see http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-controller for more information -->
 <context:component-scan base-package="springmvc.web" />

    <!-- the mvc resources tag does the magic -->
 <mvc:resources mapping="/resources/**" location="/resources/" />

    <!-- also add the following beans to get rid of some exceptions -->
 <bean      class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
 <bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
 </bean>

    <!-- JSTL resolver -->
 <bean id="viewResolver"
  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass"
   value="org.springframework.web.servlet.view.JstlView" />
  <property name="prefix" value="/WEB-INF/jsp/" />
  <property name="suffix" value=".jsp" />
 </bean>

</beans>

WebContent/jsp/index.jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<h1>Page with image</h1>
<!-- use c:url to get the correct absolute path -->
<img src="<c:url value="/resources/img/image.jpg" />" />

Espero que esto ayude :-)

47voto

rozky Puntos 1385

Este problema es solucionado en la primavera de 3.0.4.RELEASE donde se puede utilizar <mvc:resources mapping="..." location="..."/> elemento de configuración en el fichero de configuración del despachador de primavera.

Consulte la documentación de primavera

38voto

Ayub Malik Puntos 291

En la primavera 3.0. x agregar lo siguiente a tu servlet-config.xml (el archivo que se configura en el archivo web.xml como el contextConfigLocation. Es necesario agregar el espacio de nombres mvc también pero en google para eso si no sabes cómo! ;)

A mí me

<mvc:default-servlet-handler/>

Saludos

Ayub Malik

18voto

user243397 Puntos 121

Si entiendo el problema correctamente, creo que he encontrado una solución a su problema:

Yo tenía el mismo problema que las primas de salida se muestra sin estilos css, javascripts o jquery archivos encontrados.

Acabo de añadir asignaciones para el "default" de servlet. El siguiente fue añadido a la web.xml archivo:

 <servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>*.css</url-pattern>
 </servlet-mapping>

 <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
 </servlet-mapping>

Esto debe filtrar el javascript y el css de archivo de las solicitudes de los DispatcherRequest objeto.

De nuevo, no estoy seguro si esto es lo que está después, pero a mí me funcionó. Creo que por "defecto" es el nombre del servlet por defecto dentro de JBoss. No demasiado seguro de lo que es para otros servidores.

12voto

nickdos Puntos 4757

He estado lidiando con este problema en MVC de Spring 3.0 y al principio me fui con la UrlRewriteFilter opción. Sin embargo, yo no estaba contento con esta solución, ya que "no se siente bien" (no soy el único - para ver el enlace de arriba para la Primavera de Foros donde la palabra "hack" aparece un par de veces).

Así que se me ocurrió una solución similar a "Desconocido (Google)" el anterior pero tomó prestada la idea de tener todo el contenido estático sirve de /static/ (tomado de la Primavera Roo versión de la Tienda de Mascotas de la aplicación). El "default" servlet no trabajo para mí, pero el Spring Webflow ResourceServlet hizo (también tomado de la Primavera Roo generados de la aplicación).

Web.xml:

<servlet>
    <servlet-name>mainDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>

<servlet>
    <servlet-name>Resource Servlet</servlet-name>
    <servlet-class>org.springframework.js.resource.ResourceServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

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

<servlet-mapping>
    <servlet-name>Resource Servlet</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

El único cambio que he realizado para Jsp era para agregar el /static/ ruta de Url para CSS, JS e imágenes. Por ejemplo. "${pageContext.request.contextPath}/static/css/screen.css".

para Maven los usuarios de la dependencia para "org.springframework.js.resource.resourceservlet" es:

<dependency>
    <groupId>org.springframework.webflow</groupId>
    <artifactId>org.springframework.js</artifactId>
    <version>2.0.8.RELEASE</version>
</dependency>

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X