반응형
# 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");
}
}
}
}
반응형
'인프런 강의 학습 > MVC 프레임워크_나프1탄' 카테고리의 다른 글
인프런 MVC 프레임워크는 내손에 43일차 : MVC04_06 View 페이지 WEB-INF로 이동 (0) | 2021.06.20 |
---|---|
인프런 MVC 프레임워크는 내손에 42일차 : MVC04_03~05 FrontController를 도와주는 POJO 생성, POJO가 할 일, FrontController와 POJO 연결 (0) | 2021.06.19 |
인프런 MVC 프레임워크는 내손에 40일차 : MVC03_12 다음 MVC04 작업 방향 (0) | 2021.06.17 |
인프런 MVC 프레임워크는 내손에 39일차 : MVC03_11 MVC03 JSTL 적용 (0) | 2021.06.17 |
인프런 MVC 프레임워크는 내손에 38일차 : MVC03_10 JSTL 활용하기_ArrayList (0) | 2021.06.17 |