Pregunta

La estructura de directorio de Proyecto Maven Spring se muestra a continuación. Estoy usando la configuración basada en la anotación Spring-4. Configuro los recursos como a continuación. Probé muchas formas en que se sugieren en muchas preguntas de StackOverFlow y otros sitios web

resorte 4 Carga de recursos estáticos

http://imwill.com/ Primavera-MVC-4-ADD-estática-Resources-By-Annotation / #. U5GZLXKS9I4

Pero los archivos JSP no pudieron cargar los recursos, todas las solicitudes de contenido estático devuelven el error 404. Probé estas cosas en JSP,

 <link href="resources/css/bootstrap.css" rel="stylesheet" media="screen">
 <link href="/resources/css/bootstrap.css" rel="stylesheet" media="screen">
 <link href="css/bootstrap.css" rel="stylesheet" media="screen">

Editar: Estoy usando el Servlet 2.5 porque a partir de ahora no puedo actualizar mi proyecto desde JBoss 5 a versiones más altas. JBoss5 ¿No es compatible con los servlets 3, y hacen eso?

@Configuration
@ComponentScan("com.mgage.mvoice")
public class MyAppWebConfig extends WebMvcConfigurerAdapter {
     public void addResourceHandlers(ResourceHandlerRegistry registry) {  
        // I tried these many combinations separately.

        ResourceHandlerRegistration resourceRegistration = registry
            .addResourceHandler("resources/**");
        resourceRegistration.addResourceLocations("/resources/**");
        registry.addResourceHandler("/css/**").addResourceLocations("/css/**");
        registry.addResourceHandler("/img/**").addResourceLocations("/img/**");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/**");
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("classpath:/resources/"); 
              // do the classpath works with the directory under webapp?
     }

}

estructura del proyecto

¿Fue útil?

Solución

Esto funcionó,

   registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");

y en los archivos JSP que me referí a los recursos estáticos como

<link href="resources/css/bootstrap.css" rel="stylesheet" media="screen">

Otros consejos

Supongo que es un poco tarde, sin embargo, me enfrenté a un problema similar recientemente. Después de varios días de lucha, finalmente resultó que mi despachado no se configuró para manejar la solicitud, por lo tanto, los recursos nunca se levantaron. Así que espero que otros encuentren útil esta respuesta.

Si el servlet de despachador para que le proporciona a su clase de configuración anteriormente, no se asigna a la raíz ("/"), pero a una palabra superior (por ejemplo, "/ datos /"), entonces podría enfrentar con el mismo problema. < / p>

Supongamos que tengo un mapeo como "/ Data / *" para mi servlet de despachador. Así que mis llamadas parecen

http://localhost:8080/myWebAppContext/data/command

y pensé que si tengo un mapeo de recursos, por ejemplo, "/ Contenido / ** / *", entonces tengo acceso a él como

http://localhost:8080/myWebAppContent/content/resourcePath

Pero no es cierto, debería usar

http://localhost:8080/myWebAppContent/data/content/resourcePath

en su lugar. Esto no estaba claro para mí, y como la mayoría de las muestras usan la raíz "/" para el mapeo del servlet del despachador, por lo que no fue un problema allí. Tras considerarlo más tarde, debería haberlo conocido antes: / Data / dice que el servicio de despachas debe evaluar la llamada, y el contenido / le indica al servlet que un controlador de recursos es el "controlador".

Pero quiero dejarlo muy claro en mi frontend (angularjs) si busco datos (a través de los servicios de descanso) o un contenido (devolviendo los textos lisos). Los datos provienen de una base de datos, pero el contenido proviene de los archivos (por ejemplo, documentos PDF). Por lo tanto, decidí agregar dos asignaciones al Servlet Dispatcher:

public class MidtierWebConfig implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext servletContext) throws ServletException {

    AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
    rootContext.register(MidtierAppConfig.class);

    servletContext.addListener(new ContextLoaderListener(rootContext));

    AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();
    dispatcherContext.register(MidtierDispatcherConfig.class);

    Dynamic netskolaDispatcher = servletContext.addServlet(
        "dispatcher",
        new DispatcherServlet(dispatcherContext)
    );
    netskolaDispatcher.setLoadOnStartup(1);
    netskolaDispatcher.addMapping("/data/*");
    netskolaDispatcher.addMapping("/content/*");
}

}

La clase MidtierAppConfig está vacía, pero la MidtierDispatchERCONFIG define los recursos estáticos:

@Configuration
@ComponentScan("my.root.package")
@EnableWebMvc
public class MidtierDispatcherConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
            .addResourceHandler("/courses/**/*")
            .addResourceLocations("/WEB-INF/classes/content/")
        ;
    }
}

Ahora, cuando quiero tener acceso a My @ Controller, utilizo el / Data / Prefijo, y cuando quiero acceder a mis recursos, utilizo el / Contenido / Prefijo. La advertencia es que si tengo una clase de @RequestMapping ("/ App"), que tiene un método @RequestMapping ("/ sobre"), luego tanto los datos / aplicación / aproximadamente como el contenido / aplicación / aproximadamente llamará ese método ( y sin intentar realmente, supongo que podría acceder a los recursos como / aplicaciones / cursos / cualquiera de las partes), porque el despachador se encuentra a ambos "datos /" y "contenido / contenido /", y analiza solo el resto de la URL ("Aplicación / aproximadamente "En ambos casos) para encontrar el @controller adecuado.

Independientemente, la solución actual que he alcanzado es lo suficientemente satisfactorio para mí, por lo que lo dejaré como es.

Esto funcionó para mí.Archivos disponibles en /resources/js/select.js.Tenga en cuenta que no está perdiendo la anotación de @EnableWebMvc ...

@EnableWebMvc
@EnableTransactionManagement
public class ApplicationContextConfig extends WebMvcConfigurerAdapter {

    @Bean(name = "viewResolver")
    public InternalResourceViewResolver getViewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
        .addResourceLocations("/resources/");
    }
}

Es posible simplificar la URI de la página web solo para contener el nombre de archivo de un recurso: <link href="bootstrap.css" rel="stylesheet" media="screen">
Una configuración apropiada podría ser como la siguiente:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("*.css").addResourceLocations("/resources/css/");
}

Spring Concatenados '/ Resources / CSS /' String con cualquier nombre de archivo extraído de URI para identificar la ubicación real de un recurso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top