보통 이거에 대해 두루뭉실하게 알고들 있다..
제어권을 넘긴다니 어쩐다니;;
말이 참 어렵다
그래서 그냥 생각난김에 설명해본다.
1. include
말 그대로 중간에 포함한다는 의미이다.
이게 뭔 말이냐면 response 의 ouput stream 에 데이터를 쓰는 중간에
include 구문을 만나면
해당 스트림을 그대로 유치한 채 include 되는 URL의 데이터를 그 뒤에 이어 쓴다.
물론 include 문 종류 후에도 해당 스트림을 그대로 유지하여 데이터를 이어 쓸 수 있다.
2 forward
흔히 이야기 해서 타겟 URL로 제어권을 넘긴다고 한다.
제어권을 넘긴다? 그럼 forward 되는 순간 forward 된 페이지로 그냥 넘어가버린다는건가?라고 생각하게 된다.
그래서 보통 테스트를 할때
dispatcher.forward(req, res);
System.out.println("블라블라");
이렇게 테스트를 해본다.
그런데 해본 사람은 알겠지만
forward 된 뒤에 콘솔에 "블라블라"가 출력 된다.
그래서 보통 뭐지? include랑 다른게 없는데? 라는 생각도 한다..
그런데 여기서 include랑 큰 차이가 있다.
위에서 말했던것처럼 include는 include 전 후에 response의 stream을 유지해준다.
하지만 forward는 forward 되는 시점에 기존에 stream에 작성되었던 데이터는 clear 되고
forward 되는 URL의 데이터를 새로 쓴다.
그리고 forward 구문 종료 후에는 스트림에 더이상 데이터를 작성 할 수 없다.
작성 한다 하더라도 무시 된다.
즉, forward 되는 URL로 제어권이 넘어간것이다.
위 이야기를 코드로 아래 간단한 서블릿 프로그램과 같다.
String type = req.getParameter("type");
resp.setContentType("text/html; charset=UTF-8");
if("include".equals(type)) {
resp.getWriter().write("BEFORE INCLUDE<br/>");
RequestDispatcher dispatcher = req.getRequestDispatcher("inc.jsp");
dispatcher.include(req, resp);
resp.getWriter().write("<br/>AFTER INCLUDE");
System.out.println("AFTER INCLUDE");
} else if("forward".equals(type)) {
resp.getWriter().write("BEFORE FORWARD<br/>");
RequestDispatcher dispatcher = req.getRequestDispatcher("for.jsp");
dispatcher.forward(req, resp);
resp.getWriter().write("<br/>AFTER FORWARD");
System.out.println("AFTER FORWARD");
}
두개 만들기가 귀찮아서 request의 type 파라미터에 의해 분기처리 하도록 했다.
위 프로그램에 대한 화면 출력은 어떨것인가?
1. include
BEFORE INCLUDE
*** INCLUDE JSP CONTENT***
AFTER INCLUDE
2. forward
*** FORWARD JSP CONTENT***
이제 차이를 알거 같은가?
include는 include 구문 전 후에 write 한 데이터를 유지하는 반면
forward는 forward 된 url의 jsp contents 만을 보여주고 있다.
제어권을 넘긴다는 의미는 response에 write 할 수 있는 제어권을 넘긴다는것과 비슷한 의미를 가질 수 있다고 생각하면 될거 같다.
뭐........ 그렇다는거다..
오늘의 뻘글 끄읏;