SpringMVC - 뷰 리졸버

hangs·2022년 9월 28일
0
@Component("/springmvc/old-controller")
  public class OldController implements Controller {
@Override
      public ModelAndView handleRequest(HttpServletRequest request,
  HttpServletResponse response) throws Exception {
          System.out.println("OldController.handleRequest");
          return new ModelAndView("new-form");
      }
 }

다음과 같은 코드를 실행하면 "OldController.handleRequest"는 잘 출력되지만 , Whitelabel Error Page 오류가 발생한다. 즉 뷰를 찾지 못한다는 것이다.

application.propoerties

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

위의 다음과 같은 코드를 추가하면 뷰를 찾게 된다.


**뷰 리졸버 - InternalResourceViewResolver**

스프링 부트는 InternalResourceViewResolver 라는 뷰 리졸버를 자동으로 등록하는데 , 이때 application.properties에 등록한 spring.mvc.view.prefix, spring.mvc.view.suffix 설정 정보를 사용해서 등록한다.



뷰 리졸버 동작 방식

스프링부트가 자동으로 등록하는 뷰 리졸버
(실제로는 더 많지만, 생략)
1 = BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환한다. (예: 엑셀 파일 생성 기능에 사용)
2 = InternalResourceViewResolver : JSP를 처리할 수 있는 뷰를 반환한다.

1.핸들러 어뎁터 호출

  • 핸들러 어뎁터를 통해 반환된 ModelAndView를 통해 new-form이라는 논리 뷰 이름을 획득

2. ViewResolver 호출

  • new-form이라는 논리 이름 뷰를 통해 뷰리졸버를 순차적으로 호출한다.
  • BeanNameViewResolvernew-form이라는 이름의 스프링 빈으로 등록된 뷰를 찾을 수 없어 , 다음 뷰 리졸버를 호출한다.
  • 결국 InternalResourceViewResolver 가 호출된다.

3.InternalResourceViewResolver

  • 이 뷰 리졸버는 InternalResourceView를 반환한다.

4.뷰 - InternalResourceView

5. view.render()

  • InternalResourceViewforward()를 사용해서 랜더링한다.

InternalResourceView.java

@Override
	protected void renderMergedOutputModel(
			Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
            .....
            
            else {
			// Note: The forwarded resource is supposed to determine the content type itself.
			if (logger.isDebugEnabled()) {
				logger.debug("Forwarding to [" + getUrl() + "]");
			}
			rd.forward(request, response);
		}
        

Reference

0개의 댓글