반응형

# 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);
			}
		}
	}
}
반응형

+ Recent posts