반응형
# MVC04_07 forward와 redirect 구분
## 핸들러 매핑 (HandlerMapping)
- 여기서 핸들은 경로를 의미
- 이후 핸들러 매핑을 FrontController에서 진행하는게 아닌 별도의 클래스에서 진행 하도록 변경 할 예정.
- 아래 코드는 기존 핸들러 매핑 부분 여기서 중첩되는 부분을 따로 빼서 처리예정
// 핸들러 매핑 (여기서 핸들은 경로(/memberList.do 등)를 의미.
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);
}
- 아래 처럼 공통 부분을 별도로 빼서 작업 진행
// 핸들러 매핑 (여기서 핸들은 경로(/memberList.do 등)를 의미.
if (command.equals("/memberList.do")) { // 회원 리스트 화면
controller = new MemberListController();
nextPage = controller.requestHandler(request, response);
} else if (command.equals("/memberInsert.do")) { // 회원 가입
controller = new MemberInsertController();
nextPage = controller.requestHandler(request, response);
} else if (command.equals("/memberRegister.do")) { // 회원 가입 화면
controller = new MemberRegisterController();
nextPage = controller.requestHandler(request, response);
} else if (command.equals("/memberContent.do")) { // 회원 상세보기 화면
controller = new MemberContentController();
nextPage = controller.requestHandler(request, response);
} else if (command.equals("/memberUpdate.do")) { // 회원 정보 수정
controller = new MemberUpdateController();
nextPage = controller.requestHandler(request, response);
} else if (command.equals("/memberDelete.do")) { // 회원 정보 삭제
controller = new MemberDeleteController();
nextPage = controller.requestHandler(request, response);
}
// forward, redirect
if(nextPage != null ) {
if(nextPage.indexOf("redirect:") != -1) { // redirect: 라는 글자 존재 시 redirect
response.sendRedirect(nextPage.split(":")[1]);
} else {
RequestDispatcher rd = request.getRequestDispatcher(nextPage);
rd.forward(request, response);
}
}
# MVC04_08 HandlerMapping HashMap 활용
- FrontController에서 핸들러 매핑되는 부분(if ~ else if로 분기처리 하는 부분)을 별도의 클래스에서 작업할 수 있도록 변경 예정
- HashMap을 이용하여 key, value 값으로 요청에 따른 분기처리 진행
- HashMap에 입력 시 put 사용, 출력 시 get 사용
## HandlerMapping 생성
- 프로젝트 > kr.bit.frontController > class > HandlerMapping 이름으로 생성
package kr.bit.frontController;
import java.util.HashMap;
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;
public class HandlerMapping {
private HashMap<String, Controller> mappings;
public HandlerMapping() {
mappings = new HashMap<String, Controller>();
mappings.put("/memberList.do", new MemberListController());
mappings.put("/memberInsert.do", new MemberInsertController());
mappings.put("/memberRegister.do", new MemberRegisterController());
mappings.put("/memberContent.do", new MemberContentController());
mappings.put("/memberUpdate.do", new MemberUpdateController());
mappings.put("/memberDelete.do", new MemberDeleteController());
}
public Controller getController(String key) { // key = /memberList.do 등의 경로 들어옴
return mappings.get(key);
}
}
## FrontController HandlerMapping 변경
- 기존 FrontController에서 핸들러 매핑되는 부분을 별도로 생성한 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. 요청에 따른 분기 작업. -> HandlerMapping에서 진행
HandlerMapping mapping = new HandlerMapping();
controller = mapping.getController(command);
nextPage = controller.requestHandler(request, response);
// forward, redirect
if(nextPage != null ) {
if(nextPage.indexOf("redirect:") != -1) { // redirect: 라는 글자 존재 시 redirect
response.sendRedirect(nextPage.split(":")[1]);
} else {
RequestDispatcher rd = request.getRequestDispatcher(nextPage);
rd.forward(request, response);
}
}
}
}
반응형