Java

Dispatcher방식과 Redirect 방식

유호야 2020. 12. 4. 20:44
반응형

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로 요청과 응답 권한을 넘기는 작업

	}

}


2) 수신

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-방식

반응형

'Java' 카테고리의 다른 글

생성자(Constructor)  (0) 2020.12.05
EL(Expression Language)이란?  (0) 2020.12.05
RequestDispatcher란?  (0) 2020.12.04
.contains() .startwith()  (0) 2020.12.04
.substring() 메소드  (0) 2020.12.04