반응형

# MVC04_06 View 페이지 WEB-INF로 이동

  • 일반적으로 클라이언트가 서버에 요청할 때 Controller에 요청하도록 되어있는데, 현재 View 페이지 경로로 요청 시에도 바로 View 페이지가 열리게 되어있다.
  • MVC에서는 위 처럼 클라이언트가 View 페이지를 바로 호출할 수 없다. 그래서 클라이언트가 View 페이지를 바로 요청할 수 없도록 인위적으로 막을 예정.
  • WEB-INF 폴더는 보안 디렉터리(브라우저 상에서 WEB-INF 경로 입력 불가)로 기존 View 페이지들이 존재하는 member 폴더를 WEB-INF로 옮겨서 클라이언트가 View 페이지를 바로 요청하는 것을 막을 예정.

## View 페이지 WEB-INF로 이동

  • 기존 view 페이지들이 존재하는 member 폴더를 WEB-INF로 이동
  • 경로가 변경되었으므로 각 POJO 경로 변경. 아래처럼 경로 변경 시 입력 된 WEB-INF는 브라우저에는 나타나지 않는다.
1. memberContentController
/WEB-INF/member/memberContent.jsp

2. MemberListController
/WEB-INF/member/memberList.jsp

3.MemberRegisterController
/WEB-INF/member/memberRegister.html
  • 이렇게 해서 클라이언트가 View를 직접할 수 없고, Controller에서 forward 할 수 있도록 변경
반응형
반응형

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

반응형
반응형

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

# MVC03_12 다음 MVC04 관련 작업 방향

  • MVC04는 지금까지 작업한 MVC03 진행 내역을 변형해서 진행 예정
  • MVC03에서는 요청마다 다른 컨트롤러가 대응하여 지저분하고 비효율적.
  • MVC04에서는 MVC03과는 달리 컨트롤러를 1개로 줄이는 방향으로 진행.
  • Front Controller : 클라이언트 들의 모든 요청을 받는 안내원이라고 생각. 안내원은 1명. 보통 Servlet으로 생성
  • POJO (Plan Old Java Object) = Controller : 일반 컨트롤러. 보통 java 객체로 생성
반응형

+ Recent posts