Posts JSP Servlet Forward
Post
Cancel

JSP Servlet Forward

Forward


forward란 무엇인가?

WAS의 서블릿이나 JSP가 요청을 받은 후
추가적인 처리를 같은 웹 어플리케이션 안의 다른 서블릿이나 JSP에 맡기는 경우
이를 위해 forward를 사용한다.


작동원리

  1. 웹 브라우저에서 Servlet1에게 요청을 보냄

  2. Servlet1은 요청을 처리한 후, 그 결과를 HttpServletRequest에 저장

  3. Servlet1은 결과가 저장된 HttpServletRequest와 응답을 위한 HttpServletResponse를
    같은 웹 어플리케이션 안에 있는 Servlet2에게 전송(forward)

  4. Servlet2는 Servlet1으로 부터 받은 HttpServletRequest와 HttpServletResponse를 이용하여
    요청을 처리한 후 웹 브라우저에게 결과를 전송



Redirect Forward의 차이점

redirect는 클라이언트가 서버에 요청을 보내고
서버는 클라이언트에게 새로운 요청할 곳을 알려주는 것이다.
그래서 redirect 후에는 url이 바뀌게 되는 것이다.

forward는 서버에서 요청을 혼자 처리하는 것이 아니라
다른 누군가에게 처리를 맡기는 것이다.
클라이언트는 요청받은 Servlet1이
혼자서 처리를 하는지 누군가에게 부탁을 하는지 알 필요가 없기 때문에
forward가 실행되더라도 url이 바뀌지 않는 것이다.

요청과 응답 측면에서 보면
redirect는 여러번의 응답과 요청이 있다.
맨 처음 클라이언트가 요청을 보내고
redirect가 응답하여 클라이언트는 새로운 요청을 하게된다.

하지만 forward는 요청과 응답이 한번만 존재한다.


예제

1~6까지의 값을 FirstServlet에서 랜덤으로 만든 뒤
SecondSerlvet에서 그 값 만큼 hello를 출력하는 예제

FirstSerlvet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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("/First")
public class FirstServlet extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		int diceValue = (int)(Math.random() * 6) + 1; 

		// SecondServlet에게 값을 넘겨야 하기 때문에 request객체에 값을 맡긴다
        request.setAttribute("dice", diceValue);
        
		// request에 맡긴 값을 어디로 넘길건지 지정해준다
        RequestDispatcher requestDispatehcer = request.getRequestDispatcher("/Second");

		//forward 메소드에는 처음 요청할 때 받아왔던 request와 response 객체를 넘겨준다
        requestDispatehcer.forward(request, response);
	}
}

SecondServlet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

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("/Second")
public class SecondServelt extends HttpServlet {
	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>hello</title></head>");
        out.println("<body>");

		//getAttribute 메소드를 이용해 request에 맡겼던 값을 찾아온다
        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>");
	}
}


결과를 확인해보면 url이 First로 고정되어있고
네트위크 상에서도 First만 나타나게 된다.