Вопрос

Структура каталогов моего проекта Maven Spring показана ниже.Я использую конфигурацию на основе аннотаций Spring-4.Я настраиваю ресурсы, как показано ниже.Я пробовал много способов, которые предлагаются во многих вопросах Stackoverflow и на других веб-сайтах.

Spring 4 загружает статические ресурсы

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

Но файлы jsp не смогли загрузить ресурсы, все запросы статического контента возвращают ошибку 404.Я пробовал эти вещи в 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">

РЕДАКТИРОВАТЬ:Я использую сервлет 2.5, потому что на данный момент я не могу обновить свой проект с JBoss 5 до более поздних версий.JBoss5 не поддерживает сервлеты 3, и имеет ли это значение?

@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

Это было полезно?

Решение

Это сработало,

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

и в файлах JSP я сослался на статические ресурсы, такие как

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

Другие советы

Я думаю, это немного поздно, однако я столкнулся с подобной проблемой совсем недавно. После нескольких дней борьбы, наконец, оказалось, что мой DispatcherServlet не был настроен для обработки запроса, поэтому ресурсы никогда не смотрели. Так что я надеюсь, что другие найдут этот ответ полезным.

Если сервлете диспетчера к тому, что вы даете указанное выше класс конфигурации, сопоставлен не к корне («/»), но к главным слову (например, «/ Data /»), то вы можете столкнуться с той же проблемой. < / P >.

Предположим, у меня есть сопоставление как «/ Data / *» для моего диспетчера сервлета. Так что мои звонки выглядят как

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

И я подумал, что если у меня будет отображение ресурсов E.g. «/ Content / ** / *», то у меня есть доступ к нему, так как

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

Но это не так, я должен использовать

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

вместо этого. Это было не ясно для меня, и, поскольку большинство образцов используют корня «/» для сопоставления сервлета диспетчера, поэтому там не было проблемой. При рассмотрении позже я должен был знать его ранее - / Data / Clinks, что DispatcherServlet должен оценить вызов, а содержимое / сообщает сервлете, что обработчик ресурса является «контроллером».

Но я хочу сделать это очень понятно в моем интерфейсе (Angularjs), ищите ли я для данных (через остальные сервисы) или контент (возвращающиеся тексты). Данные поступают из базы данных, но содержание исходит из файлов (например, документы E.g. PDF). Поэтому я решил добавить два сопоставления к сервлете диспетчера:

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

}
.

класс MidtierAppConfig пуст, но Midtierdispatcherconfig определяет статические ресурсы:

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

Теперь, когда я хочу получить доступ к моему контроллеру @ контроллера, я использую / data / prefix, и когда я хочу получить доступ к моим ресурсам, я использую / content / Prefix. Уже в том, что если у меня есть класс @RequeStmapping («/ app»), который имеет метод @RequeStmapping («/ about»), а данные / приложение / о том, а содержимое / приложение / о вызовет только этот метод ( И без на самом деле попробовать, я думаю, я тоже могу получить доступ к ресурсам AS / App / Courses / WhatshatePath тоже), потому что диспетчер пересекает как «данные /», так и «контент /», и анализирует только остальную часть URL («приложение / о «В обоих случаях) найти правильный @controller.

Независимо от того, текущее решение, которое я достиг, это удовлетворительно для меня, поэтому я оставлю это как оно есть.

Это сработало для меня.Файлы доступны по адресу /resources/js/select.js.Смотри, чтобы ты не пропал @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/");
    }
}

Можно упростить URI веб-страницы, чтобы содержать имя файла ресурса: <link href="bootstrap.css" rel="stylesheet" media="screen">
Подходящая конфигурация может быть в следующем:

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

Весенние конкатенаты / ресурсы / CSS / 'string с любым именем файла, извлеченные из URI, чтобы определить фактическое местоположение ресурса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top