forward

oyeon·2021년 1월 11일
0

Review

  1. Client가 서버에게 요청을 보내면 WAS는 request 객체와 response 객체를 생성한다.
  2. 요청이 들어와서 응답을 할 때까지 request, response 객체는 유지가 되는 상태이다.

forward vs redirect

forward

  • forward는 request, response 객체가 한번 만들어진다. ( ∵ 요청이 한번)
  • forward 실행 후에는 url이 바뀌지 않는다.

redirect

  • redirect01에 대한 요청이후 redirect02에 대한 요청은 새로운 것이므로 request, response 객체가 두번 만들어진다. ( ∵ 요청이 두번)

forward

  1. 웹 브라우저에서 Servlet1에게 요청을 보냄
  2. Servlet1은 요청을 처리한 후, 그 결과를 HttpServletRequest에 저장
    (Servlet1의 지역변수는 Servlet2에서 사용할 수 없으므로 Servlet1과 Servlet2 모두 접근 가능한 것이 필요하다. 그래서 request객체인 HttpServletRequest에 결과를 저장)
  3. Servlet1은 결과가 저장된 HttpServletRequest와 응답을 위한 HttpServletResponse를 같은 웹 어플리케이션 안에 있는 Servlet2에게 전송(forward)
  4. Servlet2는 Servlet1으로부터 받은 HttpServletRequest와 HttpServletResponse를 이용하여 요청을 처리한 후 웹 브라우저에게 결과를 전송

실습

// FrontServlet.java
package examples;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/front")
public class FrontServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
    public FrontServlet() {
        super();
    }

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

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/next")
public class NextServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public NextServlet() {
        super();
    }

	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>");
	}
}

결과

  • redirect와 다르게 forward의 경우 url이 그대로인 것을 볼 수 있다.
profile
Enjoy to study

0개의 댓글