프로그래밍 언어/자바 웹

dispatch를 이용한 포워드 방법

· 코딩마이데이

dispatch를 이용한 포워드 방법

dispatch를 이용한 포워딩 과정이 redirect 방법과 다른 점은 클라이언트의 웹 브라우저를 거치지 않고 서버에서 포워딩이 진행된다는 것입니다. 따라서 웹 브라우저 주소창의 URL이 변경되지 않습니다. 즉, 클라이언트 측에서는 포워드기 진행되었는지 알 수 없습니다. 즉, 클라이언트 측에서 포워드가 진행되었는지 알 수 없습니다.

1. 클라이언트의 웹 브라우저에서 첫 번째 서블릿에 요청합니다.

2. 첫 번째 서블릿은 RequestDispatch를 이용해 두 번째 서블릿으로 포워드합니다.

 

서블릿을 이용한 dispatch 포워딩 실습

1. sec03.ex01 패키지에 다음과 같이 두 개의 서블릿 클래스를 추가합니다.

실습 파일 위치

 

2. FirstServlet 클래스를 다음과 같이 작성합니다. RequestDispatcher 클래스를 이용해 두 번째 서블릿인 second를 지정한 후 forward() 메서드를 이용해 포원드합니다.

package sec03.ex01;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/first")
public class FirstServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		RequestDispatcher dispatch = request.getRequestDispatcher("second");
		dispatch.forward(request, response);
	}
}

 

3. 두 번째 서블릿인 SecondServlet 클래스를 다음과 같이 작성합니다.

package sec03.ex01;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/second")
public class SecondServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("<html><body>");
		out.println("dispatch를 이용한  forward 실습입니다.");
		out.println("</html></body>");
	}
}

 

4. 실행해 보면 웹 브라우저 주소 창의 URL이 변경되지 않고 그대로입니다. 이는 서블릿의 포워드가 서버에서 수행되었기 때문입니다.

매핑 이름 first로 요청한 결과

 

 

5. 이번에는 dispatch로 이용해 전송할 때 GET 방식으로 데이터를 전송해 봅시다. 앞의 서블릿 클래스를 다음과 같이 수정합니다. 서블릿 이름 다음에 ?name=lee를 추가하여 GET 방식으로 name 값을 두 번째 서블릿으로 전달합니다.

package sec03.ex01;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/first")
public class FirstServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		RequestDispatcher dispatch = 
				request.getRequestDispatcher("second?name=lee");
		dispatch.forward(request, response);
	}
}

 

6. dispatch를 이용해 전달된 name 값으로 출력합니다.

package sec03.ex01;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/second")
public class SecondServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String name = request.getParameter("name");
		out.println("<html><body>");
		out.println("이름:" + name);
		out.println("<br>");
		out.println("dispatch를 이용한  forward 실습입니다.");
		out.println("</html></body>");
	}
}

 

7. GET 방식으로 dispatch를 이용해 데이터를 전달해도 웹 브라우저의 URL은 변경되지 않습니다.

매핑 이름 first로 요청한 결과