1. RequestDispatcher의 역할
- 요청 전달 (Forward):
- 현재 서블릿(또는 JSP)에서 다른 서블릿, JSP, 또는 HTML 페이지로 요청을 완전히 넘김.
- 제어권이 완전히 넘어가기 때문에, 원래 서블릿에서 forward 그 이후에 작성된 응답 관련 코드는 모두 무시됨.
- 브라우저의 URL은 변경되지 않는다. (서버 내부에서만 이동)
- 동일한 HttpServletRequest와 HttpServletResponse 객체가 전달된다. (요청 정보와 속성 공유)
- 리소스 포함 (Include):
- 다른 서블릿, JSP, 또는 HTML 페이지의 실행 결과를 현재 서블릿(또는 JSP)의 응답에 포함시킴.
- 제어권이 다시 원래 서블릿으로 돌아온다.
- 브라우저의 URL은 변경되지 않는다.
- 동일한 HttpServletRequest와 HttpServletResponse 객체가 전달되지만, 출력 스트림은 공유된다.
2. RequestDispatcher 객체 얻는 방법
RequestDispatcher 객체는 ServletContext 또는 ServletRequest 인터페이스의 메서드를 통해 얻을 수 있다.
- ServletContext에서 얻기 (절대 경로 사용):
- /path/to/resource는 웹 애플리케이션 루트를 기준으로 하는 절대 경로.
- /로 시작해야 한다.
-
ServletContext context = getServletContext(); // 서블릿에서 RequestDispatcher dispatcher = context.getRequestDispatcher("/path/to/resource"); // "/"로 시작
- Java
- ServletRequest에서 얻기 (상대 경로 사용):
- path/to/resource는 현재 서블릿의 경로를 기준으로 하는 상대 경로.
- /로 시작하지 않는다.
- ..을 사용하여 상위 디렉토리로 이동할 수 있다.
-
Java
RequestDispatcher dispatcher = request.getRequestDispatcher("path/to/resource"); // "/" 없이
3. RequestDispatcher의 주요 메서드
메서드설명
forward(ServletRequest request, ServletResponse response) | 요청을 다른 리소스(서블릿, JSP, HTML)로 완전히 전달. 제어권은 대상 리소스로 넘어가고, 원래 서블릿의 응답은 무시됨. 브라우저 URL은 변경되지 않는다. |
include(ServletRequest request, ServletResponse response) | 다른 리소스의 실행 결과를 현재 응답에 포함시킨다. 제어권은 다시 원래 서블릿으로 돌아온다. 브라우저 URL은 변경되지 않는다. |
4. forward()와 include()의 차이점
특징forward()include()
제어권 | 대상 리소스로 완전히 넘어감 (돌아오지 않음) | 원래 서블릿으로 다시 돌아옴 |
URL 변화 | 없음 (서버 내부에서만 이동) | 없음 |
응답 | 대상 리소스의 응답이 클라이언트에 전송됨 | 원래 서블릿의 응답에 대상 리소스의 결과가 포함됨 |
출력 스트림 | 대상 리소스와 공유하지 않음 | 대상 리소스와 공유 |
사용 시나리오 | 요청 처리 흐름을 완전히 다른 리소스로 넘길 때 (예: 로그인 처리 후 메인 페이지로) | 여러 리소스의 결과를 조합하여 하나의 응답을 만들 때 (예: 헤더, 푸터 포함) |
5. 사용 예시
- forward() 사용 (로그인 처리 후 메인 페이지로 이동):
-
Java
// LoginServlet.java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 로그인 처리 로직 (ID, 비밀번호 확인 등) boolean loginSuccess = ...; if (loginSuccess) { // 로그인 성공 시 메인 페이지로 forward RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/views/main.jsp"); dispatcher.forward(request, response); } else { // 로그인 실패 시 로그인 페이지로 다시 이동 response.sendRedirect("login.jsp"); // sendRedirect는 다른 방식! (URL 변경됨) } }
- include() 사용 (헤더와 푸터를 포함하는 페이지):
- /WEB-INF : 외부에서 직접 접근할 수 없는 보안 디렉토리
-
Java
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Main Page</title> </head> <body> <jsp:include page="/WEB-INF/views/header.jsp" /> <h1>Main Content</h1> <p>This is the main content of the page.</p> <jsp:include page="/WEB-INF/views/footer.jsp" /> </body> </html>
6. forward()와 sendRedirect()의 차이
- RequestDispatcher.forward():
- 서버 내부에서 요청을 다른 리소스로 전달.
- 브라우저의 URL은 변경되지 않는다.
- 동일한 HttpServletRequest와 HttpServletResponse 객체가 전달된다. (요청 정보, 속성 공유)
- 한 번의 요청-응답 사이클 내에서 처리된다.
- HttpServletResponse.sendRedirect():
- 클라이언트(브라우저)에게 새로운 URL로 다시 요청하라고 지시. (302 Found 응답)
- 브라우저의 URL이 변경된다.
- 새로운 HttpServletRequest와 HttpServletResponse 객체가 생성된다. (이전 요청 정보는 유지되지 않음)
- 두 번의 요청-응답 사이클이 발생한다. (클라이언트 -> 서버 -> 클라이언트 -> 서버)
- response에 새로운 주소를 담아 보내면 브라우저에서 새로운 주소로 다시 요청을 보냄.
'개발 > servlet' 카테고리의 다른 글
HttpSession 과 Cookie 인터페이스 정리 (0) | 2025.03.05 |
---|---|
ServletConfig 인터페이스 정리 (0) | 2025.03.05 |
ServletContext 인터페이스 정리 (0) | 2025.03.05 |
Servlet Request 객체와 Response의 주요 메서드 (0) | 2025.03.05 |
Servlet은 어떤식으로 작동할까? (0) | 2025.03.05 |