Question

Mon maven printemps structure de répertoire du projet est présenté ci-dessous.Je suis à l'aide de Printemps-4 annotation en fonction de la configuration.J'ai configurer les ressources ci-dessous.J'ai essayé de nombreuses façons qui sont proposées dans de nombreux Stackoverflow questions et d'autres sites web

Printemps 4 chargement de ressources statiques

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

Mais les fichiers jsp n'a pas pu charger les ressources, tous les le contenu statique des demandes de retours d'erreur 404.J'ai essayé ces choses dans la 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">

EDIT:Je suis à l'aide de servlet 2.5 car à partir de maintenant je ne peut pas mettre à jour mon projet de JBoss 5 pour les versions supérieures.JBoss5 ne prennent pas en charge les servlets 3, et de faire que la matière?

@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

Était-ce utile?

La solution

Ceci a fonctionné,

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

et dans les fichiers JSP, j'ai évoqué les ressources statiques telles que

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

Autres conseils

Je suppose que c'est un peu en retard, mais je faisais face à un problème similaire, juste récemment. Après plusieurs jours de lutte, il s'est finalement avéré que mon DispatcherServlet n'a pas été configuré pour gérer la demande, les ressources n'ont donc jamais été levées. J'espère donc que les autres trouveront cette réponse utile.

Si le servlet Dispatcher à celui que vous donnez à votre classe de configuration ci-dessus est mappé non mappé de la racine ("/") mais à un mot supérieur (par exemple "/ données /"), vous pourriez être affronté avec le même problème. < / p>

Supposons que j'ai une cartographie comme "/ Data / *" pour mon servlet Dispatcher. Donc, mes appels ressemblent à

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

Et je pensais que si j'ai une cartographie des ressources par ex. "/ Contenu / ** / *", alors je l'ai accès comme

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

Mais ce n'est pas vrai, je devrais utiliser

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

à la place. Ce n'était pas clair pour moi et, étant donné que la plupart des échantillons utilisent la racine "/" pour la cartographie du servlet Dispatcher, ce n'était donc pas un problème là-bas. Après avoir examiné plus tard, j'aurais dû le savoir plus tôt - / Data / indique que le DispatcherServlet devrait évaluer l'appel et le contenu / raconte au servlet qu'un gestionnaire de ressources est le "contrôleur".

Mais je veux le rendre très clair dans mon frontend (angularjs) si je cherche des données (via les services de repos) ou un contenu (des textes simples de retour). Les données proviennent d'une base de données, mais le contenu provient des fichiers (par exemple, des documents PDF). Par conséquent, j'ai décidé d'ajouter deux mappages au 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 classe MidtitierAppConfig est vide, mais le MidtitierDispatcherConfig définit les ressources statiques:

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

Maintenant, lorsque je veux avoir accès à mon contrôleur @, j'utilise le / Data / Prefix, et lorsque je veux accéder à mes ressources, j'utilise le / le contenu / le préfixe. La mise en garde est que si j'ai une classe @requestMapping ("/ app") qui a une méthode @RequestMapping ("/"), alors la donnée / l'application / environ et le contenu / l'application appellera simplement cette méthode ( et sans essayer réellement, je suppose que je pourrais accéder aux ressources telles que / App / Cours / ShapPath aussi), car le répartiteur ligne à la fois sur "Données /" et "Contenu /" et analyse uniquement le reste de l'URL ("App / About "Dans les deux cas) pour trouver la bonne @Controller.

Quoi qu'il en soit, la solution actuelle que j'ai prise est suffisamment satisfaisante pour moi, alors je le laisserai tel qu'il est.

Cela a fonctionné pour moi.Les fichiers disponibles à /resources/js/select.js.Attention à ce que vous ne manquant pas de @EnableWebMvc annotation....

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

Il est possible de simplifier l'URI de la page Web juste de contenir le nom de fichier d'une ressource:
<link href="bootstrap.css" rel="stylesheet" media="screen">
Une configuration appropriée peut être la suivante:

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

printemps concaténate '/ Ressources / CSS /' String avec n'importe quel nom de fichier extrait de URI pour identifier l'emplacement réel d'une ressource.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top