Servlet RequestDispatcher 정리

2025. 3. 5. 03:53·개발/servlet

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
'개발/servlet' 카테고리의 다른 글
  • ServletConfig 인터페이스 정리
  • ServletContext 인터페이스 정리
  • Servlet Request 객체와 Response의 주요 메서드
  • Servlet은 어떤식으로 작동할까?
함수형 인간
함수형 인간
잘 까먹는 개발자의 두뇌 확장 장치
  • 함수형 인간
    개발 기록 노트
    함수형 인간
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 글 목록 (84)
      • 기타 (1)
      • 개발 (82)
        • Java (6)
        • Javascript (1)
        • Spring (20)
        • jQuery (0)
        • Git (0)
        • servlet (11)
        • JSP (6)
        • HTML (0)
        • CSS (10)
        • SQL (9)
        • JSTL (3)
        • Mybatis (4)
        • Design Patterns (0)
        • HTTP (2)
        • Devtools (0)
        • IntelliJ (5)
        • JDBC (1)
        • Lombok (3)
        • Logging (1)
      • 책 리뷰 (0)
  • hELLO· Designed By정상우.v4.10.3
함수형 인간
Servlet RequestDispatcher 정리
상단으로

티스토리툴바