티스토리 뷰
1) redirect
- 서버가 클라이언트로 요청을 받은 후, 클라이언트에게 특정 URL로 이동하라고 요청할 수 있음
- 서버 -> 클라이언트: HTTP 상태코드 302, 이동할 URL을 헤더에 담아 전송
- 클라이언트: 서버로부터 받은 상태값이 302이면, 헤더값을 보고 해당 Location으로 이동 (즉 해당 페이지를 자동 요청)
- response 객체의 sendRedirect() 메서드를 이용하면 됨
- 크롬 개발자 도구의 Network 탭으로 가보면 302 응답코드를 확인할 수 있다
- 리다이렉트 대상 페이지를 다시 요청할 때는 또 새로운 request, response 객체가 생성된다
<%
response.sendRedirect("redirect02.jsp");
%>
2) forward
Client ->(request) -> Servlet 1 -> (forward) -> Servlet 2 -> (response) -> Client
- 요청을 해서 서블릿을 불렀는데 그 서블릿이 또 다른 서블릿을 불러서 처리를 분담하는 것
- 서버 내부적으로는 서블릿 2개가 쓰이지만 클라이언트 입장에선 1개의 요청, 1개의 응답
- 각 서블릿은 지역변수를 사용하므로, 서블릿 1이 뭔가 처리하고 나온 결과를 서블릿 2로 보내주기 위해 request 객체 안에 그 내용을 담아서 보내줌. response 객체도 같이 보내줌.
첫번째 서블릿:
> request.setAttribute("값이름", 값);
> RequestDispatcher reqDispatcher = request.getRequestDispatcher("포워딩할 URL");
> reqDispatcher.forward(request, response);
두번째 서블릿:
> request.getAttribute("값이름");
(예제)
Front_Servlet.java의 service 메서드:
int dice_value = (int)(Math.random()*6) + 1;
request.setAttribute("dice", dice_value); // request 객체에 dice라는 이름으로 값을 저장
RequestDispatcher req_dis = request.getRequestDispatcher("/next");
req_dis.forward(request, response);
Next_Servlet.java의 service 메서드:
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>form</title></head>");
out.println("<body>");
int dice = (Integer)request.getAttribute("dice"); // Object 타입으로 오기 때문에 형변환을 해줬다
out.println("dice : " + dice);
for(int i = 0; i < dice; i++) {
out.print("<br>hello");
}
out.println("</body>");
out.println("</html>");
- 실행하면 next가 아니라 front servlet의 URL에서 저 결과가 나오는 것을 확인할 수 있음. 언뜻 보면 next에 출력하는 로직이 있으니 URL이 next로 이동했을 것 같지만, 클라이언트 입장에선 front한테 요청을 보냈다.
이것이 redirect와의 결정적인 차이.
3) forward를 이용한 서블릿과 JSP의 연동
- 서블릿은 프로그램 로직을 수행하기에 적합하고, JSP는 HTML 등 결과를 출력할 때 더 편리하다
- 그러므로 서블릿에서 로직을 수행하고, 그 결과를 JSP로 포워딩하는 방법이 많이 사용됨
- 방법은 2) 에서 했던 거랑 똑같음. 다만 JSP에서 받을 때 스크립트릿 영역 안에서 결과값을 받는다는 점 정도.
request.getRequestDispatcher("/result.jsp");
req_dispatcher.forward(request, response);
->
<%
int value1 = (int)request.getAttribute("value1");
int value2 = (int)request.getAttribute("value2");
int result = (int)request.getAttribute("result");
%>
<%=v1%> + <%=v2 %> = <%=result %>
+ EL 표기법: JSP에서 자바코드를 줄이기 위해 도입된 축약 표기법. 비슷한걸로 JSTL이라는 것도 있다.
${value1 } + ${value2 } = ${result}
getAttribute() 를 쓰지 않아도 알아서 값을 꺼내온다.