Dispatcher방식과 Redirect 방식
Dispatcher방식과 Redirect 방식
서블릿에서 특정 URL이나 페이지로 이동하게 하는 두 가지 방식이 있는데, 두 방식의 차이점에 대해 알아보자.
1. Dispatcher방식 -->forward()
forward()[전달하기]는 클라이언트가 요청하면서 전송한 데이터를 그대로 유지한다.
(1) 예제
RequestDispatcher dispatcher = request.getRequestDispatcher("dispatcher.jsp");
request.setAttribute("request","requestValue");
dispatcher.forward(request, response);
dispatcher.jsp
request 속성 값 : <%=request.getAttribute("request") %>
포워딩이 되더라도 주소가 변경되지 않는다. (같은 request영역을 공유하게 됨)
1) 송신
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Round14_06_Servlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
request.setCharacterEncoding("euc-kr");
//한글 변환 Encode 설정
String area = request.getParameter("area");
//지역 정보만 먼저 가져온다.
ServletContext context = this.getServletContext();
//서블릿 환경 객체의 값을 획득한다. 이 객체가 있어야 RequestDispatcher 객체를 생성할 수 있다.
RequestDispatcher dispatcher = null;
response.setContentType("text/html;charset=euc-kr");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("서울 지역 관련 정보<br/>");
dispatcher = context.getRequestDispatcher("/Servlet06_Seoul");
dispatcher.include(request, response);
//서울 지역 관련 정보를 include 한다.
out.println("<br/><br/>");
out.println("대구 지역 관련 정보<br/>");
dispatcher = context.getRequestDispatcher("/Servlet06_Taegu");
dispatcher.include(request, response);
//대구 지역 관련 정보를 include 한다.
out.println("</body></html>");
out.close();
if(area == null) { //라디오 버튼 체크를 하지 않았다면
response.sendError(512, "라디오 버튼 체크 오류!!!");
return;
}
else if(area.equals("서울")) { //서울 지역을 체크 했다면
dispatcher = context.getRequestDispatcher("/Servlet06_Seoul");
//서울 지역에 대한 서블릿으로 위치를 이동할 수 있도록 객체 생성
}
else if(area.equals("대구")) { //대구 지역을 체크 했다면
dispatcher = context.getRequestDispatcher("/Servlet06_Taegu");
//대구 지역에 대한 서블릿으로 위치를 이동할 수 있도록 객체 생성
}
dispatcher.forward(request, response);
//설정된 Dispatcher로 요청과 응답 권한을 넘기는 작업
}
}
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Round14_06_Seoul_Servlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
request.setCharacterEncoding("euc-kr");
//넘어온 데이터에 대한 POST 방식 한글 처리
String name = request.getParameter("name");
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String area = request.getParameter("area");
//forward에 의해 이동이 이루어 지면 request 영역은
//보존되기 때문에 그대로 데이터를 추출해 낼 수 있다.
response.setContentType("text/html;charset=euc-kr");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("그러므로 당신의 이름이 " + name);
out.println("이라는 말이고,<br/>");
out.println("당신이 사용하려는 아뒤가 " + id);
out.println("라는 말인가?");
out.println("</body></html>");
//out.close();
}
}
2. Redirect 방식 --> sendRedirect()
Redirect()[이동하기]는 새로운 페이지로 완전히 이동해서 기존 데이터를 하나도 사용할 수 없다.
request.setAttribute("request", "requestValue");
response.sendRedirect("redirect.jsp");
redirect.jsp
request 속성 값 : <%=request.getAttribute("request") %> // null
포워딩될 때 브라우저의 주소 표시줄의 URL이 변경된다. 포워딩된 jsp페이지에서는 서블릿에서 request영역에 공유한 속성값에 접근 할 수 없다.
(1) 예제
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Round14_05_Servlet extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
//한글 데이터가 없기 때문에 Encode 설정 하지 않음.
String method = request.getMethod();
//요청 메서드를 얻어내는 작업
if(method.equalsIgnoreCase("GET")) {
//요청 방식이 GET이라면
response.sendRedirect("http://localhost:8080/Round14/Round14_05_Get_Servlet.htm");
//Round14_05_Get_Servlet.htm으로 이동한다.
return;
}
else if(method.equalsIgnoreCase("POST")){
//요청 방식이 POST라면
response.sendRedirect("Round14_05_Post_Servlet.htm");
//Round14_05_Post_Servlet.htm으로 이동한다.
return;
}
}
}
출처: https://devbox.tistory.com/entry/Comporison-Dispatcher방식과-Redirect-방식?category=577782 [장인개발자를 꿈꾸는 :: 기록하는 공간]