티스토리 뷰

Servlet

서블릿 포워드(Forward)

dev23 2024. 8. 12. 13:38
반응형

포워드

- 하나의 서블릿에서 다른 서블릿이나 JSP 연동하는 방법을 포워드(forward)라고 한다.

- 포워드 기능이 사용되는 용도는 여러 가지이며 요약하면 다음과 같다.

 

  1. 요청에 대한 추가 작업을 다른 서블릿에게 수행하게 함
  2. 요청에 포함된 정보를 다른 서블릿이나 JSP와 공유할 수 있음
  3. 요청에 정보를 포함시켜 다른 서블릿에 전달할 수 있음
  4. 모델2 개발 시 서블릿에서 JSP로 데이터를 전달하는 데 사용

- 한마디로 포워드 기능은 서블릿에서 다른 서블릿이나 JSP로 요청을 전달하는 역할을 하며, 이 요청을 전달할 때 추가 데이터를 포함시켜 전달할 수도 있다.

- 모델2 개발방식으로 애플리케이션을 개발할 경우 서블릿에서 JSP로데이터를 전달할 주로 사용된다.

 

여러 가지 포워드 방법

- 서블릿에서 사용되는 포워드 방법에는 네 가지가 있다.

 

 1. redirect 방법

  • HttpServletResponse 객체의 sendRedirect() 메서드를 이용.
  • 웹 브라우저에 재요청하는 방식
  • 형식 : sendRedirect("포워드할 서블릿 또는 JSP");

 

 2. Refresh 방법

  • HttpServletResponse 객체의 addHeader() 메서드를 이용
  • 웹 브라우저에 재요청하는 방식
  • 형식 : response.addHeader("Refresh", 경과시간(초); url=요청할 서블릿 또는 JSP");

 

 3. location 방법

  • 자바스크립트 location 객체의 href 속성을 이용
  • 자바스크립트에서 재요청하는 방식
  • 형식 : location.href='요청할 서블릿 또는 JSP';

 

4. dispatch 방법

  • 일반적으로 포워딩 기능을 지칭
  • 서블릿이 직접 요청하는 방법
  • RequestDispatcher 클래스의 forward() 메서드를 이용
  • 형식 : RequestDispatcher dis = request.getRequestDsipatcher("포워드할 서블릿 또는 JSP");
    dis.forward(request, response);

- redirect, refresh, location 방법 서블릿이 브라우저를 거쳐 다른 서블릿이나 JSP에게 요청하는 방법이다.

- dispatch 방법은 서블릿에서 클라이언트를 거치지 않고 바로 다른 서블릿에게 요청하는 방법이다.

 

redirect 포워딩

- redirect 방법은 서블릿의 요청이 클라이어트의 브라우저를 다시 거쳐 요청되는 방식이다.

redirect 과정

  1. 클라이언트의 웹 브라우저에서 첫 번째 서블릿에 요청한다.
  2. 첫 번째 서블릿은 sendRedirect() 메서드를 이용해 두 번째 서블릿을 웹 브라우저를 통해서 요청한다.
  3. 웹 브라우저는 sendRedirect() 메서드가 지정한 두 번째 서블릿을 다시 요청한다.

* FirstServlet.java

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;

/**
 * Servlet implementation class FirstServlet
 */
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		
		// sendRedirect() 메서드를 이용해 웹 브라우저에게 다른 서블릿인 second로 재요청한다.
		response.sendRedirect("second");
	}

}

 

* SecondServlet.java

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;

/**
 * Servlet implementation class FirstServlet
 */
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @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();
		
		out.print("<html><body>");
		out.print("sendRedirect를 이용한 redirect 페이지");
		out.print("</body></html>");
	}

}


- 코드 작성 후 브라우저 주소 입력란에 localhost:[port]/[project_name]/first 를 입력해 본다.

- 위 /first로 요청 시 /second로 리다이렉트될 것이다.

/first로 요청
/first 요청 시 /second로 리다이렉트됨

 

refresh 포워딩

- refresh 이용한 포워딩 역시 redirect처럼 브라우저를 거쳐서 요청을 수행한다.

refresh redirect

  1. 클라이언트의 웹 브라우저에서 첫 번째 서블릿에 요청한다.
  2. 첫 번째 서블릿은 addHeader() 메서드를 이용해 두 번째 서블릿을 웹 브라우저를 통해서 요청한다.
  3. 웹 브라우저는 addHeader() 메서드가 지정한 두 번째 서블릿을 다시 요청한다.

* FirstServlet.java

package servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class FirstServlet
 */
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		
		// 웹 브라우저에 1초 후 서블릿 second로 재요청한다.
		response.addHeader("Refresh", "1;url=second");
	}

}

 

* SecondServlet.java

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;

/**
 * Servlet implementation class FirstServlet
 */
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @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();
		
		out.print("<html><body>");
		out.print("refresh를 이용한 redirect 페이지");
		out.print("</body></html>");
	}

}

 

- 코드 작성 후 브라우저 주소 입력란에 localhost:[port]/[project_name]/first 를 입력해 본다.

- 위 /first로 요청 시 /second로 리다이렉트될 것이다.

/first로 요청 시 /second 로 리다이렉트됨

 

location 포워딩

- 자바스크립트의 location 객체를 이용한다.

 

* FirstServlet.java

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;

/**
 * Servlet implementation class FirstServlet
 */
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @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();
		
		out.print("<script type='text/javascript'>");
		out.print("location.href='second';");
		out.print("</script>");
	}

}

 

* SecondServlet.java

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;

/**
 * Servlet implementation class FirstServlet
 */
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @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();
		
		out.print("<html><body>");
		out.print("location 객체를 이용한 redirect 페이지");
		out.print("</body></html>");
	}

}


- 코드 작성 후 브라우저 주소 입력란에 localhost:[port]/[project_name]/first 를 입력해 본다.

- 위 /first로 요청 시 /second로 리다이렉트될 것이다.

/first로 요청 시 /second 로 리다이렉트됨

 

redirect 방식으로 다른 서블릿에 데이터 전달

- redirect 방식을 이용하면 웹브라우저를 통해 다른 서블릿을 호출하면서 원하는 데이터를 전달할 있다.

- 다음은 redirect 방법으로 최초 요청한 서블릿에서 GET 방식으로 다른 서블릿에 데이터를 전달한다.

 

* FirstServlet.java

package servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class FirstServlet
 */
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");

		// GET 방식을 이용해 키/값 쌍으로 데이터를 전달한다.
		response.sendRedirect("second?name=yoo");
	}

}

 

* SecondServlet.java

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;

/**
 * Servlet implementation class FirstServlet
 */
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @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");
		
		out.print("<html><body>");
		out.print("redirect 데이터 수신<br>");
		out.print("이름 : " + name);
		out.print("</body></html>");
	}

}

 

- 코드 작성 후 브라우저 주소 입력란에 localhost:[port]/[project_name]/first 를 입력해 본다.

- 위 /first로 요청 시 /second로 리다이렉트될 것이다.

FirstServlet에서 리다이렉트 시 설정한 name 값이 출력됨

 

dispatch 포워딩

- distpatch 이용한 포워딩 과정이 redirect 방법과 다른 점은 클라이언트의 브라우저를 거치지 않고 바로  서버에서

 포워딩이 진행된다는 점이다.

- 따라서 브라우저 주소창의 URL 변경되지 않으며, 클라이언트 측에서는 포워드가 진행되었는지 없다.

 

* FirstServlet.java

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;

/**
 * Servlet implementation class FirstServlet
 */
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		
		RequestDispatcher dispatch = request.getRequestDispatcher("second");
		dispatch.forward(request, response);
	}

}

 

* SecondServlet.java

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;

/**
 * Servlet implementation class FirstServlet
 */
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @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();
		
		out.print("<html><body>");
		out.print("dispatch를 이용해 forward된 페이지");
		out.print("</body></html>");
	}

}

 

- 코드 작성 후 브라우저 주소 입력란에 localhost:[port]/[project_name]/first 를 입력해 본다.

url이 변경되지 않고 포워드되었다.

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함