it-swarm.com.de

Spring 4 - addResourceHandlers löst die statischen Ressourcen nicht auf

Meine Maven Spring-Projektverzeichnisstruktur ist unten dargestellt. Ich verwende die auf Anmerkungen basierende Konfiguration von Spring-4. Ich konfiguriere die Ressourcen wie folgt. Ich habe viele Möglichkeiten ausprobiert, die in vielen Stackoverflow-Fragen und auf anderen Websites vorgeschlagen werden 

Spring 4 lädt statische Ressourcen

http://imwill.com/spring-mvc-4-add-static-resources-by-annotation/#.U5GZlXKs9i4

Die jsp-Dateien konnten die Ressourcen jedoch nicht laden. Alle statischen Inhaltsanforderungen geben den Fehler 404 zurück. Ich habe diese Dinge in jsp versucht, 

 <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">

BEARBEITEN: Ich verwende Servlet 2.5, da ich mein Projekt ab sofort nicht von JBoss 5 auf höhere Versionen aktualisieren kann. JBoss5 unterstützt keine Servlets 3, und ist das wichtig?

@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?
     }

}

Project structure

24

das hat funktioniert, 

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

und in den JSP-Dateien verwies ich auf die statischen Ressourcen wie 

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

Ich denke, es ist ein bisschen spät, aber ich hatte kürzlich ein ähnliches Problem. Nach einigen Tagen des Wrestlings stellte sich schließlich heraus, dass mein DispatcherServlet nicht für die Bearbeitung der Anforderung konfiguriert war. Daher wurden die Ressourcen nie nachgeschlagen. Ich hoffe also, dass andere diese Antwort nützlich finden werden.

Wenn das Dispatcher-Servlet, zu dem Sie Ihre obige Konfigurationsklasse angeben, nicht dem Stammverzeichnis ("/"), sondern einem obersten Word (z. B. "/ data /") zugeordnet ist, könnte das gleiche Problem auftreten.

Angenommen, ich habe eine Zuordnung als "/ data/*" für mein Dispatcher-Servlet. So sehen meine Anrufe aus

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

und ich dachte, wenn ich eine Ressourcenzuordnung habe, z. "/ content/**/*", dann habe ich als Zugriff darauf

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

aber es stimmt nicht, sollte ich verwenden

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

stattdessen. Dies war für mich nicht klar, und da die meisten Beispiele das Root "/" für die Zuordnung des Dispatcher-Servlets verwenden, war es dort kein Problem. Bei späteren Überlegungen hätte ich es früher wissen sollen -/data/teilt mit, dass das DispatcherServlet den Aufruf auswerten sollte, und der Inhalt/sagt dem Servlet, dass ein Ressourcenhandler der "Controller" ist.

Ich möchte aber in meinem Frontend (angleJs) deutlich machen, ob ich nach Daten (über die Dienste REST) oder nach einem Inhalt (Klartext zurückgeben) suche. Die Daten stammen aus einer Datenbank, der Inhalt stammt jedoch aus Dateien (z. B. PDF-Dokumente). Daher habe ich beschlossen, dem Dispatcher-Servlet zwei Zuordnungen hinzuzufügen:

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/*");
}

}

Die MidtierAppConfig-Klasse ist leer, aber die MidtierDispatcherConfig definiert die statischen Ressourcen:

@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/")
        ;
    }
}

Wenn ich nun auf meine @ Controller zugreifen möchte, verwende ich das Präfix/data /, und wenn ich auf meine Ressourcen zugreifen möchte, verwende ich das Präfix/content /. Wenn ich jedoch eine @RequestMapping-Klasse ("/ app") mit einer @RequestMapping-Methode ("/ about") habe, rufen sowohl die data/app/about als auch der content/app/about genau diese Methode auf ( und ohne es tatsächlich zu versuchen, schätze ich, dass ich möglicherweise auf die Ressourcen als/app/courses/whatEverPath zugreifen kann, da der Dispatcher sowohl auf "data /" als auch auf "content /" verweist und nur den Rest der URL ("app/about") analysiert "in beiden Fällen), um den richtigen @Controller zu finden.

Unabhängig davon ist die derzeitige Lösung, die ich erreicht habe, für mich befriedigend genug, sodass ich sie so belassen werde.

12
Ivan Ketler

Das hat bei mir funktioniert. Dateien verfügbar unter /resources/js/select.js. Achten Sie darauf, dass Sie die @EnableWebMvc-Anmerkung nicht fehlen. 

@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/");
    }
}
6
kundan

Es ist möglich, den URI der Webseite zu vereinfachen, um den Dateinamen einer Ressource zu enthalten:
<link href="bootstrap.css" rel="stylesheet" media="screen">
Eine geeignete Konfiguration könnte folgende sein: 

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

Spring verkettet die Zeichenfolge/resources/css/mit einem beliebigen Dateinamen, der aus dem URI extrahiert wurde, um den tatsächlichen Speicherort einer Ressource zu ermitteln.

0
beemaster