티스토리 뷰

Backend

[JAVA] 서블릿 포워드 (Forward)

마로그래머 2021. 8. 12. 18:49
반응형

서블릿 포워드

서블릿 포워드(Forward)


서블릿의 포워드란, 각각의 서블릿끼리 혹은 서블릿과 JSP끼리 연동해서 작업해야 하는 경우 서로 작업을 전달하는 것을 말한다.

포워드의 종류는 다음 네가지이다.

  • redirect
  • Refresh
  • location
  • dispatch (일반적인 포워드 방식)



    이 네가지 포워드 방식을 알아보자.


redirect


img

HttpServletResponse 객체의 sendRedirect() 메서드를 이용한다.

  • 웹 브라우저(클라이언트)에게서
    • 첫번째 서블릿요청을 받으면
    • 첫번째 서블릿이 다시 브라우저에게 응답을 보낸 후
    • 브라우저가 다시 두번째 서블릿에게 요청을 보낸다.
    • 요청을 받은 두번째 서블릿은 다시 브라우저에게 응답한다.

WAS에서 객체가 두번 생성되기 때문에 매핑 url이 달라지는 것을 볼 수 있다.

아래 코드로 자세하게 확인해보자


FirstSerlvet.java

@WebServlet("/first")  //Annotation으로 서블릿을 매핑해보겠다.
public class FirstServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=utf-8");
        PrintWriter out = resp.getWriter();
        resp.sendRedirect("second"); //second로 매핑되어있는 서블릿으로 redirect하겠다.
    }
}

SecondServlet.java

@WebServlet("/second")
public class SecondServlet 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.println("<html><body>");
        out.println("Redirect 되었습니다. first->second");
        out.println("</body></html>");
    }

}

결과

img


FirstSerlvet에서 second로 매핑된 SecondServlet으로 Redirect한 코드는 브라우저를 한번 거쳐서 다시 WAS에서HttpServletResponseHttpServletRequest 객체를 생성하기 때문에 url이 변경된 것을 확인 할 수 있다.



Refresh


img

HttpServletResponse 객체의 addHadder() 메서드를 이용한다.

  • 웹 브라우저(클라이언트)에게서
    • 첫번째 서블릿요청을 받으면
    • 첫번째 서블릿이 다시 브라우저에게 응답을 보낸 후
    • 브라우저가 다시 두번째 서블릿에게 요청을 보낸다.
    • 요청을 받은 두번째 서블릿은 다시 브라우저에게 응답한다.
    • 요청/응답 방식은 redirect와 동일하다.

redirect와 요청/응답 방식은 비슷하다. 다만 Refresh 포워드 방식은 addHadder에 정보를 넣고 첫번째 서블릿을 잠깐 머물렀다가 다시 브라우저에 응답한다는 것이 차이이다.

아래 코드로 자세하게 확인해보자


FirstSerlvet.java

@WebServlet("/first")
public class FirstSerlvet 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("1초간 머물 것 입니다");
        resp.addHeader("Refresh", "1;url=second"); //화면을 출력하고 1초 후에 second로 매핑된 서블릿으로 Refresh하겠다.
    }
}

SecondServlet.java

@WebServlet("/second")
public class SecondServlet 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.println("<html><body>");
        out.println("Refresh 되었습니다. first->second");
        out.println("</body></html>");
    }

}

결과

img


img

redirect와 똑같이 객체가 두번 생성되어 매핑된 url값이 달라졌지만 차이점은 첫번째 서블릿에서 잠시 머문다는 것이다.



location


특이하게도 JavaScriptlocation 객체를 이용한다.

바로 확인해보자


FirstSerlvet.java

@WebServlet("/first")
public class FirstServlet 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("<script type='text/javascript'>"); 
        out.print("location.href='second';");    //JavaScript의 location 객체를 이용하여 second로 매핑된 서블릿으로 이동한다.
        out.print("</script>");
    }

}

SecondServlet.java

@WebServlet("/second")
public class SecondServlet 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.println("<html><body>");
        out.println("JavaScript의 location 객체로 Redirect 되었습니다. first->second");
        out.println("</body></html>");
    }

}

결과

img

이 또한 마찬가지로 매핑url은 first에서 second로 변한 것을 알 수 있다.이 말인 즉슨 location 포워드 방식도 HttpServletRequest객체와 HttpServletResponse객체가 새로 생성되었다는 것이다.



dispatch


dispatch.jpeg


포워딩이라고 하면 이 dispatch를 일반적으로 나타낸다.
RequestDispatcher 클래스의 forward() 메서드를 이용한다.

  • 웹 브라우저(클라이언트)에게서
    • 첫번째 서블릿요청을 받아
    • 첫번째 서블릿HttpServletRequestHttpServletResponse객체에 정보를 담아서 직접 두번째 서블릿으로 포워드를 하면
    • 두번째 서블릿이 객체를 받아 작동한 후 웹 브라우저에게 응답을 보낸다.

한 번 생성된 객체에 정보를 담아 두번째 서블릿에 포워드 했으므로 객체에는 변함이 없고 url도 변하지 않는다.


FirstSerlvet.java

@WebServlet("/first")
public class FirstServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=utf-8");
        PrintWriter out = resp.getWriter();
        RequestDispatcher dispatch = req.getRequestDispatcher("second");
        dispatch.forward(req, resp); //dispatch 클래스의 forward()메서드에 객체를 각각 담아 전송한다.
    }

}

SecondServlet.java

@WebServlet("/second")
public class SecondSerlvet 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.println("<html><body>");
        out.println("Dispatch를 이용하여 forward 된 서블릿입니다. first---");
        out.println("</body></html>");

    }

}

결과

img

브라우저가 요청한 후 WAS에서 생성된 HttpServletRequest,HttpServletRespons객체는 첫번째 서블릿에서 정보를 담아 그대로 두번째 서블릿으로 포워드 되기 때문에 url도 변함없는 것을 확인 할 수 있다.




주로 Redirect와 forward(dispatch)로 쉽게 명칭하는 듯 하다...

이 다음 공부는 Dispatch를 이용한 binding이다.

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함