본문 바로가기
WEB/Servlet, JSP

[Servlet] 요청 재지정 - sendRedirect(), forward(), include()

by Amy IT 2022. 7. 10.

 

목차

     

     

    요청 재지정

    클라이언트로부터의 요청에 대해 서버에 존재하는 다른 자원으로 요청을 위임하는 것을 요청 재지정이라고 합니다. 요청 재지정을 하는 방법은 다음의 세 가지가 있습니다.

     

    메소드 제공 객체 메소드 기능
    HttpServletResponse sendRedirect(String location) location에 설정된 자원으로 요청을 재지정한다.
    RequestDispatcher forward(ServletRequest request, ServletResponse response) RequestDispatcher 객체 생성시 path로 설정한 자원으로 요청을 재지정한다.
    include(ServletRequest request, ServletResponse response) RequestDispatcher 객체 생성시 path로 설정한 자원으로 요청을 재지정하고, 처리된 결과를 현재 페이지에 포함한다.

     

     

     

    HttpServletResponse

    sendRedirect(String location)

    • HttpServletResponse 객체에서 제공하는 sendRedirect 메소드는 다른 웹 애플리케이션이나 다른 웹 서버의 자원으로 요청을 재지정할 수 있습니다.
    • sendRedirect 메소드로 요청을 재지정하면, 컨테이너는 요청을 클라이언트나 브라우저로 전송하므로 메소드의 인자로 전달한 주소값이 클라이언트에게 새 요청으로서 보이게 됩니다. 따라서 리다이렉트된 주소로 표시됩니다.
    • 리다이렉트된 자원으로 새로운 요청이 가는 것이기 때문에, 이전 요청과 응답 객체는 유지되지 않습니다. 따라서 데이터를 유지하고 싶으면 session에 데이터를 저장하거나 URL과 함께 데이터를 전달해야 합니다.

     

    @WebServlet("/TestRedirect")
    public class TestRedirect extends HttpServlet {
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setAttribute("request", "홍길동");
    		HttpSession session = request.getSession();
    		session.setAttribute("session", "이순신");
    		ServletContext ctx = getServletContext();
    		ctx.setAttribute("application", "유관순");
    
    		response.sendRedirect("TestRedirect2");
    	}
    }
    @WebServlet("/TestRedirect2")
    public class TestRedirect2 extends HttpServlet {
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		String v1 = (String) request.getAttribute("request");
    		HttpSession session = request.getSession();
    		String v2 = (String) session.getAttribute("session");
    		ServletContext ctx = getServletContext();
    		String v3 = (String) ctx.getAttribute("application");
    		
    		response.setContentType("text/html; charset=utf-8");
    		PrintWriter out = response.getWriter();
    		out.print("<html>");
    		out.print("<body>");
    		out.print("<h1>TestRedirect2</h1>");
    		out.print(v1+"\t"+v2+"\t"+v3);
    		out.print("</body>");
    		out.print("</html>");
    	}
    }

     

     

     

    RequestDispatcher

    forward(ServletRequest request, ServletResponse response)

    • RequestDispatcher에서 제공하는 forward 메소드는 동일한 웹 서버, 동일한 웹 애플리케이션에 있는 자원으로만 요청을 재지정할 수 있습니다.
    • forward 메소드로 요청을 재지정하면, 컨테이너가 모든 과정을 내부적으로 처리하기 때문에 클라이언트나 브라우저는 관여하지 않습니다. 따라서 포워드된 주소도 시각적으로 볼 수 없습니다.
    • forward 메소드를 호출하며 요청 및 응답 객체를 전달하므로 새 자원에서 동일한 요청 객체를 사용할 수 있습니다. 즉, 이전 요청과 응답 객체를 유지할 수 있습니다.
    • 요청 및 응답 객체를 다른 자원에 전달하고 수행 제어를 완전히 넘겨서 다른 자원의 수행 결과를 클라이언트로 응답하도록 합니다.

     

    @WebServlet("/TestForward")
    public class TestForward extends HttpServlet {
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setAttribute("request", "홍길동");
    		HttpSession session = request.getSession();
    		session.setAttribute("session", "이순신");
    		ServletContext ctx = getServletContext();
    		ctx.setAttribute("application", "유관순");
    		
    		//request 객체 이용, RequestDispatcher 객체 생성하며 요청 위임할 path 설정
    		RequestDispatcher dis = request.getRequestDispatcher("TestForward2");
    		dis.forward(request, response);
    	}
    }
    @WebServlet("/TestForward2")
    public class TestForward2 extends HttpServlet {
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		String v1 = (String) request.getAttribute("request");
    		HttpSession session = request.getSession();
    		String v2 = (String) session.getAttribute("session");
    		ServletContext ctx = getServletContext();
    		String v3 = (String) ctx.getAttribute("application");
    		
    		response.setContentType("text/html; charset=utf-8");
    		PrintWriter out = response.getWriter();
    		out.print("<html>");
    		out.print("<body>");
    		out.print("<h1>TestForward2</h1>");
    		out.print(v1+"\t"+v2+"\t"+v3);
    		out.print("</body>");
    		out.print("</html>");
    	}
    }

     

    include(ServletRequest request, ServletResponse response)

    • RequestDispatcher에서 제공하는 include 메소드는 클라이언트의 요청으로 생성되는 요청 및 응답 객체를 다른 자원에 전달하고 수행한 다음, 그 결과를 클라이언트가 요청한 자원 내에 포함하여 클라이언트로 응답하는 기능의 메소드입니다.
    • forward 메소드는 이동한 다음 클라이언트에 응답하는 반면, include 메소드는 실행이 끝나면 이전 페이지로 다시 돌아와 계속해서 실행된 후 클라이언트에 응답합니다. 즉, include 메소드는 다른 페이지를 현재 페이지에 포함하는 효과를 얻습니다.

     

    @WebServlet("/TestInclude")
    public class TestInclude extends HttpServlet {
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setAttribute("request", "홍길동");
    		HttpSession session = request.getSession();
    		session.setAttribute("session", "이순신");
    		ServletContext ctx = getServletContext();
    		ctx.setAttribute("application", "유관순");
    		
    		response.setContentType("text/html; charset=utf-8");
    		PrintWriter out = response.getWriter();
    		out.print("<html>");
    		out.print("<body>");
    		out.print("<h1>TestInclude 상단</h1>");
    		
    		RequestDispatcher dis = request.getRequestDispatcher("TestInclude2");
    		dis.include(request, response);
    		
    		out.print("<h1>TestInclude 하단</h1>");
    		out.print("</body>");
    		out.print("</html>");
    	}
    }
    @WebServlet("/TestInclude2")
    public class TestInclude2 extends HttpServlet {
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		String v1 = (String) request.getAttribute("request");
    		HttpSession session = request.getSession();
    		String v2 = (String) session.getAttribute("session");
    		ServletContext ctx = getServletContext();
    		String v3 = (String) ctx.getAttribute("application");
    		
    		response.setContentType("text/html; charset=utf-8");
    		PrintWriter out = response.getWriter();
    		out.print("<html>");
    		out.print("<body>");
    		out.print("<h1>TestInclude2</h1>");
    		out.print(v1+"\t"+v2+"\t"+v3);
    		out.print("</body>");
    		out.print("</html>");
    	}
    }

     

     

     

     

    참고

    처음 해보는 Servlet&JSP 웹 프로그래밍 (오정임 지음, 루비페이퍼)

    https://stackoverflow.com/questions/2047122/requestdispatcher-forward-vs-httpservletresponse-sendredirect

     

     

     

    댓글