본문 바로가기

Spring/Spring MVC

(SERVLET) DispatcherServlet(2) - view가 있는 경우

 

Cotroller에 jsp 경로(문자열)를 리턴하는 GetMapping 추가

@GetMapping("/sample")
public String sample() {
    return "WEB-INF/sample.jsp";
}

sample.jsp 추가

<%--
  Created by IntelliJ IDEA.
  User: junwoochoi
  Date: 2020/01/18
  Time: 4:11 오후
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h2>Hello Spring MVC!</h2>
</body>
</html>

 

handlerMapping은 RequestMappingHandlerMapping을 사용한다.

 

 

이전과의 차이는 modelandview가 null이 아니라는 것이다. (@ResponseBody를 리턴하는 경우는 ModelAndView가 null이다.)


또 다른 전략 사용

ModelAndView를 리턴하는 새로운 Controller 생성

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

 해당 전략은 BeanNameUrlHandlerMapping을 사용한다.

또한 SimpleControllerHandlerAdapter를 사용한다. - Contoller interface를 구현해서 만든 핸들러를 처리할 수 있는

HandlerAdapter이다.

 

여기서 ViewResolver는 return 받은 view 이름을 실제 부로 변환한다.


DispatcherServlet 동작 순서

  1. 요청을 분석한다. (로케일, 테마, 멀티파트 등)

  2. (핸들러 맵핑에게 위임하여) 요청을 처리할 핸들러를 찾는다.  - DispatcherServlet은 기본적으로 구개의 핸들러를 제공한다.

  3. (등록되어 있는 핸들러 어댑터 중에) 해당 핸들러를 실행할 수 있는 “핸들러 어댑터”를 찾는다.

  4. 찾아낸 “핸들러 어댑터”를 사용해서 핸들러의 응답을 처리한다.

  • 핸들러의 리턴 값을 보고 어떻게 처리할지 판단한다.

  • 뷰 이름에 해당하는 뷰를 찾아서 모델 데이터를 랜더링 한다.

  • @ResponseEntity가 있다면 Converter를 사용해서 응답 본문을 만들고.

  1. (부가적으로) 예외가 발생했다면, 예외 처리 핸들러에 요청 처리를 위임한다.

  2. 최종적으로 응답을 보낸다.