본문 바로가기
boostcource/boostcourse_web programming

Forward

by sgyeong 2024. 4. 18.

Forward

 

 

출처 http://java.scwcd.jobs4times.com/Web-Container-Model.html

 

 

1) 웹 브라우저에서 Servlet1에 요청을 보낸다.
2) Servlet1은 요청을 처리한 후, 그 결과를 HttpServletRequest에 저장한다.
3) Servlet1은 결과가 저장된 HttpServletRequest와 응답을 위한 HttpServletResponse를 같은 웹 어플리케이션 안에 있는  Servlet2에 전송한다. 즉, Servlet1이 클라이언트에서 받은 요청을 혼자 다 처리하지 않고 일정한 부분까지만 처리하고 나머지 부분을 다른 Servlet에 넘겨준다. (forward)

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

 

*  redirect와 forward의 차이

redirect는 클라이언트가 서버에 요청을 보내면 서버는 처리를 하고, 다시 클라이언트에게 새로 요청할 곳을 알려주면서 다시 요청하는 것이다. redirect의 결과는 실제 실행한 다음 url 주소가 바뀐다. 

forward는 클라이언트가 요청을 보내면 서버쪽에서 요청에 대해 혼자 처리하는 것이 아니라 다른 servlet에 처리를 맡긴다. forward가 실행된 다음에는 url이 바뀌지 않는다.

실제 클라이언트가 서버에 요청을 하게 되면 반드시 요청을 담당하는 request와 응답을 담당하는 response 객체가 생성된다. 그리고 요청이 들어와서 응답을 할 때까지 request와 response 객체는 계속 유지가 된다. forward는 요청이 한번이기 때문에 request와 response 객체가 한번 만들어지지만, 반면 redirect의 경우 요청이 여러번 생기기 때문에 request, redirect 객체가 여러번 만들어진다.

 

정리

forward는 요청이 들어오면 서버에서 내부적으로 옮겨주기 때문에 클라이언트가 한번 요청했을때 만들어졌던 요청, 응답 객체가 그대로 유지된다.

 

src directory의 example package에 FrontServlet과 NextServlet을 각각 만들어준다.

 

 

 

FrontServlet의 url mappings의 url주소는 /front로 변경해준다.

 

 

doGet과 doPost를 체크 해제한 다음 sevice 메서드만 체크해주고 Finish한다.

 

 

service 메서드 안에 request, response 객체가 들어와 있는 것을 볼 수 있다.

front요청이 들어오면 WAS는 요청을 추상화한 객체 HttpServletRequest와 응답에 필요한 부분을 추상화한 객체 HttpServletResponse를 만들어 내고, servlet이 실행될 때, 즉 service메소드를 호출할 때 각각의 인자값에 넣어서 보내줄 것이다.

 

주사위를 굴려 랜덤한 값을 얻는다고 가정한 예제이다.

 

 

dice라는 이름으로 해당 값(diceValue)을 맡긴다고 생각하면 된다.

 

 

* 여기서 보면 값을 맡길때(setAttribute) 이름은 String이지만, 값은 Object가 들어간다. 

 

 

 

 

실제 forward를 해준다. requestDispatcher 객체는 request객체에서 얻어진다. 이때 인자값으로 forward 할 경로를 넣어준다. 주의할 점은 forward 경로는 반드시 슬래시( / )로 시작해야 한다. 그리고 같은 어플리케이션 안에서만 가능하다.

NextServlet의 경로 주소를 넣어서 requestDispatcher 객체를 만들어준다. 

 

 

그리고 requestDispatcher 가 갖고 있는 forward 메소드를 수행한다. 이때 반드시 처음 요청할때 받아왔던 request, response를 넘겨줘야 한다. 

 

 

 

다음으로 실제 실행할때 넘겨줄 servlet을 만들어준다. (Next Servlet)

 

 

NextServlet의 url주소는 /next로 변경해준다.

 

 

마찬가지로 doGet과 doPost는 체크 해제하고, service 메소드만 체크한 다음 Finish한다.

 

 

getAttribute() 메소드를 사용해 dice 값을 찾아온다.

값을 맡길때 Object를 넣었기 때문에 알맞게 형변환(Integer) 해준다.

 

주사위 수만큼 hello를 출력하기 위해 for문을 만들어준다.

 

 

 

FrontServlet 실행 결과

 

forward를 했을때 실제 url에 변화가 없다.

 

 

 

 

 

참고 : boostcourse    https://www.boostcourse.org/web316/lecture/16705/?isDesc=false

 

웹 프로그래밍(풀스택)

부스트코스 무료 강의

www.boostcourse.org

 

'boostcource > boostcourse_web programming' 카테고리의 다른 글

Scope  (0) 2024.04.19
Servlet & jsp 연동  (0) 2024.04.19
리다이렉트 (redirect)  (1) 2024.04.18
JSP -2  (0) 2024.04.15
JSP -1  (0) 2024.04.15