[부스트코스] redirect & forward - BE
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라고 합니다.

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