[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.이 일은,
이 일은,
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
jsp 파일에서 정적 리소스를 참조했습니다.
<link href="resources/css/bootstrap.css" rel="stylesheet" media="screen">
-
==============================
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.이것은 나를 위해 일했다. /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.리소스의 파일 이름을 포함하기 위해 웹 페이지의 URI를 단순화하는 것이 가능합니다. 적절한 구성은 다음과 같을 수 있습니다.
리소스의 파일 이름을 포함하기 위해 웹 페이지의 URI를 단순화하는 것이 가능합니다. 적절한 구성은 다음과 같을 수 있습니다.
@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("*.css").addResourceLocations("/resources/css/"); }
Spring은 '/ resources / css /'문자열을 URI에서 추출한 파일 이름과 연결하여 실제 자원 위치를 식별합니다.
from https://stackoverflow.com/questions/25061237/spring-4-addresourcehandlers-not-resolving-the-static-resources by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 세터 DI 대. DI 빌더는 봄? (0) | 2018.12.07 |
---|---|
[SPRING] YamlPropertiesFactoryBean을 사용하여 Spring Framework 4.1을 사용하여 YAML 파일을로드하는 방법? (0) | 2018.12.07 |
[SPRING] 자바 설정으로 Spring에서 404 에러 리디렉션 (0) | 2018.12.07 |
[SPRING] 스프링 MVC 컨트롤러의 JSON 매개 변수 (0) | 2018.12.07 |
[SPRING] 개체 목록을 thymeleaf에 바인딩하는 방법은 무엇입니까? (0) | 2018.12.07 |