finerss's world!

RequestDispatcher 에는 두개의 메소드, forward()와 include()만 있는데

둘다 Request와 Response 객체를 인자로 한다.(작업을 받은 컴포넌트와 작업을 하려면 이 두 객체가 필요하기떄문).

RequestDispatcher를 얻는 방법은 두가지가 있는 데 첫 번째가 Request고 다른하나는 컨텍스트이다.

둘중 어느 객체로부터 리턴을 받든지 간에 Request를 넘길 웹 컴포넌트가 무엇이다라는 것을 알려주어야 한다.


ServletRequest로부터 RequestDispatcher를 리턴받는경우

RequestDispatcher view = request. getRequestDispatcher("result.jsp");

ServletRequest의 getRequestDispatcher()메소드는 Request를 넘길(foward) 자원에 대한 경로(String)를

인자로 한다. 경로가 /로 시작하는 경우 컨테이너는 "웹 애플리케이션의 루트로 시작하는군" 이라고 생각하며,

/로 시작하지 않으면 "원래 Request의 경로에  상대경로로 시작하는 군" 이라고 생각한다.

또한 현재 웹 애플리케이션의 루트 경로보다 상위 경로로 빠져 나가 다른 곳으로 경로를 지정할수 없다


ServletContext로부터 RequestDispatcher를 리턴받는경우

RequestDispatcher view = getServletContext().getRequestDispatcher("/result.jsp");    
//SerbletContext의 getRequestDispatcher() 메소드에서는 반드시 /가 제일 앞에 와야한다
ServletRequest와 마찬가지로, getRequestDispatcher() 메소드도 Request를 넘길(foward) 자원에 대한 경로(String)를

인자로한다 다른 점이 있다면 상대경로를 사용할 수 없다는 것이다. 즉  반드시 /를 시작으로 절대 경로를 명시하여야한다.

RequestDispatcher의 foward() 메서드 호출하기

view.forward(request, response);

Request로부터 리턴받았든, 컨텍스트로부터 리턴받았든지간에 RequestDispatcher는 Request를 넘길 자원이 무엇인지

이미 알고있다. 이미 getRequestDispatcher() 메소드의 인자로 이를 넘겼기떄문이다.

그렇기떄문에 단지 forward()에 request와 response를 넣어 명시한 컴포넌트로 넘기기만 하면 된다.



*RequestDispatcher의 include() 메서드
include() 메소드는 어떤 작업을 처리하기 위해 다른 곳으로(보통 다른 서블릿) 요청을 넘겼다가, 작업이 완료되면

다시 요청을 받는다. 즉 include() 메소드 요청을 처리하기 위해 도움을 청하는 것이지, 완전히 일을 끝내고 손을 떼는것이 아니다.

forward()는 "이게 다야 더이상 request와 response에 대해 할일이 없다" 라는 것이면

include()는 "request와 response에 대해 이일 좀해줘 근데 일이 끝나면 request와 response에대한 마무리 작업은 내가 할게,
(문론 바로 안끝내고 또 다른 include()나 forward() 작업을 할수도 있다)
그러니 다시 나에게 넘져줘"

라고 볼수있다.


*xx.flush();
클라이언트에게 응답을 보내는 메서드이다. 여기서 응답은 이미 보내졌고, 종료되고, 끝이났다는 말이다

그러므로 이뒤에는 request를 다른곳으로 넘길수없다. forward() 할수없다는뜻이다.

'공부 > Sevlets&JSP' 카테고리의 다른 글

Session Listener(세션 리스너)  (0) 2011.06.30
세션(sisson) 관리  (0) 2011.06.29
동기화  (0) 2011.06.29
Attribute(속성)  (0) 2011.06.28
ServletContextListener  (0) 2011.06.27