[Jsp] Forward & Bind
# Forward
- 프로그램 구동 시, 서블릿과 서블릿 혹은 서블릿과 Jsp 간의 연동 작업이 필요한 경우 사용하는 방법
- Model2에서 서블릿에서 Jsp로 정보를 전달하는 경우 자주 사용된다.
장점 |
요청에대한 추가 작업을 다른 서블릿이 수행하도록 한다. |
요청에 포함된 정보를 다른 서블릿이나 JSP와 공유할 수 있다. |
요청에 다른 정보를 포함시켜 다른 서블릿에 전송할 수 있다. |
# 1 Redirect
- 응답 객체 (HttpServletResponse) 의 sendRedirect 메소드를 이용
- 웹 브라우저에 재 요청하는 방식
- GET 방식으로 값을 전송하는 경우, 받는 쪽 서블릿에서는 REQUEST객체의 getParameter메소드로 받을 수 있다.
# 기본적인 형태
response.sendRedirect("포워드할 서블릿 또는 JSP");
# GET방식의 REDIRECT
response.sendRedirect("test.do?변수1=값1&변수2=값2");
(1) 클라이언트의 웹 브라우저에서 SERVLET(1)로 요청
(2) 서블릿(1)에서 sendRedirect 메소드로 서블릿(2) 을 웹 브라우저를 통해서 재 요청
(3) 웹 브라우저에서 재 요청한 두번째 서블릿을 다시 요청
# 2 Refresh
- 응답 객체 (HttpServletResponse) 의 addHeader 메소드를 이용
- 웹 브라우저에 재 요청하는 방식
response.addHeader("Refresh",경과시간(초);"url=요청할 서블릿 또는 JSP");
(1) 클라이언트의 웹 브라우저에서 서블릿(1)로 요청
(2) 서블릿(1)에서 addHeader 메소드로 서블릿(2) 을 웹 브라우저를 통해서 재 요청
(3) addHeader에 지정된 시간(초) 가 지난 뒤 웹 브라우저에서 재 요청한 두번째 서블릿을 다시 요청
# 3 location.href
- 자바스크립트 location 객체의 herf 속성을 이용
- 자바스크립트에서 재 요청하는 방식 (서버에 접근하지 않고 처리)
- get 방식처럼 뒤에 ? 맵핑 주소와 파라미터를 붙여 파라미터와 함께 전송할 수 있다.
location.href = '요청할 서블릿 또는 jsp';
# 4 dispatcher
- RequestDispatcher 클래스를 사용하는 방식 (기본적인 포워딩 방식)
- 요청 영역에 요청받은 요청 객체를 저장한 뒤 포워딩으로 다른 Jsp 페이지로 넘기는 역할
- 서블릿이 직접 요청하는 방식으로 forward 메소드를 사용
- 서버에서 진행하므로 URL이 변경되지 않고 진행된다. (클라이언트에서는 변경되는 것을 알 수 없다.)
# 기본적인 형태
RequestDispatcher disp = request.getRequestDispatcher("포워드할 서블릿 혹은 JSP");
disp.forward(request, response);
# get방식의 포워딩
RequestDispatcher disp = request.getRequestDispatcher("test.do?변수1=값1&변수2=값2");
disp.forward(request, response);
(1) 클라이언트의 웹브라우저에서 첫번째 서블릿에 요청
(2) 서블릿(1)에서 RequestDispatcher를 이용하여 서블릿(2)로 포워드
# Bind
- FOWARD에서 GET방식으로 전달할 수 없는 큰 데이터를 전송해야하는 경우 사용한다.
- 웹 프로그램 실행 시, 서블릿 관련 객체에 데이터(자원)를 저장하는 방법
- 관련 객체로는 HttpServletRequest, HttpSession, ServletContext등이 있다.
- BIND은 POST방식의 전송만 가능하다.
request.setAttribute("바인딩하는 데이터의 명칭", 데이터);
메소드
메소드
|
설명
|
setAttribute(String name, Object obj)
|
데이터를 객체에 바인딩 |
getAttribute(String name)
|
객체에 바인딩된 데이터를 name값 기준으로 가져온다. |
removeAttribute(String name)
|
객체에 바인딩된 데이터를 name값 기준으로 제거한다. |
[참고] 웹 브라우저 재 요청 방식의 경우, BIND 방식을 사용할 수 없다.
- redirect처럼 웹 브라우저에서 재 요청하는 방법의 경우 바인딩 방식으로 값을 전송할 수 없다.
- 사진의 (1)에의 요청와 요청 (2)의 는 서로 다른 요청이기 때문이다.
- get방식으로 전송 자체는 가능하나, 보안상의 문제와 대용량의 데이터를 전송할 수 없다는 문제가 있다.
타입
|
설명
|
dispatcher
|
- 요청, 응답 객체를 함께 넘긴다.
- 서버에서만 작업이 진행되므로 url이 변경되지 않는다.
|
sendRedirect
|
- 요청, 응답 객체가 새롭게 생성된다.
- 완전히 새로운 페이지로의 호출이 있으므로 url이 변경된다.
[예시] a.jsp >>> b.jsp a에서 b로 redirect시 클라이언트에게 redirect할 b를 리턴하고 클라이언트는 b페이지로 다시 새로운 요청을 생성하여 보내게되면서 처음 a로 요청했던 requsetScope에 담긴 정보는 초기화된다. |
포워드와 바인드의 차이
타입
|
설명
|
예시
|
forwarding |
요청을 서블릿에서 직접 처리하지 않고 다른 서블릿으로 위임
|
forward(요청객체, 응답객체);
|
binding |
서블릿에서 다른 서블릿으로 데이터 공유
|
request.setAttribute("requestScope 명칭", 데이터);
|
전송 방식 차이
타입
|
설명
|
dispatcher
|
EL표기법을 통해서 데이터를 뿌려줘야하는 상황(바인딩, 포워딩)에서 사용한다.
|
sendRedirect
|
따로 뿌려줘야할 데이터가 없고 페이지 새로고침이 있어야하는 경우, get방식으로만 파라미터 전송이 가능하다.
|
location.href
|
페이지로 파라미터등을 보내거나 페이지 새로고침등의 작업이 가능하지만 get방식만 가능하다.
|