부스트코스 코딩일지/DB 연결 웹 앱

[부스트코스] redirect & forward - BE

valid_ming 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/]