서블릿 포워드 기능 & 서블릿의 여러 가지 포워드 방법
포워드 기능
요청에 대한 추가 작업을 다른 서블릿에게 수행하게 합니다.
요청(request)에 포함된 정보를 다른 서블릿이나 JSP와 공유할 수 있습니다.
요청(request)에 정보를 포함시켜 다른 서블릿에 전달할 수 있습니다.
모델2 개발 시 서블릿에서 JSP로 데이터를 전달하는 데 사용됩니다.
서블릿의 여러 가지 포워드 방법
redirect 방법
HttpServletResponse 객체의 sendRedirect() 메서드를 이용합니다.
웹 브라우저에 재요청하는 방식입니다.
형식: sendRedirect("포워드할 서블릿 또는 JSP");
Refresh 방법
HttpServletResponse 객체의 addHeader() 메서드를 사용합니다.
웹 브라우저에 재요청하는 방식입니다.
형식: response.addHeader("Refresh", 경과시간(초);url=요청할 서블릿 또는 JSP");
location 방법
자바스크립트 locatiom 객체의 href 속성을 이용합니다.
자바스크립트에서 재요청하는 방식입니다.
형식: location.href='요청할 서블릿 또는 JSP';
dispatch 방법
일반적으로 포워딩 기능을 지정합니다.
서블릿이 직접 요청하는 방법입니다.
RequestDispatch 클래스의 forward() 메서드를 이용합니다.
형식: RequestDispatcher dis = request.getRequestDispatcher("포워드할 서블릿 또는 JSP"); dis.forward(request, response);
redirect, refresh, location 방법은 서브릸이 웹 브라우저를 겨쳐 다른 서블릿이나 JSP에게 요청하는 벙법입니다. 반면에 dispatch 방법은 서블릿에서 클라이언트를 거치지 않고 바로 다른 서블릿에게 요청하는 방법입니다.
redirect를 이용한 포워딩
1. 클라이언트의 웹 브라우저에서 첫 번째 서블릿에 요청합니다.
2. 첫 번째 서블릿은 sendRedirect() 메서드를 이용해 두 번째 서블릿을 웹 브라우저를 통해서 요청합니다.
3. 웹 브라우저는 sendRedirect() 메서드가 지정한 두 번째 서블릿을 다시 요청합니다.
redirect를 이용한 포워딩 실습
1. 새 프로젝트 pro08을 만들고 sec01.ex01 패키지를 추가합니다. FirstServlet 클레스의 SecondServlet 클래스를 추가합니다.

2. FirstServlet 클래스를 다음과 같이 작성합니다. redirect 기능을 구현한 서블릿입니다.
package sec01.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("/first")
public class FirstServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
response.sendRedirect("second");
}
}
2. SecondServlet 클래스는 첫 번째 서블릿에서 요청을 받아 실행하는 두 번째 서블릿입니다.
package sec01.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("sendRedirect을 이용한 redirect 실습입니다.");
out.println("</body></html>");
}
}
4. http://localhost:8090/pro08/first로 요청합니다.

5. 최종적으로 웹 브라우저에 표시되는 매핑 이름은 /second입니다. 즉, /first로 요청하면 sendRedirect()를 호출해 웹 브라우저에게 다시 /second를 요청하는 것입니다.

refresh를 이용한 포워딩
1. 클라이언트의 웹 브라우저에서 첫 번째 서블릿에 요청합니다.
2. 첫 번째 서블릿은 addHeader() 메서드를 이용해 두 번째 서블릿을 웹 브라우저를 통해서 요청합니다.
3. 웹 브라우저는 addHeader() 메서드가 지정한 두 번째 서블릿을 다시 요청합니다.
refresh를 이용한 포워딩 실습
1. sec01.ex02 패키지를 만들고 redirect 포워딩 실습 때와 마찬가지로 두 개의 서블릿 클래스를 추가합니다.

2. FirstServlet 클래스를 다음과 같이 작성합니다. response의 addHeader() 메서드에 Refresh를 설정하고 1초 후 url=second에 지정한 second 서블릿에 브라우저에서 재요청하게 합니다.
package sec01.ex02;
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 {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
response.addHeader("Refresh", "1;url=second");
}
}
2. SecondServlet 클래스를 다음과 같이 작성합니다. 이는 브라우저에서 재요청하면 브라우저로 메시지를 출력하는 서블릿입니다.
package sec01.ex02;
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("refresh를 이용한 redirect 실습입니다.");
out.println("</body></html>");
}
}
4. 브라우저에서 http://localhost:8090/pro08/first로 요청하면 /second로 재요청합니다.

location을 이용한 포워딩
1. sec01.ex03 패키지를 만들고 다음과 같이 두 개의 서블릿 클래스를 추가합니다.

2. FirstServlet 클래스를 다음과 같이 작성합니다. 서블릿에서 PrintWriter로 자바스크립트 코드로 출력해 서블릿 second로 재요청합니다.
package sec01.ex03;
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 {
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>");
}
}
3. 마찬가지로 브라우저에서 재요청하면 브라우저로 메시지를 출력하는 두 번쩨 서블릿을 작성합니다.
package sec01.ex03;
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("location을 이용한 redirect 실습입니다.");
out.println("</body></html>");
}
}
4. http://localhost:8090/pro08/first로 요청하면 /second으로 재요청합니다.

redirect 방식으로 다른 서블릿에 데이터 전달하기
1. 이번에는 redirect 방식으로 최초 요청한 서블릿에서 GET 방식으로 다른 서블릿으로 데이터를 전달하는 예제를 다음과 같은 방법으로 작성해 보겠습니다. FirstServlet 클래스를 다음과 같이 작성합니다.
package sec02.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("/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();
response.sendRedirect("second?name=lee");
}
}
2. SecondServlet 클래스를 다음과 같이 작성합니다. 이전 서블릿에서 전달된 값을 getParameter() 메서그를 이용해 가져옵니다.
package sec02.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("</body></html>");
}
}
3. 다음은 실행 결과입니다. GET 방식을 이용해 redirect되는 서블릿 second로 이름이 전달됩니다.

'프로그래밍 언어 > 자바 웹' 카테고리의 다른 글
| 바인딩 (1) | 2025.06.15 |
|---|---|
| dispatch를 이용한 포워드 방법 (1) | 2025.06.12 |
| 회원 정보 삭제하기 (1) | 2025.06.06 |
| DataSource 이용해 회원 정보 등록하기 (1) | 2025.06.03 |
| 톰캣의 DataSource로 연동해 회원 정보 조회 실습 (1) | 2025.05.31 |