반응형
# MVC04_03 FrontController를 도와주는 POJO(Plain Old Java Object) 만들기
- MVC03 에서는 클라이언트의 각 요청에 따른 각각의 컨트롤러가 대응.
- 그래서 컨트롤러가 많아졌고, 관리가 어려웠고, 비용이 많이 들었다.
- MVC04 에서는 클라이언트의 모든 요청을 하나의 컨트롤러에서 받아서 분기 처리. => FrontController(Servlet)
- POJO(Plan Old Java Object = Controller)는 FrontController가 해야할 일을 대신 해준다.
## 패키지 생성
- 프로젝트 > src > kr.bit.controller 생성
## 컨트롤러 생성
- kr.bit.controller > New > class 아래 이름의 컨트롤러들 생성
- MemberListController
- MemberInsertController
- MemberRegisterController
- MemberContentController
- MemberDeleteController
# MVC04_04 POJO(Plain Old Java Object) 가 할 일(Model 연동, 객체바인딩, nextPage 리턴)
## 인터페이스 생성
- 생성 이유 : 인터페이스에 추상 method를 넣어두고 하위 클래스들이 Implements 하게 되면 무조건 해당 method를 동일한 이름 구현하기 때문에 관리하기 쉬움. (method 통일을 위해 인터페이스 생성)
- 일반적으로 requestHandler() 이름으로 생성
- 프로젝트 > src > kr.bit.controller > interface > Controller 이름의 인터페이스 생성
package kr.bit.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Controller {
// 모든 POJO가 갖고 있어야 하는 메서드
// 리턴 타입을 void로 해야할지 String으로 해야할지 생각.
public void requestHandler(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException;
}
## POJO가 해야할 일
1. Model 연동
2. 객체 바인딩이 필요하면 객체 바인딩
3. 다음 페이지 정보 (View) String으로 리턴
### memberListController POJO 작업
package kr.bit.controller;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.bit.model.MemberDAO;
import kr.bit.model.MemberVO;
public class MemberListController implements Controller {
@Override
public String requestHandler(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// POJP가 해야할 일
// 1. model과 연동
MemberDAO dao = new MemberDAO();
List<MemberVO> list = dao.memberList();
// 2. 객체 바인딩
request.setAttribute("list", list); // 객체 바인딩
// list를 member/memberList.jsp 로 전달해줘야 함.
// 3. 다음 페이지 정보를 FrontController에게 넘겨주는 일
// 다음 페이지 (View Page 정보)
return "member/memberList.jsp";
}
}
# MVC04_05 FrontController와 POJO 연결하기
기존에 FrontController 에 분기 처리하여 각각에 맞게 작업했던 부분 POJO로 옮기는 작업 진행
HandlerMapping 작업 진행
package kr.bit.frontController;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
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 kr.bit.controller.Controller;
import kr.bit.controller.MemberContentController;
import kr.bit.controller.MemberDeleteController;
import kr.bit.controller.MemberInsertController;
import kr.bit.controller.MemberListController;
import kr.bit.controller.MemberRegisterController;
import kr.bit.controller.MemberUpdateController;
import kr.bit.model.MemberDAO;
import kr.bit.model.MemberVO;
@WebServlet("*.do")
public class MemberFrontController extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 한글 깨짐 방지
request.setCharacterEncoding("utf-8");
// 1. 클라이언트가 어떤 요청을 했는지 파악하기.
// (request를 이용하면 클라이언트가 어떤 요청을 했는지 파악 가능)
String url = request.getRequestURI();
// System.out.println("url : " + url); url 확인
// /MVC04/memberList.do 이런식으로 출력되는 것 확인 가능.
// 컨택스트 가져오기
String ctx = request.getContextPath();
// System.out.println("ctx : " + ctx); contextPath 확인
// /MVC04 이런식으로 출력되는 것 확인 가능.
// 2. 실제로 요청한 명령이 무엇인지 파악(contextPath 제외한 url)
String command = url.substring(ctx.length());
// System.out.println("command : " + command); 클라이언트가 서버에 요청한 실제 command
// memberList.do 등이 출력된다.
// Controller _ POJO 연결 위함
Controller controller = null;
String nextPage = null;
// 3. 요청에 따른 분기 작업.
if (command.equals("/memberList.do")) { // 회원 리스트 화면
controller = new MemberListController();
nextPage = controller.requestHandler(request, response);
RequestDispatcher rd = request.getRequestDispatcher(nextPage);
rd.forward(request, response);
} else if (command.equals("/memberInsert.do")) { // 회원 가입
controller = new MemberInsertController();
nextPage = controller.requestHandler(request, response);
response.sendRedirect(nextPage);
} else if (command.equals("/memberRegister.do")) { // 회원 가입 화면
controller = new MemberRegisterController();
nextPage = controller.requestHandler(request, response);
RequestDispatcher rd = request.getRequestDispatcher(nextPage);
rd.forward(request, response);
} else if (command.equals("/memberContent.do")) { // 회원 상세보기 화면
controller = new MemberContentController();
nextPage = controller.requestHandler(request, response);
RequestDispatcher rd = request.getRequestDispatcher(nextPage);
rd.forward(request, response);
} else if (command.equals("/memberUpdate.do")) { // 회원 정보 수정
controller = new MemberUpdateController();
nextPage = controller.requestHandler(request, response);
response.sendRedirect(nextPage);
} else if (command.equals("/memberDelete.do")) { // 회원 정보 삭제
controller = new MemberDeleteController();
nextPage = controller.requestHandler(request, response);
response.sendRedirect(nextPage);
}
}
}
반응형
'인프런 강의 학습 > MVC 프레임워크_나프1탄' 카테고리의 다른 글
인프런 MVC 프레임워크는 내손에 44일차 : MVC04_07~08 forward와 redirect 구분, HandlerMapping HashMap 활용 (0) | 2021.06.20 |
---|---|
인프런 MVC 프레임워크는 내손에 43일차 : MVC04_06 View 페이지 WEB-INF로 이동 (0) | 2021.06.20 |
인프런 MVC 프레임워크는 내손에 41일차 : MVC04_01~02 FrontController, if~else if로 요청 처리하기 (0) | 2021.06.18 |
인프런 MVC 프레임워크는 내손에 40일차 : MVC03_12 다음 MVC04 작업 방향 (0) | 2021.06.17 |
인프런 MVC 프레임워크는 내손에 39일차 : MVC03_11 MVC03 JSTL 적용 (0) | 2021.06.17 |