포워드(forward)
하나의 서블릿에서 다른 서블릿이나 jsp와 연동하는 방법임. 한마디로 포워드 기능은 서블릿에서 다른 서블릿이나 jsp로 요청을 전달하는 역할을 함. 그리고 이 요청(request)을 전달할 때 추가 데이터를 포함시켜서 전달할 수도 있음. 모델2 개발 방식으로 웹 애플리케이션을 개발할 경우 서블릿에서 jsp로 데이터를 전달할 때 주로 사용됨.
- 요청에 대한 추가 작업을 다른 서블릿에게 수행하게 함.
- 요청(request)에 포함된 정보를 다른 서블릿이나 jsp와 공유할 수 있음.
- 요청(request)에 정보를 포함시켜 다른 서블릿에 전달 할 수 있음.
- 모델2 개발 시 서블릿에서 jsp로 데이터를 전달하는 데 사용됨.
redirect, refresh, location 방법은 서블릿이 웹 브라우저를 거쳐 다른 서블릿이나 jsp에게 요청하는 방법. 반면 dispatch 방법은 서블릿에서 클라이언트를 거치지 않고 바로 다른 서블릿에게 요청하는 방법임.
예 1) redirect
- 클라이언트의 웹 브라우저에서 첫 번째 서블릿에 요청함.
- 첫 번재 서블릿은 sendRedirect() 메서드를 이용해 두 번째 서블릿을 웹 브라우저를 통해서 요청함.
- 웹 브라우저는 sendRedirect() 메서드가 지정한 두 번째 서블릿을 다시 요청함.
FirstServlet.java
package sec01.ex01;
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;
//@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"); // sendRedirect() 메서드를 이용해 웹 브라우저에게 다른 서블릿인 second로 재요청합니다.
}
}
SecondServlet.java
package sec01.ex01;
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;
//@WebServlet("/second")
public class SecondServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("secondRedirect를 이용한 redirect 실습입니다."); //브라우저로 출력합니다.
out.println("</html></body>");
}
}
예 2) refresh
- 클라이언트의 웹 브라우저에서 첫 번째 서블릿에 요청함.
- 첫 번째 서블릿은 addHeader() 메서드를 이용해 두 번째 서블릿을 웹 브라우저를 통해서 요청함.
- 웹 브라우저는 addHeader() 메서드가 지정한 두 번째 서블릿을 다시 요청함.
지정된 시간에 요청됨.
FirstServlet.java
package sec01.ex02;
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;
//@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.addHeader("Refresh", "1; url = second"); // 웹브라우저에 1초 후 서블릿 second로 재요청 함.
}
}
SecondServlet.java
package sec01.ex02;
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;
//@WebServlet("/second")
public class SecondServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("refesh를 이용한 redirect 실습입니다."); //브라우저로 출력합니다.
out.println("</html></body>");
}
}
예 3) location
package sec01.ex03;
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;
//@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();
// 자바스크립트 location의 href 속성에 서블릿 second를 설정해 재요청 함.
out.print("<script type = 'text/javascript'>");
out.print("location.href = 'second';");
out.print("</script>");
}
}
SecondServlet.java
package sec01.ex03;
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;
//@WebServlet("/second")
public class SecondServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("location을 이용한 redirect 실습입니다."); //브라우저로 출력합니다.
out.println("</html></body>");
}
}
예 4) redirect
redirect 방식을 이용하면 웹 브라우저를 통해 다른 서블릿을 호출하면서 원하는 데이터를 전달할 수도 있음.
package sec01.ex04;
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;
//@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();
// get 방식을 이용해 이름/값 쌍으로 데이터를 다른 서블릿으로 전달합니다.
response.sendRedirect("second?name=lee");
}
}
SecondServlet.java
package sec01.ex04;
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;
//@WebServlet("/second")
public class SecondServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
//name으로 이전 서블릿에서 전달된 lee를 받습니다.
String name = request.getParameter("name");
out.println("<html><body>");
out.println("이름" + name);
out.println("location을 이용한 redirect 실습입니다."); //브라우저로 출력합니다.
out.println("</html></body>");
}
}
refesh나 location 역시 get 방식을 이용해 다른 서블릿으로 데이터를 전달할 수 있음.
예 5) dispatch
dispatch를 이용한 포워딩 과정이 redirect 방법과 다른 점은 클라이언트의 웹 브라우저를 거치지 않고 바로 서버에서 포워딩이 진행된다는 것. 따라서 웹 브라우저 주소창의 url이 변경되지않음. 즉 클라이언트 측에서는 포워드가 진행됐는지 알 수 없음.
- 클라이언트의 웹 브라우저에서 첫 번째 서블릿에 요청함.
- 첫 번째 서블릿은 RequestDispatcher를 이용해 두 번째 서블릿으로 포워드 함.
FirstServlet
package sec03.ex01;
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;
@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");
// dispatch 방법을 이용해 second로 전달함.
RequestDispatcher dispatch = request.getRequestDispatcher("second");
dispatch.forward(request, response);
}
}
SecondServlet
package sec03.ex01;
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;
@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("</body></html>");
}
}
이번에는 dispatch를 이용해 전송할 때 GET 방식으로 데이터를 전송해 보자. 서블릿 이름 다음에 ?name=lee를 추가해 GET 방식으로 name 값을 두 번째 서블릿으로 전달함.
FirstServlet.java
package sec01.ex05;
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;
//@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?name=lee");// dispatch 방법을 이용해 second로 전달함.
dispatch.forward(request, response);
}
}
SecondServlet.java
package sec01.ex05;
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;
//@WebServlet("/second")
public class SecondServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
String name = request.getParameter("name"); //name으로 이전 서블릿에서 전달된 lee를 받습니다.
out.println("<html><body>");
out.println("이름" + name);
out.println("dispatch를 이용한 redirect 실습입니다."); //브라우저로 출력합니다.
out.println("</html></body>");
}
}