Back-end/JSP

JSP) 모델2 방식 - FrontController 컨트롤러 서블릿 만들기

luana_eun 2022. 3. 16. 10:40
728x90

model2 방식에서 FrontController는 요청을 받아서

DB연결이 필요없으면 → 바로 View로 포워딩하고

DB연결이 필요하면 → Action클래스(Controller)를 호출하여 DAO가 호출되고 DB로직을 처리한다. 

 

1. 서블릿 파일 만들기

서블릿은 자바 + HTTP객체다. 따라서 HttpServlet을 상속받아야한다. 

public class FrontController extends HttpServlet { }

 

HttpServlet에서 doGet, doPost를 오버라이딩 한다. (ctrl + alt + s + v)

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

}

 

doGet, doPost로 들어오던 같은 결과를 처리하기 위해 doProcess()를 생성하고 호출한다. 

protected void doProcess(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
	doProcess(req, res);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
	doProcess(req, res);
}

 

 

 

 

2. 가상주소 계산

FrontController 이므로 요청받은 주소가 어디로 가야하는지 판단해야한다. 

requst.getRequestURI() : JSP 내장객체 Request의 getRequestURI()는 호스트, 포트주로를 뺀

                                프로젝트 최상단부터 시작하는 주소를 가져온다. 

                                => /Project/...../testPage.jsp

request.getContextPath() : 프로젝트 경로를 가져온다. => /Project

substring() : 괄호안에 들어간 숫자만큼 문자열을 자른다.  => ..../testPaage.jsp

// doProcess()
String reqURI = req.getRequestURI();

// 프로젝트 주소
String ctxPath = req.getContextPath();

// 매핑된주소 - 프로젝트주소 = 가상주소
String command = reqURI.substring(ctxPath.length());

 

 

 

3. 가상주소 매핑

2번에서 얻은 가상주소로 그 가상주소와 실제주소를 매핑한다. 

    equals(): 괄호안의 문자열과 같은지 판별한다. 

    forward : 이동 정보를 저장하는 객체. (ActionForward.java)

    forward.setPath() : 실제로 이동할 주소값을 세팅한다.

    forward.setRedirect() : 이동방식을 설정한다. 

              true → redirect true이므로, 주소와 화면이 둘다 바뀐다. 

              false → redirect false이므로, 주소는 그래도 화면만 바뀐다.

    action : 여러 종류의 DB로직을 수행하기 위해 공통 execute 메소드를 정의한 인터페이스. (Action.java)

if(command.equals("/Register.me")) {
	// DB연결 없이 바로 view 호출
	forward = new ActionForward();
	forward.setPath("./user/register.jsp");
	forward.setRedirect(false);
		
} else if(command.equals("/UserRegisterAction.me")) {
	// DB연결 필요 => DB연결하는 객체 생성
	action = new UserRegisterAction();
	try {
	  forward = action.execute(req, res);	// => 다형성 
	} catch(Exception e) {
	  e.printStackTrace();
	}
} else if(command.equals("가상주소")) { 
	//가상주소에 맞는 필요한 동작들
}

 

 

 

 

4. 페이지 이동

3번의 가상주소 매핑으로 실제 주소를 알아냈으면 해당 주소로 이동한다. 

이때 이동방식을 Redirect방식 또는 forward방식으로 이동할지에 따라 다르게 이동한다. 

if(forward != null) {	// 페이지 이동 정보가 있다면
  if(forward.isRedirect()) {
	res.sendRedirect(forward.getPath());
  } else {
	RequestDispatcher dis = req.getRequestDispatcher(forward.getPath());
	dis.forward(req, res);
  }
}

 

728x90