반응형

# MVC04_01 FrontController 로 모든 요청 받기

  • 기존 MVC03에서는 요청에 따라 각각 다른 컨트롤러로 응대.
  • MVC04에서는 1개의 컨트롤러로 모든 요청받을수 있도록 작업

## 프로젝트 생성

  • File > New > Dynamic Web Project > MVC04 프로젝트 생성

## 패키지 생성

  • MVC04 프로젝트 > Java Resources > kr.bit.frontController 이름의 패키지 생성

## Servlet 생성

  • kr.bit.frontController 패키지 > MemberFrontController.servlet 이름 작성 후 Next > URL mapping은 모든 경로(*.do) > Next > Service 체크 후 Finish.

## MVC03에서 가져오기

  • kr.bit.model 가져오기 (MemberVO.java / MemberDAO.java)
  • member 폴더 가져오기 (memberContent.jsp / memberList.jsp / memberRegister.html / memberUpdate.jsp)
  • lib 가져오기 (jstl-1.2.jar / mysql-connector-java-5.1.31.jar)

## Context 등록

  • 톰캣 서버 우클릭 Add and Remove 클릭 후 MVC04 등록 진행

## FrontController.servlet

  • FrontController는 Servlet로 생성

### 클라이언트 요청 확인방법

String url = request.getRequestURI();

### 클라이언트 요청 중 contextPath 확인방법

String ctx = request.getContextPath();

### 클라이언트가 서버에 요청한 실제 command 확인방법

String command = url.substring(ctx.length());

### 클라이언트의 요청에 따른 분기 작업

아래 처럼 분기 작업 후 각 요청에 맞게 작성해줘야한다.

if (command.equals("/memberList.do")) {				// 회원 리스트 화면
  MemberDAO dao = new MemberDAO();
  List<MemberVO> list = dao.memberList();
  request.setAttribute("list", list);
  RequestDispatcher rd = request.getRequestDispatcher("member/memberList.jsp");
  rd.forward(request, response);
} else if (command.equals("/memberInsert.do")) {	// 회원 가입

} else if (command.equals("/memberRegister.do")) {	// 회원 가입 화면

} else if (command.equals("/memberContent.do")) {	// 회원 상세보기 화면

} else if (command.equals("/memberUpdate.do")) {	// 회원 정보 수정

} else if (command.equals("/memberDelete.do")) {	// 회원 정보 삭제

}

 

# MVC04_02 FrontController 받은 요청 if ~ else if로 처리하기

  • jsp 또는 html 로 경로를 바꿀 때는 리다이렉트 보다는 forward로 해주는게 좋다.
  • 분기처리는 하였지만, 생각보다 객체지향적이지 않음.. 현재 분기마다 각 작업 중..

## 전체 화면 및 기능 작업 (FrontController)

  • 컨트롤러 하나에서 분기작업으로 각 기능 처리되도록 하였지만, 약간 무거워짐.(지저분)
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.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 등이 출력된다.
		
		// 3. 요청에 따른 분기 작업.
		if (command.equals("/memberList.do")) {				// 회원 리스트 화면
			MemberDAO dao = new MemberDAO();
			List<MemberVO> list = dao.memberList();
			request.setAttribute("list", list);
			RequestDispatcher rd = request.getRequestDispatcher("member/memberList.jsp");
			rd.forward(request, response);
		} else if (command.equals("/memberInsert.do")) {	// 회원 가입
			// 1. 파라미터 수집(VO)
			String id = request.getParameter("id");
			String pass = request.getParameter("pass");
			String name = request.getParameter("name");
			int age = Integer.parseInt(request.getParameter("age"));
			String email = request.getParameter("email");
			String phone = request.getParameter("phone");
			
			// 파라미터 수집(VO)
			// MemberVO vo = new MemberVO(id, pass, name, age, email, phone);
			MemberVO vo = new MemberVO();		
			vo.setId(id);
			vo.setPass(pass);
			vo.setName(name);
			vo.setAge(age);
			vo.setEmail(email);
			vo.setPhone(phone);
			
			//System.out.println("vo : " + vo);	// vo.toString() 이 생략되어있는 것.
			// Model과 연동하는 부분
			MemberDAO dao = new MemberDAO();
			int cnt = dao.memberInsert(vo);
			PrintWriter out = response.getWriter();
			// 가입 성공
			if ( cnt > 0 ) {
				//out.println("insert success");	
				// 다시 회원 리스트 보기로 가야함.
				response.sendRedirect("/MVC04/memberList.do");
				
			// 가입 실패 -> 예외 객체를 만들어서 WAS에게 던지자.
			} else {
				throw new ServletException("not insert");	
			}
		} else if (command.equals("/memberRegister.do")) {	// 회원 가입 화면
			RequestDispatcher rd = request.getRequestDispatcher("member/memberRegister.html");
			rd.forward(request, response);
		} else if (command.equals("/memberContent.do")) {	// 회원 상세보기 화면
			int num = Integer.parseInt(request.getParameter("num"));
			
			MemberDAO dao = new MemberDAO();
			
			MemberVO vo = dao.memberContent(num);
			
			// 객체 바인딩
			request.setAttribute("vo", vo);
			
			RequestDispatcher rd = request.getRequestDispatcher("member/memberContent.jsp");
			rd.forward(request, response);
		} else if (command.equals("/memberUpdate.do")) {	// 회원 정보 수정
			request.setCharacterEncoding("utf-8");
			// 1. 파라미터 수집(VO)
			int num = Integer.parseInt(request.getParameter("num"));
			int age = Integer.parseInt(request.getParameter("age"));
			String email = request.getParameter("email");
			String phone = request.getParameter("phone");
		
			MemberVO vo = new MemberVO();
			vo.setNum(num);
			vo.setAge(age);
			vo.setEmail(email);
			vo.setPhone(phone);
		
			MemberDAO dao = new MemberDAO();
			
			int cnt = dao.memberUpdate(vo);
			
			if (cnt > 0) {
				response.sendRedirect("/MVC04/memberList.do");
			} else {
				throw new ServletException("not update");
			}
		} else if (command.equals("/memberDelete.do")) {	// 회원 정보 삭제
			int num = Integer.parseInt(request.getParameter("num"));
			
			MemberDAO dao = new MemberDAO();
			
			int cnt = dao.memberDelete(num);
			
			if (cnt > 0) {
				response.sendRedirect("/MVC04/memberList.do");
			} else {
				throw new ServletException("not delete");
			}
		}
		
		
	}
}
반응형

+ Recent posts