본문 바로가기
IT Study/JSP

JSP - FrontController 패턴

by hhyyyjun 2023. 1. 4.

| FrontController 패턴

클라이언트의 요청에 따라 프론트컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출하여 요청을 처리할 수 있도록 한다.

jsp파일로 구성된 컨트롤러에서는 공통된 코드들이 별도로 처리되지 않고 포함되어 있어 코드의 중복이 생기는 경우도 있다.

때문에 서블릿파일을 이용하여 각 기능을 담당하는 컨트롤러(java파일)를 사용자의 요청에 따라 처리하기 위해 해당 패턴을 사용한다.

MVC 패턴 + FC 패턴 => MVC 패턴2

1. V(View)에서 FC(FrontController)로 요청

2. FC는 각 기능을 담당하는 java파일로부터 기능 수행

3. 기능 수행 후 V에 출력

FC패턴을 토대로

1. 서블릿 파일 생성을 하고 URL mappings를 모든 요청에 응답하기 위해 *.do 로 설정한다.

2. 사용자 요청을 모아서 처리하는 메서드 생성

package ctrl;

import java.io.IOException;
import java.io.PrintWriter;

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;

/**
 * Servlet implementation class FrontController
 */
@WebServlet("*.do")  // *.do 요청을 수행하면 해당 어노테이션에 의해 FC로 무조건 오게 된다.
public class FrontController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public FrontController() { //서블릿은 기본생성자가 필수
		// 객체화를 하지 않았는데, 메서드를 사용할 수 있었다.
		// 서블릿 컨테이너(==객체를 관리하는 것을 의미)인 웹 서버 역할을 해주는 톰캣이 객체화를 해주었던 것
		super();
	}
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		actionDo(request, response); //GET 요청 시 어떤 요청이든 수행할 수 있도록 actionDO메서드 실행
	}
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//		doGet(request, response);
		actionDo(request, response); //POST 요청 시 어떤 요청이든 수행할 수 있도록 actionDO메서드 실행
	}
	//FC가 실행할 메서드
	private void actionDo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
}

3. 사용자 요청을 처리할 메서드

4. 강제성 부여할 인터페이스 생성

5. 요청에 대한 결과를 반환하기 위한 클래스

6. 기능 컨트롤러(메인화면 PART)

package ctrl;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import board.BoardDAO;
import board.BoardSet;
import board.BoardVO;

public class MainAction implements Action{

	@Override
	public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
//		request.setCharacterEncoding("UTF-8"); //인코딩 필터가 없는 경우
//		response.setCharacterEncoding("UTF-8");
		
//		ArrayList<BoardSet> datas=bDAO.selectAll(bVO);
		BoardDAO dao = new BoardDAO();
		BoardVO vo = new BoardVO();
		String paramCnt=request.getParameter("cnt");
		if(paramCnt==null || paramCnt.equals("")){
			vo.setCnt(2); // 향후 초기화 매개변수 등으로 설정가능
		}
		else {
			vo.setCnt(Integer.parseInt(paramCnt));
		}
		
//		request.setAttribute("datas", datas);
//		request.setAttribute("cnt", bVO.getCnt());
		ArrayList<BoardSet> datas = dao.selectAll(vo);
		request.setAttribute("datas", datas);
		request.setAttribute("cnt", vo.getCnt());
		
//		pageContext.forward("main.jsp");
		ActionForward forward = new ActionForward();
		forward.setPath("/main.jsp");
		forward.setRedirect(false);
		
		return forward;
	}
}

이외 각 Action을 확인하려면

해당 파일을 import하면 된다.

| Dispatcher

사용자(Client, 브라우저)로부터 오는 요청을 처리해서, 그 결과를 설정된 페이지로 출력하는 클래스

7. 요청 처리 부분(FC 서블릿 - actionDo 메서드)

//FC가 실행할 메서드
	private void actionDo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//요청정보 추출부분
		String uri = request.getRequestURI(); //사용자 요청
		String cp = request.getContextPath(); //패키지 경로
		//substring을 통해 사용자가 요청한 정보로 가공
		String command = uri.substring(cp.length());
		System.out.println(command);
		
		//요청정보 수행부분
		ActionForward forward = null; //여기
		if(command.equals("/main.do")) {
			//메인 보여주는 C 불러와라
			try {
				forward = new MainAction().execute(request, response);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		else if(command.equals("/logout.do")) {
			try {
				forward = new LogoutAction().execute(request, response);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		else if(command.equals("/deleteB.do")) {
			try {
				forward = new DeleteBAction().execute(request, response);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		else if(command.equals("/deleteR.do")) {
			try {
				forward = new DeleteRAction().execute(request, response);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		else if(command.equals("/insertB.do")) {
			try {
				forward = new InsertBAction().execute(request, response);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		else if(command.equals("/insertR.do")) {
			try {
				forward = new InsertRAction().execute(request, response);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		else if(command.equals("/fav.do")) {
			try {
				forward = new FavAction().execute(request, response);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		else if(command.equals("/login.do")) {
			try {
				forward = new LoginAction().execute(request, response);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		else if(command.equals("/insert.do")) {
			try {
				forward = new InsertAction().execute(request, response);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		else if(command.equals("/deleteM.do")) {
			try {
				forward = new DeleteMAction().execute(request, response);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		if(forward!=null) { //forward가 null이 아닌경우
			if(forward.isRedirect()) { //boolean인 경우 isRedirect로 바뀜
				response.sendRedirect(forward.getPath());
			} else {
				RequestDispatcher dispatcher=request.getRequestDispatcher(forward.getPath());
				dispatcher.forward(request, response);
			}
		}
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.println("<script>alert('요청처리 실패!');history.go(-1);<script>");

	}

'IT Study > JSP' 카테고리의 다른 글

JSP - ajax를 이용한 로그인 중복처리 기능  (1) 2023.01.04
JSP - FrontController를 이용한 회원탈퇴 기능  (0) 2023.01.04
JSP - 리스너/필터  (1) 2023.01.04
JSP,DBMS - 트랜잭션  (0) 2023.01.04
JSP - 리스너클래스/JSTL  (1) 2023.01.04

댓글