RequestDispatcher
RequestDispatcher 객체에서 제공하는 메소드를 이용하여 요청 재지정을 할때는 재지정하는 자원이 반드시 현재 자원과 동일한 웹 어플리케이션에 있어야만 합니다.
우성 재지정 메소드를 확인해 봅시다.
1) forward(ServletRequest request, ServletResponse response) : 요청을 다른 자원으로 넘긴다.
2) include(ServeltRequest request, ServletResponse response) : 다른 자원의 처리 결과를 현재 페이지에 포함시킨다.
RequestDispatcher 객체 생성
객체를 생성할때는 다음과 같은 팩토리 메소드를 사용합니다. (객체를 반환하는 메소드를 팩토리 메소드라 부릅니다)
◆ ServletContext 객체에서 제공하는 메소드
RequestDispatcher getNamedDispatcher(String name)
RequestDispatcher getRequestDispatcher(String path)
◆ ServletRequest 객체에서 제공하는 메소드
RequestDispatcher getRequestDispatcher(String path)
getRequestDispatcher() 의 경우 ServletRequest 객체에서 호출할때는 절대경로, 상대경로 모두 가능하지만, ServletContext의 경우 절대경로만 가능합니다.
forward() 메소드
RequestDispatcher 객체의 forward()는 클라이언트의 요청으로 생성되는 request, response 객체를 다른 자원에 전달하고, 수행 제어를 완전하게 넘겨서 다른 자원의 수행결과를 클라이언트로 응답하도록 합니다.
다음 그림을 통해 확인해 봅시다!
이번에는 코드로 확인해 봅시다.
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/dispatcher1")
public class DispatcherTest1Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.print("<h3> Dispatcher Test1의 수행결과</h3>");
ServletContext sc = this.getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("/dispatcher2");
rd.forward(req, resp);
out.close();
}
}
getServletContext()를 통하여 ServletContext의 주소값을 sc 변수에 저장합니다.
이후 getRequestDispatcher()를 통하여 객체를 생성한 후 반환받습니다.
forward 함수를 호출하여 재지정 합니다. 이때 req, resp 인자를 함께 넘겨줍니다. 이동한 페이지에서 사용하는 HttpServletRequest와 HttpServletResponse는 forward() 메소드를 통해 넘겨받은 객체들 입니다.
포워딩 페이지의 서블릿은 생략하겠습니다. 그냥 포워딩된 서블릿에서의 출력문만 보여준후 끝나는 서블릿 입니다.
include() 메소드
include() 는 클라이언트가 요청하면 생성되는 HttpServletRequest와 HttpServletResponse 객체를 다른 자원에 전달한 후,
그 결과를 다시 이전 서블릿으로 반환하여 최종적으로는 클라이언트에서 요청한 서블릿 에서 반환하는 기능의 메소드 입니다.
이또한 그림으로 살펴보실까요?
이제 코드를 살펴봅시다. 위에서 본 코드의 아주 일부분만 변경하면 됩니다.
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/dispatcher1")
public class DispatcherTest1Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.print("<h3> Dispatcher Test1의 수행결과</h3>");
ServletContext sc = this.getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("/dispatcher2");
rd.include(req, resp); // 이부분만 변경!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
out.close();
}
}
forward만 include로 변경되었습니다.
이동할 자원인 dispatcher2는 다음과 같습니다.
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/dispatcher2")
public class DispatcherTest2Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.print("<h3> Dispatcher Test2의 수행결과</h3>");
out.close();
}
}
실행결과는 다음과 같습니다.
URI 부분을 보시면 dispatcher1 으로 요청을 보낸것을 알 수 있습니다.
요청을 받은 dispatcher1 서블렛이 생성되고, path로 이동합니다.
forward() 메소드는 이동한 다음 클라이언트측에 응답하지만, include()는 메소드 실행이 끝나면 이전 페이지로 다시 돌아와 계속 하던일은 한다음 클라이언트 측으로 응답을 보냅니다.
'BackEnd > Servlet, JSP' 카테고리의 다른 글
[Servlet, JSP] Servlet Life Cycle : Servlet 생명 주기 (0) | 2022.01.14 |
---|---|
[Servlet, JSP] MVC : Model View Controller (0) | 2022.01.13 |
[Servlet, JSP] FilterConfig, FilterChain (0) | 2022.01.13 |
[Servlet, JSP] Session과 login, logout 구현하기 (0) | 2022.01.13 |
[Servlet, JSP] Servlet 과 Cookie (0) | 2022.01.13 |
댓글