반응형

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

반응형

+ Recent posts