복붙노트

[SPRING] 스프링 4 - 정적 리소스를 해결하지 않는 addResourceHandlers

SPRING

스프링 4 - 정적 리소스를 해결하지 않는 addResourceHandlers

필자의 Spring 프로젝트 디렉토리 구조는 아래와 같다. Spring 4 주석 기반 구성을 사용하고 있습니다. 아래의 리소스를 구성합니다. 나는 많은 Stackoverflow 질문 및 다른 웹 사이트에서 제안하는 많은 방법을 시도했다.

스프링 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">

편집 : 이제 JBoss 5에서 상위 버전으로 프로젝트를 업그레이드 할 수 없으므로 서블릿 2.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?
     }

}

해결법

  1. ==============================

    1.이 일은,

    이 일은,

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

    jsp 파일에서 정적 리소스를 참조했습니다.

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

    2.조금 늦은 것 같아요. 그러나 최근에 비슷한 문제에 직면했습니다. 레슬링의 며칠 후, 마침내 내 DispatcherServlet이 요청을 처리하도록 구성되지 않았으므로 리소스가 절대로 조회되지 않았습니다. 그래서 다른 사람들이이 답변을 유용하게 사용할 수 있기를 바랍니다.

    조금 늦은 것 같아요. 그러나 최근에 비슷한 문제에 직면했습니다. 레슬링의 며칠 후, 마침내 내 DispatcherServlet이 요청을 처리하도록 구성되지 않았으므로 리소스가 절대로 조회되지 않았습니다. 그래서 다른 사람들이이 답변을 유용하게 사용할 수 있기를 바랍니다.

    위의 구성 클래스를 제공하는 Dispatcher 서블릿이 루트 ( "/")가 아니라 최상위 단어 (예 : "/ data /")에 매핑되는 경우 동일한 문제가 발생할 수 있습니다.

    디스패처 서블릿에 대한 매핑이 "/ data / *"라고 가정합니다. 그래서 내 전화는 다음과 같이 보입니다.

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

    예를 들어 리소스 매핑이있는 경우 "/ content / ** / *", 다음과 같이 액세스 할 수 있습니다.

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

    하지만 사실이 아니에요.

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

    대신. 이것은 나에게 명확하지 않으며 대부분의 샘플은 디스패처 서블릿의 매핑에 루트 "/"를 사용하므로 문제가되지 않습니다. 나중에 고려해야 할 것은 / data /는 DispatcherServlet이 호출을 평가하고 content /가 자원 핸들러가 "컨트롤러"임을 서블릿에 알려주는 것입니다.

    하지만 나는 (REST 서비스를 통해) 데이터를 찾든, (평문을 반환하는) 콘텐트를 찾을지를 프론트 엔드 (angularJs)에서 명확하게하고 싶다. 데이터는 데이터베이스에서 가져 오지만 내용은 파일 (예 : 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 ( "/ about") 메서드가있는 @RequestMapping ( "/ app") 클래스가 있으면 data / app / about 및 content / app / about 모두 해당 메서드를 호출한다는 점에주의해야합니다 ( Dispatcher가 "data /"및 "content /"를 모두 청취하고 나머지 URL ( "app / about") 만 분석하므로 실제로 / app / courses / whatEverPath로 리소스에 액세스 할 수도 있습니다. "두 경우 모두) 적절한 @Controller를 찾으십시오.

    그럼에도 불구하고 내가 도달 한 현재의 해결책은 충분히 만족 스럽기 때문에 그대로 두겠습니다.

  3. ==============================

    3.이것은 나를 위해 일했다. /resources/js/select.js에서 사용할 수있는 파일. @EnableWebMvc 주석이 누락되지 않았는지 조심하십시오.

    이것은 나를 위해 일했다. /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/");
        }
    }
    
  4. ==============================

    4.리소스의 파일 이름을 포함하기 위해 웹 페이지의 URI를 단순화하는 것이 가능합니다. 적절한 구성은 다음과 같을 수 있습니다.

    리소스의 파일 이름을 포함하기 위해 웹 페이지의 URI를 단순화하는 것이 가능합니다. 적절한 구성은 다음과 같을 수 있습니다.

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

    Spring은 '/ resources / css /'문자열을 URI에서 추출한 파일 이름과 연결하여 실제 자원 위치를 식별합니다.

  5. from https://stackoverflow.com/questions/25061237/spring-4-addresourcehandlers-not-resolving-the-static-resources by cc-by-sa and MIT license