1. 리다이렉트
클라이언트의 리퀘스트를 처리한 후, 웹 컨테이너는 sendRedirect() 메소드가 호출되면 브라우저에 응답을 보낸다. 이 응답에는 브라우저가 웹 컨테이너의 응답을 받은 후 다시 리퀘스트를 보낼 새로운 URL이 포함해서 클라이언트에게 응답을 보낸다. 여기에서 하나의 리퀘스트가 종결되는 것이다. 새로 부여받은 URL로 브라우저에서 완전히 새로운 리퀘스트를 요청하기 때문에 리퀘스트의 속성으로 저장되어 있는 객체도 리다이렉트가 발생하기 전에 소멸된다.
리다이렉트는 추가적으로 발생한 왕복 처리 때문에 디스패치보다 느리다. 기억해야 할 것은 최종적으로 수행하는 작업은 새로운 리퀘스트에 의한 것이고, 이 것을 클라이언트가 알고 있기 때문에 브라우저 창의 주소가 처음 요청한 주소가 아니고 최종 주소 값으로 변한다. 또한 하나의 리퀘스트 별로 리퀘스트에 담겨있던 객체들은 소멸되어 다음 작업까지 전달되지 않는다는 점이다.
response.sendRedirect("http://www.example.com");
2. 디스패치
리퀘스트를 디스패치할 때 해당 리퀘스트는 서버의 다른 자원(서블릿)에 전달된다. 이 때에는 다른 자원에서 이 리퀘스트를 처리할 것을 클라이언트에 알리지 않는다. 이런 방식의 처리는 웹 컨테이너 안에서만 일어나고, 클라이언트는 알 수 없게 된다. 디스패치는 리다이렉트와는 다르게 객체를 리퀘스트에 담고 해당 리퀘스트를 사용할 다음 자원에 전송한다.
클라이언트는 디스패치가 발생한 사실을 알지 못한다. 디스패치는 클라이언트와 통신 없이 서버에서만 처리되기 때문에 리다이렉트보다 나은 성능을 보여준다
(1) ServletRequest로부터 RequestDispatcher를 얻는 경우
RequestDispatcher dispatcher = request.getRequestDispatcher("output.jsp");
dispatcher.forward(request, response);
: 이 경우 "output.jsp" 의 앞에 "/" 경로가 생략되었기 때문에 최초 요청이 들어온 논리적인 위치를 찾아서 전체 경로를 사용한다.
(2) ServletContext로부터 RequestDispatcher를 얻는 경우
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/output.jsp");
: 이 경우 "/output.jsp" 의 앞에 반드시 "/" 경로 문자가 와야 한다. (상대 경로를 사용할 수 없다.)
'내가 하는일 > JAVA' 카테고리의 다른 글
Android Add on 설치시 액세스 권한 문제 (0) | 2011.04.22 |
---|---|
Android 시작하기!! (0) | 2011.04.22 |
세션과 쿠키 관련 (0) | 2011.03.02 |
html escap 문자 (0) | 2011.01.11 |
짜증나는것들....별것도 아닌데.... (0) | 2011.01.06 |