@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
라는 뷰 리졸버를 자동으로 등록하는데 , 이때 application.properties
에 등록한 spring.mvc.view.prefix
, spring.mvc.view.suffix
설정 정보를 사용해서 등록한다.
스프링부트가 자동으로 등록하는 뷰 리졸버
(실제로는 더 많지만, 생략)
1 = BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환한다. (예: 엑셀 파일 생성 기능에 사용)
2 = InternalResourceViewResolver : JSP를 처리할 수 있는 뷰를 반환한다.
1.핸들러 어뎁터 호출
ModelAndView
를 통해 new-form
이라는 논리 뷰 이름을 획득2. ViewResolver 호출
new-form
이라는 논리 이름 뷰를 통해 뷰리졸버를 순차적으로 호출한다.BeanNameViewResolver
는 new-form
이라는 이름의 스프링 빈으로 등록된 뷰를 찾을 수 없어 , 다음 뷰 리졸버를 호출한다.InternalResourceViewResolver
가 호출된다.3.InternalResourceViewResolver
InternalResourceView
를 반환한다.4.뷰 - InternalResourceView
5. view.render()
InternalResourceView
는 forward()
를 사용해서 랜더링한다.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);
}