리다이렉트 (redirect)
- 서버는 클라이언트의 요청에 대해 특정 URL로 이동을 요청할 수 있다. 이를 리다이렉트라고 한다.
- 웹 페이지의 URL을 자동으로 바꾸고 싶을 때에 사용한다.
- 서버는 클라이언트에게 HTTP 상태코드 302로 응답하는데 이때 헤더 내 Location 값에 이동할 URL 을 추가한다. 클라이언트는 리다이렉션 응답을 받게 되면 헤더(Location)에 포함된 URL로 재요청을 보내게 된다. 이때 브라우저의 주소창은 새 URL로 바뀌게 된다..
- 클라이언트는 서버로부터 받은 상태 값이 302이면 Location헤더값으로 재요청을 보내게 된다. 이때 브라우저의 주소창은 전송받은 URL로 바뀌게 된다.
- 서블릿이나 JSP는 리다이렉트하기 위해 HttpServletResponse 클래스의 sendRedirect() 메소드를 사용한다.
- 리다이렉트는 HTTP 프로토콜로 정해진 규칙이다.
리다이렉트 (redirect) 실습 코드
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
response.sendRedirect("redirect02.jsp");
%>
redirect01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
redirect 된 페이지입니다 !!
</body>
</html>
redirect02.jsp
url에 http://localhost:8080/firstweb/redirect01.jsp 라고 입력하면
클라이언트는 http 상태코드 302를 받고, http://localhost:8080/firstweb/redirect02.jsp 로 재요청을 보내게 된다.
- 웹 브라우저가 redirect01.jsp을 요청
- redirect01은 redirect02.jsp로 리다이렉팅하는 로직이 실행되도록 함
브라우저에서 확인해보자.
여기서 기억할 점은 !!
웹 브라우저(클라이언트)가 서버에 두 번의 요청을 보낸다는 것이다.
그리고 이 두번의 요청에서 요청 객체와 응답 객체가 다르다는 것을 기억하자
forward란?
- 서블릿의 결과를 JSP로 보냄
- 웹 브라우저에서 Servlet1에게 요청을 보냄
- Servlet1은 요청을 처리한 후, 그 결과를 HttpServletRequest에 저장
- Servlet1은 결과가 저장된 HttpServletRequest와 응답을 위한 HttpServletResponse를 같은 웹 어플리케이션 안에 있는 Servlet2에게 전송(forward)
- Servlet2는 Servlet1으로 부터 받은 HttpServletRequest와 HttpServletResponse를 이용하여 요청을 처리한 후 웹 브라우저에게 결과를 전송
포워드 (forward) 실습 코드
package examples;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/front")
public class FrontServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public FrontServlet() {
super();
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int diceValue = (int)(Math.random() * 6) + 1;
// NextServlet 에서 사용하기 위해 diceValue를 request 객체에 맡겨놓음
request.setAttribute("dice", diceValue); //맡길 때 식별하기 위한 값, 맡길 값
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/next"); // 이동할 매핑주소
requestDispatcher.forward(request, response);
}
}
FrontServlet.java
** forward할 경로를 쓸 때 반드시 /로 시작해야한다. - 같은 웹 어플리케이션 안에서만 가능하다.
package examples;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/next")
public class NextServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public NextServlet() {
super();
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
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"); // 맡긴 값을 찾아옴, 식별값을 정확히 가져와야함, 오브젝트로 받기 때문에 Integer로 형변환
out.println("dice : " + dice);
for(int i = 0; i < dice; i++) {
out.print("<br>hello");
}
out.println("</body>");
out.println("</html>");
}
}
NextServlet.java
여기서 주목할 점은 !!
url 이 바뀌지 않았다는 것이다.
리다이렉트에서는 redirect01 에서 redirect02로 url 이 변경되었다면,
포워드에서는 front에서 next로 url 이 변경되지 않았다.
포워드와 리다이렉트의 차이
forward는 하나의 요청과 응답객체를 유지한 채 작업이 이루어지지만
redirect는 하나의 서블릿의 요청과 응답이 끝나면 새로운 요청과 응답이 시작되면서 작업이 끝남
forward는 하나의 요청과 응답객체를 사용하고 redirect는 여러개의 요청과 응답객체를 사용함
redirect는 요청이 여러번이라 request, response객체가 여러번 만들어지지만, forward는 요청이 한번이라 한번만 만들어진다.
'Programming > JSP & Servlet & Mysql' 카테고리의 다른 글
부스트캠프 2) REST API 란? (0) | 2020.11.21 |
---|---|
부스트캠프 1) JDBC - mysql 연동하기 for mac (0) | 2020.11.19 |
실습 9) JSP 내장 객체 (0) | 2020.11.11 |
실습 8) JSP 문법 (0) | 2020.11.11 |
실습 7) JSP란? JSP와 서블릿의 차이, JSP 라이프사이클 (0) | 2020.11.11 |