-
[부스트코스] 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 연결 웹 앱' 카테고리의 다른 글
[부스트코스] EL - BE (0) 2020.03.13 [부스트코스] scope - BE (0) 2020.03.13 [부스트코스] JSP -BE (0) 2020.03.12 [부스트코스] WEB UI 개발 -FE (1) 2020.02.24 [부스트코스] JavaScript -FE(4) (0) 2020.02.22