뷰 리졸버에 대해 자세히 알아보았다.

package hello.servlet.web.springmvc.old;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@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");
    }
}

이전 코드의 반환을 null이 아닌 ModelAndView를 생성하여 논리 주소를 넣어서 반환하였다.

정상 호출되지만,  Whitelabel Error Page오류가 발생한다.

 

application.properties에 

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

이 코드를 추가하면 된다.

스프링 부트는 InternalResourceViewResolver라는 뷰 리졸버를 자동으로 등록하는데, 이때 application.properties에 등록한

위의 설정정보를 사용해서 등록한다.

 

동작 방식

1. 핸들러 어댑터 호출

  핸들러 어댑터를 통해 new-form이라는 논리 뷰 이름을 획득한다.

 

2. ViewResolver 호출

  new-form이라는 뷰 이름으로 viewResolver를 순서대로 호출한다.

  BeanNameViewResolver는 new-form이라는 이름의 스프링 빈으로 등록된 뷰를 찾아야 하지만 없다.

  InternalResourceViewResolver가 호출된다.

 

3. InternalResourceViewResolver

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

 

4. 뷰 - IntervalResourceView

  internalResourceView는 JSP 포워드를 호출해서 처리할 수 있는 경우에 사용한다.

 

5. view.render()

  view.render()가 호출되고 InternalResourceView는  forward()를 사용해서 JSP를 실행한다.

+ Recent posts