반응형
프론트 컨트롤러
모든 가상경로(@WebServlet("*.do"))를 제일 처음 맞이하여 역할에 맞는 컨트롤러로 기능 처리를 넘기는 중간 매개체 역할을 한다
효과 : 가상경로마다 servlet을 선언하지 않고 역할에 맞춰서 servlet을 선언하기 때문에
servlet이 무한증식하지 않고 비교적 깔끔하게 프로젝트 구조를 구성할 수 있다
해야 할 일 : 요청 uri를 분석하여 어떤 컨트롤러로 기능을 요청해야하는지 분석 후 처리
URL : 도메인을 포함한 경로
URI : 도메인을 제외한 경로
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Front Controller</title>
</head>
<body>
<h2>프론트컨트롤러 프로젝트 연습하기</h2><hr>
<a href="<%= request.getContextPath() %>/sample/main.do">sample 메인페이지로 이동</a>
<br>
<a href="<%= request.getContextPath() %>/sample/board1List.do">
sample 게시판1 페이지로 이동
</a><br>
<a href="<%= request.getContextPath() %>/sample/board2List.do">
sample 게시판2 페이지로 이동
</a><br>
<a href="<%= request.getContextPath() %>/board/main.do">board 메인페이지로 이동</a>
</body>
</html>
FrontController.java
package frontControllerPJT.controller;
/*
frontcontroller의 역할!
모든 가상경로를 제일 처음 맞이하여 역할에 맞는 컨트롤러로 기능 처리를 넘기는 중간 매개체 역할을 한다
효과 : 가상경로마다 servlet을 선언하지 않고 역할에 맞춰서 servlet을 선언하기 때문에
servlet이 무한증식하지 않고 비교적 깔끔하게 프로젝트 구조를 구성할 수 있다
해야 할 일 : 요청 uri를 분석하여 어떤 컨트롤러로 기능을 요청해야하는지 분석 후 처리
*/
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("*.do")
public class FrontController extends HttpServlet {
private static final long serialVersionUID = 1L;
public FrontController() {}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
URL : 도메인을 포함한 경로
URI : 도메인을 제외한 경로
*/
System.out.println("frontcontroller 실행 url:"+request.getRequestURI());
//1. 요청 uri 정보를 가지고 온다
String uri = request.getRequestURI();
//2. 프로젝트 경로를 가지고 온다.
String contextPath = request.getContextPath();
//3. 요청 uri에서 필요없는 프로젝트 경로를 제외한 uri를 가지고 온다
String comment = uri.substring(contextPath.length()+1);
/*
/frontControllerPJT/sample/main.do에서
/frontControllerPJT/ 부분이 잘림
*/
System.out.println(comment);
//4. 3번에서 찾은 요청 경로에서 /를 기준으로 문자열을 자른다.
String[] comments = comment.split("/");
System.out.println("comments[0] : "+comments[0]);
//5. 만들어진 문자열 배열의 첫번째 문자열이 어떤 컨트롤러로 기능을 요청해야할지 결정한다.
if(comments[0].equals("sample")) {
//SampleController 에게 처리 전달
SampleController sample = new SampleController(request,response,comments);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
SampleController.java
보안상 안전하게 하려면 wepapp -> web-inf 안에 넣어 사용하면 되는데 서블릿을 사용하는 경우만 가능
package frontControllerPJT.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SampleController {
public SampleController(HttpServletRequest request
, HttpServletResponse response
, String[] comments) throws ServletException, IOException {
if(comments[comments.length-1].equals("main.do")) {
//comments의 마지막 인덱스 값이 main.do이면 main메소드 호출
main(request,response);
}else if(comments[comments.length-1].equals("board1List.do")) {
board1List(request,response);
}else if(comments[comments.length-1].equals("board2List.do")) {
board2List(request,response);
}
}
public void main(HttpServletRequest request
, HttpServletResponse response) throws ServletException, IOException {
// /sample/main.do 처리 메소드
request.getRequestDispatcher("/WEB-INF/sample/index.jsp").forward(request, response);
}
public void board1List(HttpServletRequest request
, HttpServletResponse response) throws ServletException, IOException {
// /sample/main.do 처리 메소드
request.getRequestDispatcher("/WEB-INF/sample/list1.jsp").forward(request, response);
}
public void board2List(HttpServletRequest request
, HttpServletResponse response) throws ServletException, IOException {
// /sample/main.do 처리 메소드
request.getRequestDispatcher("/WEB-INF/sample/list2.jsp").forward(request, response);
}
}
반응형
'Java' 카테고리의 다른 글
[Servlet] FrontController 게시글 상세 조회 (0) | 2024.10.24 |
---|---|
[Servlet] FrontController 글 목록 조회 (0) | 2024.10.20 |
[Servlet] 게시글 삭제 (0) | 2024.10.14 |
[Servlet] 게시글 수정 (0) | 2024.10.13 |
[Servlet] 공지게시글 상세페이지 조회 (0) | 2024.10.12 |