[WEB] forward
forward
WAS의 서블릿이나 JSP가 요청을 받은 후 그 요청을 처리하다가, 추가적인 처리를 같은 웹 어플리케이션 안에 포함된 다른 서블릿이나 JSP에게 위임하는경우가 있는데, 이를 포워드라고 한다.
Servlet1에서 처리한 결과를 Servlet2에서도 써야 한다면, 반드시 이 결과를 request 객체에 저장을 해놔야 한다.
1. 웹 브라우저에서 Servlet1에게 요청을 보낸다.
2. Servlet1은 요청을 처리한 후, 그 결과를 HttpServletRequest에 저장한다.
3. Servlet1은 결과가 저장된 HttpServletRequest와 응답을 위한 HttpServletResponse를 같은 웹 어플리케이션 안에 있는
Servlet2에게 전송한다.(forward)
4. Servlet2는 Servlet1으로부터 받은 HttpServletRequest와 HttpServletResponse를 이용하여 요청을 처리한 후 웹 브라우저에게
결과를 전송한다.
- FrontServlet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @WebServlet("/front") public class FrontServlet extends HttpServlet { private static final long serialVersionUID = 1L; public 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); } } | cs |
- NextServlet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | @WebServlet("/next") public class NextServlet extends HttpServlet { private static final long serialVersionUID = 1L; public NextServlet() {} protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/htm l"); 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>"); } } | cs |
http://localhost:9090/firstWeb/front로 URL을 요청하게 되면 아래와 같은 결과가 보여진다. (URL 변경 없음)
redierct와 forward의 차이
redirect의 경우에는 요청이 여러번 일어나기 때문에 request, response 객체도 여러번 만들어지며, URL이 변경된다.
반면, forward의 경우에는 요청이 들어와서 서버가 내부적으로 옮겨준 것이지 새로운 요청이 들어온 것이 아니다.
클라이언트가 서버에 요청을 보낼 때, WAS는 request, response 객체를 만든다.
요청을 처리하고 응답을 보낼 때까지 이 객체들을 유지가 되기 때문에 forward의 경우에는 URL 변경이 일어나지 않는다.
참고자료