■ View 분리 -v2
모든 컨트롤러에서 뷰로 이동하는 부분에 중복이 발생하고 깔끔 X
뷰를 처리할 수 있는 View 객체를 생성하자- ControllerV2의 반환 타입은 MyView이다.
- 프론트 컨트롤러의 호출 결과 반환 받은 MyView 객체의 render()를 호출하면 forward 로직을 수행해서 JSP가 실행
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
public class MyView {
private String viewPath;
public MyView(String viewPath) {
this.viewPath = viewPath;
}
public void render(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
import hello.servlet.domain.member.Member;
import hello.servlet.domain.member.MemberRepository;
import hello.servlet.web.frontcontroller.MyView;
import hello.servlet.web.frontcontroller.v2.ControllerV2;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class MemberListControllerV2 implements ControllerV2 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
public MyView process(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<Member> members = memberRepository.findAll();
//Model에 데이터 보관한다.
request.setAttribute("members", members);
return new MyView("/WEB-INF/views/members.jsp");
}
}
import hello.servlet.web.frontcontroller.MyView;
import hello.servlet.web.frontcontroller.v1.ControllerV1;
import hello.servlet.web.frontcontroller.v1.controller.MemberFormControllerV1;
import hello.servlet.web.frontcontroller.v1.controller.MemberListControllerV1;
import hello.servlet.web.frontcontroller.v1.controller.MemberSaveControllerV1;
import hello.servlet.web.frontcontroller.v2.controller.MemberFormControllerV2;
import hello.servlet.web.frontcontroller.v2.controller.MemberListControllerV2;
import hello.servlet.web.frontcontroller.v2.controller.MemberSaveControllerV2;
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;
import java.util.HashMap;
import java.util.Map;
@WebServlet(name = "frontControllerServletV2", urlPatterns = "/front-controller/v2/*")
public class FrontControllerServletV2 extends HttpServlet {
private Map<String, ControllerV2> controllerMap = new HashMap<>();
//설정정보, servlet이 생성될 때 Map이 생성
public FrontControllerServletV2() {
controllerMap.put("/front-controller/v2/members/new-form",
new MemberFormControllerV2());
controllerMap.put("/front-controller/v2/members/save",
new MemberSaveControllerV2());
controllerMap.put("/front-controller/v2/members",
new MemberListControllerV2());
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String requestURI = request.getRequestURI();
ControllerV2 controller = controllerMap.get(requestURI); //다형성을 활용
if(controller == null){
response.setStatus(HttpServletResponse.SC_NOT_FOUND); //404 에러를 호출
return;
}
MyView view = controller.process(request, response);
view.render(request, response);
}
}
[출처 : 인프런 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술]
'SpringMVC' 카테고리의 다른 글
[인프런 강의 복습]스프링 MVC 1편 - model 분리 (0) | 2022.02.18 |
---|---|
[인프런 강의 복습]스프링 MVC 1편 - model 추가 (0) | 2022.02.17 |
[인프런 강의 복습]스프링 MVC 1편 - 프론트 컨트롤러 패턴 (0) | 2022.02.17 |
[인프런 강의 복습]스프링 MVC 1편 - [회원 관리 APP] MVC 이용 (0) | 2022.02.16 |
[인프런 강의 복습]스프링 MVC 1편 - [회원 관리 APP] JSP 이용 (0) | 2022.02.15 |