사용자 도구

사이트 도구


springframework:mvc

문서의 이전 판입니다!


Spring MVC

@ModelAttribute와 redirect

컨트롤러에 @ModelAttribute 메소드가 지정된 상태에서 redirect를 수행하면 리다이렉트 주소 뒤에 모든 모델 어트리뷰트가 파라미터로 붙는 현상이 발생한다. 이 때 해결책은 Model 객체의 모든 내용을 삭제한 뒤에 리다이렉트하면 된다. java - How do I prevent Spring 3.0 MVC @ModelAttribute variables from appearing in URL? - Stack Overflow

// ModelMap 객체일 경우
model.clear();
 
// Model 객체일 경우
model.asMap().clear();

Spring 3.1의 경우 RedirectAttributes를 사용하면 이런 작업이 불필요하다.

<mvc:resources>

아래와 같은 형태로 정적 파일을 제공해 줄 수 있다. 정적 리소스의 경로는 /resources-버전/images/test.gif 형태가 된다.

이 역할을 하는 핸들러는 ResourceHttpRequestHandler 이다.

<mvc:resources
  mapping="/resources-#{T(static.auto.VersionGenerator).VERSION}/**"
  location="/WEB-INF/static_resources/" cache-period="캐시초" />

*.ico 파일 처리 못하는 현상은 web.xml에 ico의 MIME 타입을 지정해주면 된다. java - Spring mvc:resource not finding *.ico files - Stack Overflow 참조

<mime-mapping>
    <extension>ico</extension>
    <mime-type>image/vnd.microsoft.icon</mime-type>
</mime-mapping>

<mvc:default-servlet-handler/>

일단 DispatcherServlet을 그냥 /에 매핑한다. jsp와 같은 특정 확장자를 가진 URL말고는 모두 DispatcherServlet이 다 받는다. 일단 스프링의 기본 등록된 핸들러 매핑 전략을 이용해서 컨트롤러를 매핑해본다. @Controller가 담당하는 URL이라면 그리로 넘어갈거고. 그런데 그러다보면 /js/jquery.js 처럼 컨트롤러에 매핑안되는 URL이 나올 것이다. 이런 나머지 모든 URL은 <mvc:default-servlet-handler/>이 내부적으로 등록해주는 DefaultServletHttpRequestHandler이 담당한다. 이 핸들러(컨트롤러)는 /**로 매핑되어있다. 대신 핸들러 매핑 우선순위가 가장 낮다. 따라서 애노테이션 매핑 등등을 거쳐서 다 실패한 URL만 넘어온다. 그리고 DefaultServletHttpRequestHandler는 이 요청을 자신이 직접 스태틱 리소스를 읽어서 처리하는 것이 아니라, 원래 서버가 제공하는 디폴트 서블릿으로 넘겨버린다. 그러면 서버의 기본 디폴트 서블릿이 동작해서 스태틱리소스를 처리해버리는 것이다. 일단 스프링이 다 받고 스프링이 처리 못하는 건 다시 서버의 디폴트 서블릿으로 넘긴다는 아이디어이다.

PathVariable 잘림 현상

  • @PathVariable을 사용하는데 해당 값 중간에 점(.)이 있을 경우 점 앞까지만 인식하고 뒤로는 인식하지 못하는 현상이 있다.
  • @RequestMapping(“/{value:.+}”) 형태. “:” 뒤에 정규표현식 넣는 것임.
    • Spring Framework 3.0.x에서 해당 값 뒤에 다른 URL 이 더 올경우 인식하지 못하는 현상이 있음. 예를 들면 /valuesblah/delete 이런식일 경우 뒤에 /delete를 인식 못함.
  • useDefaultSuffixPattern 기술 - 해보니까 안되는데?
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
        <property name="useDefaultSuffixPattern" value="false" />
    </bean>

URL이 두번 반복되고 Controller 매핑을 못찾는 현상

  • 요청 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가 아닌 일반 객체를 리턴했기 때문이다.

기타

springframework/mvc.1422956910.txt.gz · 마지막으로 수정됨: 2015/02/03 18:48 저자 kwon37xi