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