이번에는 RestController가 아닌 View가 있는 경우를 살펴본다.
@Controller
public class HelloController {
@Autowired
HelloService helloService;
@GetMapping("/hello")
public @ResponseBody String hello() {
return "Hello, " + helloService.getName();
}
@GetMapping("/sample")
public String sample(){
return "/WEB-INF/sample.jsp";
}
}
첫번째 메소드는 @ResponseBody를 가지고 문자열을 반환하고, 두번째 메소드는 @ResponseBody 없이 그냥 문자열을 반환한다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>Hello Spring MVC!</h2>
</body>
</html>
doDispatch -> mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
첫번째 메소드에 해당하는 요청을 보내면 ModelAndView가 null이 되는데 두번째 메소드에 해당하는 요청을 보내면 ModelAndView가 null이 아니고, /WEB-INF/sample.jsp가 들어오게 된다. 그러면 View 객체에 모델 객체를 바인딩해서 뷰를 렌더링한다.
DispatcherServlet 동작 순서
아무런 설정을 하지 않아도 DispatcherServlet이 기본적으로 등록한 기본 전략인 BeanNameUrlHandlerMapping, RequestMappingHandlerMapping 두 개의 HandlerMapping이 있다. 지금까지 RequestMappingHandlerMapping을 살펴봣으니 BeanNameUrlHandlerMapping을 살펴보자.
Dispatcher.class
doService -> doDispatch -> mappedHandler = getHandler(processedRequest); (핸들러를 찾아오는 부분)
HandlerMapping
@org.springframework.stereotype.Controller("/simple")
public class SimpleController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
return new ModelAndView("/WEB-INF/simple.jsp");
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>Hello Simple MVC!</h2>
</body>
</html>
아무런 설정을 하지 않아도 DispatcherServlet이 기본적으로 등록한 기본 전략인 HttpRequestHandlerAdpater, SimpleControllerHandlerAdpater, RequestMappingHandlerAdapter 세 개의 HandlerAdpater가 있다. 이 경우에 핸들러를 실행시키는 HandlerAdpater는 SimpleControllerHandlerAdapter가 된다.
doDispatch -> HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
HandlerAdapter
doDispatch -> mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
참고