출처: http://playgame.egloos.com/284355
eggrok
[java] What is difference between redirect and request dispatch 본문
[java] What is difference between redirect and request dispatch
the awesomest 2012. 4. 18. 21:29웹 개발을 하다보면 반드시 마주치는게 아닐까 싶다. Redirect ? Dispatcher ? 둘다 하는일은 비슷하지만 동작 원리는 근본적으론 완전히 틀리다. 아마 스트럿츠를 개발해본 사람이 있다면 Dispatcher에 익숙해 있을 것 같다.
쉽게 설명 하자면 Dispatcher는 서버에서 페이지를 돌리고(위임), Redirect는 클라이언트에게 '지정된 페이지로 이동'하라고 지시 한다. 두 방식을 설명할 초간단 서블릿을 작성해 보았다.
DispatcherTest.java
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class DispatcherTest extends javax.servlet.http.HttpServlet
- implements javax.servlet.Servlet {
- static final long serialVersionUID = 1L;
- public DispatcherTest() {
- super();
- }
- protected void doGet(HttpServletRequest request,
- HttpServletResponse response) throws ServletException, IOException {
- this.doPost(request, response);
- }
- protected void doPost(HttpServletRequest request,
- HttpServletResponse response) throws ServletException, IOException{
- javax.servlet.RequestDispatcher dispatcher
- = request.getRequestDispatcher("/index.html");
- dispatcher.forward(request, response);
- }
- }
RedirectTest.java
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class RedirectTest extends javax.servlet.http.HttpServlet
- implements javax.servlet.Servlet {
- static final long serialVersionUID = 1L;
- protected void doGet(HttpServletRequest request,
- HttpServletResponse response) throws ServletException, IOException {
- this.doPost(request, response);
- }
- protected void doPost(HttpServletRequest request,
- HttpServletResponse response) throws ServletException, IOException {
- response.sendRedirect("/index.html");
- }
- }
주소창을 보면 확실히 알 수 있다. DispatcherTest.java의 경우 URL은 그대로지만 페이지는 바뀌었다. RedirectTest.java는 URL자체가 바뀌었다. 스트럿츠에서 컨트롤러 -> 뷰 로 이동하는 것이 바로 이렇게 구현 된 것이다. 그렇다고 아무렇게나 막 쓸수 있을까 ..?
그것은 아니다. 단 한번이라도 출력이 되었을 경우(OutputStream을 이용해 출력된 것) IllegalStateException이 발생하게 된다. 이것은 당연한 것이다. 페이지를 전환하려고 하는데 한번이라도 flush를 하게 되면 뭔가 모양이 이상하니 말이다. 그렇다고 반드시 일어나는 것은 아니다.
운이 좋으면 flush가 되지 않으면 예외가 발생하지 않는다. 그렇다고 믿으면 안된다. 이것은 어디까지나 버퍼가 차지 않아 출력하지만 않은것이니까 ....
From ==> http://blog.pupustory.com/169
============================================================================================================================================================================================================================================================
JSP Servlet : sendRedirect, forward 차이점
Posted on January 9, 2012
sendRedirect – 클라이언트가 인지함
이 메소드는 페이지 전환을 할때, 웹 컨테이너가 전환될 페이지의 URL을 부라우져로 보내어 다시 요청하게 만드는 방식으로 작동한다. 즉, A페이지를 요청했을 때, 이에대한 응답으로 B 페이지의 URL 이 전송되고 브라우저는 새로이 B 페이지를 요청하게 된다.
따라서 사용자는 페이지가 redirect 되었다는 것을 알 수 있다. 반면 A 페이지에서 B 페이지로 redirect 될때, A 페이지에서 포함된 파라미터 등은 B 페이지로 자동으로 전달되지 않는다.
forward – 클라이언트가 모름
이 메소드는 페이지 전환시 클라이언트를 거치지 않고 웹 컨테이너가 서버 내부에서 직접 다른 jsp 나 Servlet 를 호출해서 처리하는 방식이다. 클라이언트를 거치지 않고 페이지가 redirect 되므로 사용자는 페이지가 전환되었다는 것을 알지 못한다. 즉, A 페이지를 요청했는데 응답으로 B 페이지가 전송되는 방식이다.
따라서 A 페이지에서 사용된 파라미터가 B 페이지에 그대로 전달되며, 통신 과정이 생략되므로 좀더 빠르다고 할 수 있다. 단, URL 의 변화를 알 수 없다.
1. forward
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);
이런식으로 되구요…
2. sendRedirect
response.sendRedirect(url);
일케됩니다.
둘의 차이를 말씀드리면…
dispatcher.forward(request, response); 에서 보시는 바와같이 이녀석은
request 의 Attribute를 싫어나를 수 있습니다.
(ex : request.setAttribute(“test”,”테스트”); )
반면에 sendRedirect이넘으로 파라미터를 넘기는 방법은 get 방식처럼
url?test=테스트 이렇게만 가능하죠 ^^;
1.
test1.jsp
<%
String [] arr = {"테스트1","테스트2","테스트3"};
request.setAttribute("test",arr);
RequestDispatcher dispatcher = request.getRequestDispatcher("test.jsp");
dispatcher.forward(request, response);
%>
test.jsp
<%
String [] arr = (String[])request.getAttribute("test");
for(int i=0;i out.println(arr[i]+"
“);
}
%>
2. sendRedirect
test1.jsp
<%
response.sendRedirect("test.jsp?test=테스트");
%>
test.jsp
<%
out.println(request.getParameter("test"));
%>
'programming' 카테고리의 다른 글
[javascript] prototype? (0) | 2012.04.19 |
---|---|
[java] jsp, include 란? (0) | 2012.04.19 |
[java] connection의 setAutoCommit() (0) | 2012.04.18 |
[java] jsp 강의. (0) | 2012.04.15 |
[java] statement와 preparedStatement 의 차이, 특수문자 처리.. (0) | 2012.04.15 |