| 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 |
댓글