MVC 패턴 - 적용

서블릿을 컨트롤러로 사용하고, JSP를 뷰로 사용해서 MVC 패턴을 적용해봅시다.

Model은 HttpServletRequest 객체를 사용합니다. request는 내부에 데이터 저장소를 가지고 있는데, request.setAttribute() , request.getAttribute() 를 사용하면 데이터를 보관하고, 조회할 수 있습니다.

그러니까 HttpServletRequest 객체를 Model 처럼 쓰는 것입니다. 컨트롤러에서는 setAttribute 로 값을 담고 뷰에서는 getAttribute 로 값을 꺼내는 것입니다.

참고

회원 등록 폼 - 컨트롤러

hello.servlet.web.servletmvc 패키지를 만들고 MvcMemberFormServlet 클래스를 만듭니다.

package hello.servlet.web.servletmvc;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "mvcMemberFormServlet", urlPatterns = "/servlet-mvc/members/new-form")
public class MvcMemberFormServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String viewPath = "/WEB-INF/views/new-form.jsp"; //...1
        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); //...2
        dispatcher.forward(request, response); //...3
    }
}

처음에는 멤버 폼을 보여주고 싶습니다. MVC 패턴은 항상 컨트롤러를 거쳐서 뷰로 들어갑니다. 그래서 컨트롤러에 요청이 다 들어와야 합니다.

이 때 MvcMemberFormServlet는 단순하게 JSP로 가주면 됩니다.

  1. JSP 경로를 담아줍니다.
  2. getRequestDispatcher()
  3. dispatcher.forward()

<aside> ❗ /WEB-INF

이전에는 그냥 .jsp를 붙이면 jsp파일을 호출할 수 있었습니다. 하지만 외부에서 직접적으로 부르지 않고 컨트롤러를 항상 거쳐서 불러오고 싶습니다.

그 때는 /WEB-INF 경로에 넣어주면 됩니다. 이것은 WAS서버의 룰입니다.

/WEB-INF 경로안에 JSP가 있으면 외부에서 직접 JSP를 호출할 수 없습니다.

참고

</aside>