웹 개발 기초/자바 웹을 다루는 기술

HttpServletRequest를 이용한 dispatch 포워딩 시 바인딩

sungw00 2023. 2. 18. 20:49
728x90

앞서 redirect 방식을 이용하여 포워딩 시 바인딩을 하게 되면 정상적으로 원하는 결과가 출력되지 않는 점이 있었다.

이를 해결하기 위해 RequestDispatcher 클래스를 이용해서 바인딩해보자.

 

// FirstServlet.java
package sec04.ex02;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
/**
 * Servlet implementation class FirstServlet
 */
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
		System.out.println("FirstServlet init 메서드 호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("FirstServlet destroy 메서드 호출");
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=utf-8");
		request.setAttribute("address", "서울시 강서구"); // 웹 브라우저의 최초 요청 request에 바인딩
		// 바인딩된 request를 다시 두 번째 서블릿으로 포워딩
        RequestDispatcher dispatch = request.getRequestDispatcher("second");
		dispatch.forward(request, response);
	}

}
// SecondServlet.java
package sec04.ex02;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
/**
 * Servlet implementation class SecondServlet
 */
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
		System.out.println("SecondServlet init 메서드 호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("SecondServlet destroy 메서드 호출");
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	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");
		String address = (String)request.getAttribute("address"); // 전달된 request에서 getAttribute( )를 이용해 주소를 받아옴
		out.println("<html><body>");
		out.println("주소:" + address);
		out.println("<br>");
		out.println("dispatch를 이용한 바인딩 실습입니다.");
		out.println("</body></html>");
	}

}

dispatch를 이용하면 정상적으로 주소가 출력된다.

이 포워딩 과정을 보면 첫 번째 서블릿에서 두 번째 서블릿으로 전달되는 request가 브라우저를 거치지 않고 바로 전달됨

따라서 첫 번째 서블릿의 request에 바인딩 된 데이터가 그대로 전달된 것

 

모델2, 스트럿츠, 스프링 프레임워크로 개발할 때는 이처럼 dispatch 방식으로 바인딩된 데이터를 서블릿이나 JSP로 전달함

728x90