ABOUT ME

안녕하세요! valid_ming 입니다 :D 저의 성장기록을 담고 있습니다.

Today
Yesterday
Total
  • [부스트코스] redirect & forward - BE
    부스트코스 코딩일지/DB 연결 웹 앱 2020. 3. 13. 02:27

     

     

    redirect

     

     

    서버는 클라이언트 요청에 따라 특정 URL로 이동할 수 있습니다.

    이를 리다이렉트라고 합니다.

     

    예제를 보겠습니다.

     

    1. redirect01.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%
        response.sendRedirect("redirect02.jsp");
    %>    

    2. redirect02.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    redirect된 페이지 입니다.
    </body>
    </html>

     

    리다이렉트는 response 객체의 sendRedirect() 메서드를 이용하여 실행할 수 있습니다.

    메서드의 인자에는 이동하고 싶은 URL이 들어갑니다.

     

    위의 예제에서 redirect01.jsp를 실행하게 되면 바로 리다이렉트가 일어나 redirect02.jsp 페이지로 이동하게 됩니다.

    결국 웹에는 "redirect 된 페이지입니다."가 출력되는 것을 확인할 수 있습니다.

     

     

    [출처: https://www.edwith.org/boostcourse-web/lecture/19878/]

     

     

     

    forward

     

     

    서블릿이나 JSP가 요청을 받은 후 요청을 처리하다가, 추가적인 처리를 같은 웹 애플리케이션 안에 포함된 다른 서블릿이나 JSP에 위임하는 경우가 있습니다.

     

    이것을 forward라고 합니다.

     

    출처 http://java.scwcd.jobs4times.com/Web-Container-Model.html

    forward를 간단히 그림으로 나타낸 것입니다.

    그림을 보면 사용된 request와 response 객체는 하나라는 것을 알 수 있습니다.

     

    이것은 앞서 배운 redirect와 차이점인데요.

     

    1. 한 가지의 request, response 객체가 사용된다.

    2. url의 변화가 없다

     

    forward는 언뜻 보면 redirect와 비슷한 일을 한다고 생각할 수 있으나,

    이렇게 큰 두 가지 차이점을 확인할 수 있습니다.

     

    FrontServlet에서 dice라는 객체를 저장해 이를 NextServlet에 forward하여 dice에 저장된 수만큼 hello를 출력하는

    예제를 보겠습니다.

     

    1. FrontServlet

       protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                
                int diceValue = (int)(Math.random() * 6) + 1; 
                request.setAttribute("dice", diceValue);
                
                RequestDispatcher requestDispatehcer = request.getRequestDispatcher("/next");
                requestDispatehcer.forward(request, response);
        }

    랜덤 함수를 이용하여 diceValue를 생성합니다.

    이 변수는 request 객체의 setAttribute() 메서드를 이용해 저장해 둡니다.

    이 메서드의 첫번째 인자는 저장할 이름, 두 번째 인자는 저장할 값이 옵니다.

     

    다음으로, RequestDispatcher 객체를 이용하여 forward할 url을 지정해준 뒤

    request와 response 객체를 넘겨줍니다.

     

    2. NextServlet

        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            out.println("<html>");
            out.println("<head><title>form</title></head>");
            out.println("<body>");
    
            int dice = (Integer)request.getAttribute("dice");
            out.println("dice : " + dice);
            for(int i = 0; i < dice; i++) {
                out.print("<br>hello");
            }
            out.println("</body>");
            out.println("</html>");
        }

    servlet에 출력을 할 때 작성되어야 할 코드들을 작성합니다.

    이번에는 getAttribute() 라는 메서드를 이용해서 저장한 값을 dice라는 변수에 받아옵니다.

    이때, 인자는 저장할 때 사용했던 이름과 동일한 값을 넣어줍니다.

     

    주의할 것은 setAttribute()는 값을 객체 단위로 저장하기 때문에

    이 객체를 int로 사용하기 위해 형 변환을 해준 뒤 사용해줍니다.

     

    FrontServlet을 실행해보면 url을 바뀌지 않았다는 것을 알 수 있습니다.

     

     

    [출처: https://www.edwith.org/boostcourse-web/lecture/16705/]

     

     

     

    servlet & jsp 연동

     

     

    servlet은 로직을 작성하는 것에 더 편하고 jsp는 출력을 작성하는 것에 더 편하다고 느끼셨나요?

    그래서 servlet에서 로직 작성을 한 뒤 forward를 통해 jsp에서 출력을 하도록 많이 사용하고 있는데요.

    이것을 servlet & jsp 연동이라고 합니다.

     

     

    위의 forward와 마찬가지의 방법으로 사용하면 됩니다.

     

     

    [출처 : https://www.edwith.org/boostcourse-web/lecture/16706/]

     

     

     

    '부스트코스 코딩일지 > DB 연결 웹 앱' 카테고리의 다른 글

    댓글

Designed by Tistory.