2018. 6. 16. 17:33ㆍWeb/Spring
스프링에서 정적리소스 자원 사용하기(매핑),<mvc:resource>
어느때에 갑자기 jsp에서 작동하던 css, js 등의 정적 자원들이 적용이 안되는 경우가 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <!-- Processes application requests --> <servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> | cs |
이런 경우에 먹질 않는 경우가 많다는 것이다. 요즘은 RESTFUL한 웹페이지 개발이 많기때문에 보통 servlet url 매핑을 이와 같이 하는 경우가 많다. 보통 *.do와같은 url을 매핑하게되면 *.do 형식이 아닌 url로 들어오는 요청은 전부다 defaultHandler에게 넘겨버린다. (이 안에 jsp,js,css 등 정적 리소스들의 url매핑을 처리하게 된다.) *.do 면 문제가 안된다. 단순히 servlet은 이 형태로 들어오는 url만 처리하면 되기에, 하지만 위의 코드와 같이 servlet의 url 매핑을 걸 경우는 조금 다르다. /css/.. ,/js/.., resources/css/... 등등 jsp에서 정적 자원을 활용하기 위해 link를 걸거나 스크립트 태그안의 src 속성에 url을 넣게 되면 이 마저도 servlet 매핑에 걸리게 되는 것이다. 그럼 당연히 위와 같은 매핑에 대해 controller는 작성해 놓지 않기에 404 not found가 뜨게 되는 것이다. 이문제를 해결하는 방법이 있다.(방식 자체는 2~3개 있겠지만 여기서는 그 중 한가지 방법을 소개)
1 2 3 4 5 | <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js"></script> <script type="text/javascript" src="resources/js/app.js"></script> <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" href="resources/css/app.css"> | cs |
jsp 안에서 이런 자바 스크립트가 있다는 가정하에, 아무런 조치가 없다면 app.js , app.css 등은 404not found라는 응답이 발생할 것이다.
<webapp 디렉토리 구조>
1 2 | <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --> <mvc:resources mapping="/resources/**" location="/resources/" /> | cs |
servlet-context.xml 에 위와 같은 설정을 해줌으로써 /resources/** 로 들어오는 모든 요청은 ${webapproot}/resources/ 로 모두 매핑시켜버리겠다는 설정이다. 이로써 정적리소스는 문제 없이 사용이 가능하게 된다. 이 방법 말고도 아예 defaultServlet 자체를 선언하여 /resources/* 라는 url을 defaultServlet 이 처리하도록 명시할 수도 있다.
'Web > Spring' 카테고리의 다른 글
Springframework(스프링) p & c schema 사용하기 (0) | 2018.07.10 |
---|---|
Springframework(스프링) 빈 정의 상속 (0) | 2018.07.09 |
Spring - EmbeddedDatabase(스프링 내장형DB) (0) | 2018.06.16 |
Spring - Jsoup을 이용한 웹크롤링 (0) | 2018.05.07 |
Spring AOP를 이용한 XSS 공격 방지 (1) | 2018.05.06 |