주먀

1. FrontController 본문

학원/Servlet

1. FrontController

주먀 2023. 5. 2. 14:38
package kr.smhrd.frontController;

import java.io.IOException;
import java.util.HashMap;

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.smhrd.controller.AjaxCon;
import kr.smhrd.controller.CheckCon;
import kr.smhrd.controller.Controller;
import kr.smhrd.controller.DeleteCon;
import kr.smhrd.controller.GoMainCon;
import kr.smhrd.controller.GoSelectCon;
import kr.smhrd.controller.GoSuccessCon;
import kr.smhrd.controller.GoUpdateCon;
import kr.smhrd.controller.JoinCon;
import kr.smhrd.controller.LoginCon;
import kr.smhrd.controller.LogoutCon;
import kr.smhrd.controller.UpdateCon;
import kr.smhrd.controller.ViewBoardCon;
import kr.smhrd.controller.WriterBoardCon;
import kr.smhrd.controller.goBoardMainCon;
import kr.smhrd.controller.goWriterBoardCon;

// 모든 요청을 받을 수 있도록 url-mapping을 *로 지정
// @webServlet("*.do") --> .do로 끝나는 모든 요청
@WebServlet("*.do")
public class FrontController extends HttpServlet {

	private HashMap<String, Controller> mappings;

	@Override
	public void init() throws ServletException {
		// Servlet이 메모리에 할당 됐을 때,
		// 단 1번 실행
		// Servlet에서 필요한 변수를 세팅

		// URL-Mappling <--> POJO
		// HashMap 자료구조 ( python dict )
		// key : value
		// URL-Mapping : POJO
		mappings = new HashMap<String, Controller>();

		// haspmap에 데이터 집어넣기
		mappings.put("/goMain.do", new GoMainCon());
		mappings.put("/goSuccess.do", new GoSuccessCon());
		mappings.put("/join.do", new JoinCon());
		mappings.put("/login.do", new LoginCon());
		mappings.put("/delete.do", new DeleteCon());
		mappings.put("/goSelect.do", new GoSelectCon());
		mappings.put("/goUpdate.do", new GoUpdateCon());
		mappings.put("/logout.do", new LogoutCon());
		mappings.put("/update.do", new UpdateCon());
		mappings.put("/goBoardMain.do", new goBoardMainCon());
		mappings.put("/goWriterBoard.do", new goWriterBoardCon());
		mappings.put("/writeBoard.do", new WriterBoardCon());
		// 새로운 기능이 생기면 put으로 추가만 해주자.
		mappings.put("/viewBoard.do", new ViewBoardCon());

		mappings.put("/ajax.do", new AjaxCon());
		mappings.put("/check.do", new CheckCon());

	}

	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// http://localhost:8081/MessageSystem/join?email=1234

		// **1. 요청을 구분**
		// uri -> 폴더이름부터 맨 뒤 데이터까지
		// /MessageSystem/join
		String uri = request.getRequestURI();

		// /MessageSystem
		// 어디 폴더에 있는지 가져오기
		String cpath = request.getContextPath();

		// /join
		// 안녕하세요
		// String.subString(2); --> 슬라이싱 : 하세요
		// String.subString(int, int); --> 하
		String command = uri.substring(cpath.length());

		System.out.println(command);

		// ==================================================================================

		String nextView = null;
		Controller con = null; // 업캐스팅을 이용한 중복 제거

		// **2. 요청에 따라서 기능을 실행**
		// 각각의 url mapping에 따라서 알맞는 POJO를 찾아오기
		// 자바의 자료구조
		con = mappings.get(command);

		// ===================================================================================

		if (con != null) {
			nextView = con.execute(request, response);
		}

		// 중복 제거
		// **3. 페이지 이동**
		// 예외처리용
		if (nextView != null) {
			// redirect / forward 구분하기 위해서 규칙이 필요하다
			// 앞으로 redirect 요청은 반드시 앞에 redirect:/를 붙이자
			// goMain.do --> redirect:/goMain.do
			if (nextView.contains("redirect:/")) {
				// nextView ="redirect:/goMain.do";
				// nextView.split(":/"); --> ["redirect", "goMain.do"]
				response.sendRedirect(nextView.split(":/")[1]);
			} else {
				RequestDispatcher rd = request.getRequestDispatcher("WEB-INF/views/" + nextView + ".jsp");
				rd.forward(request, response);
			}

		}

	}

}

'학원 > Servlet' 카테고리의 다른 글

5-1. JoinCon.java / 5-2. Member.java(DTO) / 5-3. MemberMapper.xml(SQL문) / 5-4 MemberDAO.JAVA(DAO)  (0) 2023.05.02
4. Controller.java  (0) 2023.05.02
3. GoSuccessCon.java  (0) 2023.05.02
2. GoMainCon.java  (0) 2023.05.02
FrontController 시작  (0) 2023.04.28