클라이언트가 문서1을 요청하는데 그 과정에서 문서2가 필요한 경우, 문서 이동이 필요하다.
특정 Servlet이나 JSP에 대한 요청을 다른 Servlet이나 JSP로 넘겨준다. 이때 HttpServletRequest
객체와 HttpServletResponse
객체를 공유하며 RequestDispatcher
를 사용하여 제어를 전달한다.
주로 같은 서버 내에서의 이동에 사용하며, URL 주소에 변동이 없다.
MVC 패턴에서 문서1은 Controller(Servlet), 문서2는 View(JSP)이다.
- 클라이언트가 문서1을 요청한다. (
request
,response
생성)- 문서1에서 문서2로 제어를 전달한다.
-> 문서1에서 생성된request
객체와response
객체를 전달한다.
Request객체.setAttribute("key값", 데이터)
- 문서2는 문서1이 전달한 데이터를 읽어온다.
Request객체.getAttribute("key값")
- 이동할 서블릿 혹은 경로를 지정해 준다. 경로는 URI 경로 중 Context Path 이후의 경로를 지정한다.
RequestDispatcher rd = Request객체.getRequestDispatcher("/경로")
- 문서2에서 만들어진 결과를 클라이언트에게 응답한다.
다른 서버의 문서로 이동이 가능한 방식이다. URL 주소에 변동이 있다. (문서1에 대한 주소였다가 문서2에 대한 주소로 변동)
응답시 브라우저에게 이동할 URL을 전송하여 브라우저가 해당 URL로 이동하는 방식이다.
브라우저에게 새롭게 요청하기 때문에 HttpServletRequest
객체와 HttpServletResponse
객체를 공유할 수 없다.
- 클라이언트가 문서1을 요청한다. (
request
,response
생성)- 문서1에서 문서2의 주소를 응답한다. (
request
,response
소멸)- 웹 브라우저가 문서2를 재요청한다. (1번과 다른
request
,response
생성)
Response 객체의sendRedirect()
메서드에 이동할 서블릿이나 JSP 문서의 전체 URL 경로를 지정한다.
이동할 URL 경로에 한글이 포함될 경우 URLEncoder 객체의encode()
메서드로 인코딩을 지정해야 한다.- 문서2에서 클라이언트에게 응답한다.
<%@ 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>
<h3>forward 방식과 redirect 방식 연습하기</h3>
<form action="<%=request.getContextPath() %>/forwardTest01.do">
forward 방식: <input type="text" name="username">
<input type="submit" value="확인">
</form>
<form action="<%=request.getContextPath() %>/redirectTest01.do">
redirect 방식: <input type="text" name="username">
<input type="submit" value="확인">
</form>
</body>
</html>
package servlet;
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("/forwardTest01.do")
public class ForwardTest01 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
request.setAttribute("tel", "010-1234-5678");
RequestDispatcher rd = request.getRequestDispatcher("/forwardTest02.do");
rd.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
package servlet;
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("/forwardTest02.do")
public class ForwardTest02 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String userName = request.getParameter("username");
String tel = (String)request.getAttribute("tel");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><meta charset='utf-8'><title>forward 방식 연습</title></head>");
out.println("<body>");
out.println("<h3>forward 결과</h3>");
out.println("<table border='1'>");
out.println("<tr><td>이름</td><td>" + userName + "</td></tr>");
out.println("<tr><td>전화번호</td><td>" + tel + "</td></tr>");
out.println("</body></html");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
package servlet;
import java.io.IOException;
import java.net.URLEncoder;
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("/redirectTest01.do")
public class RedirectTest01 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String userName = request.getParameter("username");
String tel = "010-1234-5678";
response.sendRedirect(request.getContextPath() + "/redirectTest02.do?name=" + URLEncoder.encode(userName, "utf-8") + "&tel=" + tel);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
package servlet;
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("/redirectTest02.do")
public class RedirectTest02 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String userName = request.getParameter("name");
String tel = request.getParameter("tel");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><meta charset='utf-8'><title>redirect 방식 연습</title></head>");
out.println("<body>");
out.println("<h3>redirect 결과</h3>");
out.println("<table border='1'>");
out.println("<tr><td>이름</td><td>" + userName + "</td></tr>");
out.println("<tr><td>전화번호</td><td>" + tel + "</td></tr>");
out.println("</body></html");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}