RequestDispatcher란
RequestDispatcher는 클라이언트로부터 최초에 들어온 요청을 JSP/Servlet 내에서 원하는 자원으로 요청을 넘기는(보내는) 역할을 수행하거나, 특정 자원에 처리를 요청하고 처리 결과를 얻어오는 기능을 수행하는 클래스입니다. 즉 /a.jsp 로 들어온 요청을 /a.jsp 내에서 RequestDispatcher를 사용하여 b.jsp로 요청을 보낼 수 있습니다. 또는 a.jsp에서 b.jsp로 처리를 요청하고 b.jsp에서 처리한 결과 내용을 a.jsp의 결과에 포함시킬 수 있습니다.
요청을 보내는 방법으로는 RequestDispatcher#forward()와 RequestDispatcher#include() 두 가지 방법이 있습니다. 앞으로 이 두가지 방법에 대해 알아보도록 하겠습니다.
RequestDispatcher가 있는 이유. HttpServletResponse#sendRedirect() 와의 차이점
HttpServletResponse를 사용하면 sendRedirect() 메서드를 이용하여 지정한 경로로 제어를 이동시킬 수 있습니다. 그러나 sendRedirect()는 HTTP 리다이렉션을 이용하기 때문에 하나의 요청 범위 안에서 처리를 하는것이 아니라 브라우저에게 Response 후 브라우저측에서 지정받은 요청 경로로 다시 재요청을 하는 방식이기에 두 번의 HTTP 트랜잭션이 발생하며, 서버측에서는 최초에 받은 요청중에 처리한 내용을 리다이렉트 된 요청안에서 공유할 수 없는 문제가 있습니다.
물론 sendRedirect() 에서도 쿠키나 세션등을 이용해 특정 상태를 유지하여 공유할 수는 있겠으나, 상황에 따라 제한적일 수 있으며, 코드 레벨 에서의 알고리즘 등을 곧바로 이어가는데에도 한계가 있기 때문에 좋은 방법이라고 할 수는 없을것입니다.
그대신 HttpServletResponse를 통해 리다이렉트 하는 방식은 현재 어플리케이션 이외에 다른 자원의 경로를 요청할 수 있는 반면 RequestDispatcher는 현재 처리중인 서블릿이 속해 있는 웹 어플리케이션 범위 내에서만 요청을 제어할 수 있습니다.
JSP 페이지 에서 사용 시
RequestDispatcher dispatcher = application.getRequestDispatcher("/hello");
dispatcher.forward(request, response);
forward() 사용시 주의할 점
forward()는 제어를 넘기기 이전에 출력 버퍼를 비우기 때문에 a.jsp -> b.jsp로 호출시 a.jsp에서 어떤 내용을 버퍼에 출력했더라도 무시되며 제어가 넘어간 b.jsp의 출력 내용만 브라우저에게 전달되므로 주의하도록 합니다.
RequestDispatcher의 forward() 메서드
forward() 메서드는 대상 자원으로 제어를 넘기는 역할을 합니다. 브라우저에서 /a.jsp로 요청했을 때 /a.jsp에서 forward()를 실행하여 /b.jsp로 제어를 넘길 수 있습니다. 제어를 넘겨받은 /b.jsp는 처리 결과를 최종적으로 브라우저에게 출력합니다. 브라우저 입장에서는 /a.jsp를 요청했지만 받은 결과는 /b.jsp의 결과입니다. 이때 HTTP 리다이렉트 방식과는 달리 하나의 HTTP 요청(Request) 범위 안에서 동작이 이루어집니다.
참고 URL
https://dololak.tistory.com/502
'JSP' 카테고리의 다른 글
23.02.26 [JSTL] c:forEach 같은 index 사용하기 (0) | 2023.03.01 |
---|---|
23.01.14 jsp 템플릿 등록 (0) | 2023.02.11 |
23.02.06 <script>문 내에서의 ${}파라미터 값 불러와 페이지 이동 (0) | 2023.02.06 |
23.01.27 JSON & ajax 을 이용한 Member table 조회 응용(미정리) (0) | 2023.01.30 |
23.01.25 JSON & ajax(미정리) (0) | 2023.01.30 |