2013. 7. 29. 15:17

포워딩과  리다이렉트  


Forwarding, 포워딩

: 요청을  포워딩할  때  해당  요청은  서버의  다른  자원(서블릿  또는  JSP)  에  전달된다.  이때에는  다른  

자원에서  이  요청을  처리할  것을  클라이언트에  알리지  않는다.  이런  방식의 처리는  웹  컨테이너  안에

서만  일어나고,  클라이언트는  알 수  없게 된다. 포워딩은  리다이렉트와는  다르게 객체를  요청에  담고,  

해당 요청을  사용할  다음 자원에  전송한다.


 따라서 클라이언트는  포워딩이  발생한 사실을  알지  못한다.  포워딩은  클라이언트와  통신  없이  서버

에서만 처리되기  때문에 리다이렉트보다 나은 성능을 보여준다.



 ο 포워딩 (Forwarding) 요청을 포워딩할 때 해당 요청은 서버의 다른 자원(서블릿 또는 JSP) 에 전달된다. 이때에는 다른 자원에서 이 요청을 처리할 것을 클라이언트에 알리지 않는다. 이런 방식의 처리는 웹 컨테이너 안에서만 일어나고, 클라이언트는 알 수 없게 된다. 포워딩은 리다이렉트와는 다르게 객체를 요청에 담고, 해당 요청을 사용할 다음 자원에 전송한다. 따라서 클라이언트는 포워딩이 발생한 사실을 알지 못한다. 포워딩은 클라이언트와 통신 없이 서버에서만 처리되기 때문에 리다이렉트보다 나은 성능을 보여준다. request 객체와 response 객체는 포워딩된 서블릿(jsp)로 전달된다. - jsp 포워딩 


 - servlet 포워딩 
RequestDispatcher rd = request.getRequestDispatcher("/view/bbs/list.jsp"); rd.forward(request, response); 
- 포워딩될 jsp 또는 서블릿에 정보를 전달하는 방법 
request.setAttribute("name", "홍길동"); BoardDTO d=dao.getReadData(num); 
// 객체인 경우 request.setAttribute("dto", d); - 포워딩된 페이지에서 포워딩한 페이지가 전달(setAttribute)한 값 받는 방법 <%String name=(String)request.getAttribute("name"); BoardDTO d=(BoardDTO)request.getAttribute("dto"); %> <%=name%><%=d.getName()%>
 - 포워딩된 페이지(jsp)에서 포워딩한 페이지가 전달(setAttribute)한 값 받는 방법(EL)
 ${name} ${dto.name}   


test1_ok.jsp


//request 객체에 attribute를 저장
request.setAttribute("result", msg); //(String, Object) %>

안보이는 text
//전송되지 않는 소스

test1_for.jsp


 //포워딩 된 jsp 또는 servlet은 request와 response객체가 그대로 전달됨
 String name = request.getParameter("name"); //파라미터 받기 
 String msg = (String)request.getAttribute("result"); //설정한 Attribute값 가져오기
%>


<%=name %>님
<%=msg %>
//정상출력


 


 

Redirect, 리다이렉트

: 클라이언트의 요청을  처리 한 후, 컨테이너는 sendRedirect()  메소드가 호출되면 브라우저에  응답을 보낸다.  이 응답에는  브라우저가  웹  컨테이너의  응답을  받은 후  다시 요청을  보낼  새로운  URL  을 포함한다.  여기에서  하나의  요청이  종결된다.  새로  부여받은  URL  로  브라우저에서  완전히  새롭게 요청하기  때문에 이전의 요청 스코프에  저장되어  있는 객체는 새로운 요청  전에 소멸된다.


리다이렉트는 추가적으로  발생한 왕복  처리  때문에  포워딩보다  느리다.  기억해야  할  것은  최종적으

로  수행하는  작업은  새로운  요청에  의한  것이고,  이것을 클라이언트가  알고  있기  때문에 브라우저  창

의  주소가  처음  요청한  주소가  아니고  최종  주소  값으로  변한다.  또한  하나의  요청에  담겨있던  객체



ο 리다이렉트 (Redirect)

클라이언트의 요청을 처리 한 후, 컨테이너는 sendRedirect() 메소드가 호출되면 브라우저에 응답을  보낸다. 이 응답에는 브라우저가 웹 컨테이너의 응답을 받은 후 다시 요청을 보낼 새로운 URL 을 포함한다. 여기에서 하나의 요청이 종결된다. 새로 부여받은 URL 로 브라우저에서 완전히 새롭게 요청하기 때문에 이전의 요청 스코프에 저장되어 있는 객체는 새로운 요청 전에 소멸된다. 리다이렉트는 추가적으로 발생한 왕복 처리 때문에 포워딩보다 느리다. 기억해야 할 것은 최종적으로 수행하는 작업은 새로운 요청에 의한 것이고, 이것을 클라이언트가 알고 있기 때문에 브라우저 창의 주소가 처음 요청한 주소가 아니고 최종 주소 값으로 변한다. 또한 하나의 요청에 담겨있던 객체들은 소멸되어 다음 작업까지 전달되지 않는다.

 request 객체와 response 객체가 초기화 된다.


 - jsp 리다이렉트
   <%
        String cp=response.getContextPath();
    response.sendRedirect(cp+"/bbs/list.kh"); 
   %>


 - servlet 리다이렉트
   String cp=response.getContextPath();
   response.sendRedirect(cp+"/bbs/list.kh"); 



test2_ok.jsp

//request 객체에 attribute를 저장
request.setAttribute("result", msg); //(String, Object) %>

안보이는 text
//전송되지 않는 소스 <% //리다이렉트(클라이언트가 다시 요청하도록 함) //일반적으로 DB에 INSERT, UPDATE, DELETE하거나 loing, logout 후에 리다이렉트를 한다. response.sendRedirect("test2_rs.jsp");

test2_rs.jsp

 String name = request.getParameter("name");
 String msg = (String)request.getAttribute("result");
%>


리다이렉트 된 페이지
request, response는 초기화 된다.
이름 : <%=name %>
<%=msg %>




'JSP > JspServlet' 카테고리의 다른 글

액션 태그와 커스텀 태그  (0) 2013.07.29
파입업로드/다운로드  (0) 2013.07.29
JSP 페이지기본설정  (0) 2013.07.29
JSTL  (0) 2013.07.29
Servlet  (0) 2013.07.29
Posted by 1+1은?