====== Spring MVC ====== * [[https://src.springsource.org/svn/spring-samples/mvc-ajax/trunk/|Spring MVC-AJAX Samples]] * [[https://github.com/rstoyanchev/spring-mvc-31-demo|rstoyanchev/spring-mvc-31-demo]] ===== ===== 아래와 같은 형태로 정적 파일을 제공해 줄 수 있다. 정적 리소스의 경로는 ''/resources-버전/images/test.gif'' 형태가 된다. 이 역할을 하는 핸들러는 [[http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.html|ResourceHttpRequestHandler]] 이다. ''*.ico'' 파일 처리 못하는 현상은 ''web.xml''에 ico의 MIME 타입을 지정해주면 된다. [[http://stackoverflow.com/questions/5261645/spring-mvcresource-not-finding-ico-files|java - Spring mvc:resource not finding *.ico files - Stack Overflow]] 참조 ico image/vnd.microsoft.icon ===== ===== * ''''를 사용할 경우에는 필요없다. * ''DispatcherServlet''이 처리하지 못한 요청을 서블릿 컨테이너의 DefaultServlet에게 넘겨주는 역할을 하는 핸들러이다. [[http://toby.epril.com/?p=1107|[토스3] 스프링 3.0.4 를 이용해서 UrlRewriteFilter없이 깔끔한 URL을 만들기 » Toby's Epril]] 참조. > 일단 DispatcherServlet을 그냥 /에 매핑한다. jsp와 같은 특정 확장자를 가진 URL말고는 모두 DispatcherServlet이 다 받는다. 일단 스프링의 기본 등록된 핸들러 매핑 전략을 이용해서 컨트롤러를 매핑해본다. @Controller가 담당하는 URL이라면 그리로 넘어갈거고. 그런데 그러다보면 /js/jquery.js 처럼 컨트롤러에 매핑안되는 URL이 나올 것이다. 이런 나머지 모든 URL은 이 내부적으로 등록해주는 DefaultServletHttpRequestHandler이 담당한다. 이 핸들러(컨트롤러)는 /**로 매핑되어있다. 대신 핸들러 매핑 우선순위가 가장 낮다. 따라서 애노테이션 매핑 등등을 거쳐서 다 실패한 URL만 넘어온다. 그리고 DefaultServletHttpRequestHandler는 이 요청을 자신이 직접 스태틱 리소스를 읽어서 처리하는 것이 아니라, 원래 서버가 제공하는 디폴트 서블릿으로 넘겨버린다. 그러면 서버의 기본 디폴트 서블릿이 동작해서 스태틱리소스를 처리해버리는 것이다. 일단 스프링이 다 받고 스프링이 처리 못하는 건 다시 서버의 디폴트 서블릿으로 넘긴다는 아이디어이다. ===== PathVariable 잘림 현상 ===== * @PathVariable을 사용하는데 해당 값 중간에 점(.)이 있을 경우 점 앞까지만 인식하고 뒤로는 인식하지 못하는 현상이 있다. * [[http://stackoverflow.com/questions/3526523/spring-mvc-pathvariable-getting-truncated|java - Spring MVC @PathVariable getting truncated]] 해결책 정리. * ''@RequestMapping("/{value:.+}")'' 형태. ":" 뒤에 정규표현식 넣는 것임. * Spring Framework 3.0.x에서 해당 값 뒤에 다른 URL 이 더 올경우 인식하지 못하는 현상이 있음. 예를 들면 /valuesblah/delete 이런식일 경우 뒤에 /delete를 인식 못함. * useDefaultSuffixPattern 기술 - 해보니까 안되는데? ===== URL이 두번 반복되고 Controller 매핑을 못찾는 현상 ===== * 요청 URL이 두 번 반복되는 듯 보이는 현상이 발생한다면 그것은 응답 객체에 올바른 View를 지정하지 않아서, Spring이 URL을 View로 간주하고 리다이렉트를 시도한 것이다. * 예를들어 ''/api/resources/1''로 요청을 보냈는데 ''No mapping found for HTTP request with URI [/api/resources/1/api/resources/1] in DispatcherServlet with name 'servlet''' 같은 오류가 발생했다면 이는 ''@ResponseBody''를 지정하지 않고 View가 아닌 일반 객체를 리턴했기 때문이다. ===== Date / Time 파라미터 ===== * [[http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/format/annotation/DateTimeFormat.html|@DateTimeFormat]] 으로 요청 파라미터 포맷을 정할 수 있다. @RequestParam(value = "registerDate") @DateTimeFormat(pattern = "yyyy/MM/dd") Date registerDate * 파라미터 DTO 클래스등을 지정할 경우 클래스의 필드에 지정할 수도 있다. ===== CommonRequestLoggingFilter ===== * [[http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/filter/CommonsRequestLoggingFilter.html|CommonRequestLoggingFilter]] * 요청을 로깅함. ===== MdcLoggingInterceptor ===== * [[java:slf4j:mdc|Slf4j MDC]]로 컨트롤러 정보를 저장해 두고, 그 컨트롤러의 호출 스택내에서 일어난 로그에 컨트롤러 정보를 함께 찍어줄 수 있다. * [[https://gist.github.com/kwon37xi/6e7aa448541d32faff105e5d53ab4a90|MdcLoggingInterceptor.java]] ===== AbstractRequestLoggingFilter ===== * [[https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/filter/AbstractRequestLoggingFilter.html|AbstractRequestLoggingFilter]] 를 사용하여 요청 파리미터 등의 정보를 로깅할 수 있다. ===== Command Object ===== * ''@RequestParam'' 를 나열하기 보다는 이를 한 묶음으로 한 클래스 객체를 만드는게 낫다. * 이 경우 기본 생성자와 Setter 가 필수이다. ===== HttpMessageConverters ===== * [[https://www.baeldung.com/spring-httpmessageconverter-rest|Http Message Converters with the Spring Framework | Baeldung]] ===== 기타 ===== * [[springframework:mvc:handlermethodargumentresolver|Spring @MVC HandlerMethodArgumentResolver]] * [[springframework:mvc:webargumentresolver|Spring @MVC WebArgumentResolver]] * [[springframework:mvc:modelandviewresolver|Spring @MVC ModelAndViewResolver]] * [[http://www.baeldung.com/spring-mvc-content-negotiation-json-xml|Spring MVC Content Negotiation | Baeldung]] * [[http://www.baeldung.com/spring-new-requestmapping-shortcuts|Spring @RequestMapping New Shortcut Annotations | Baeldung]] * [[https://www.javacodegeeks.com/2018/06/domain-objects-spring-mvc.html|Dealing with Domain Objects in Spring MVC | Java Code Geeks - 2018]] * [[https://dzone.com/articles/spring-web-mvc-annotation-examples|Spring Web MVC Annotation Examples - DZone Java]]