티스토리 뷰
서블릿 포워드
서블릿 포워드(Forward)
서블릿의 포워드란, 각각의 서블릿끼리 혹은 서블릿과 JSP끼리 연동해서 작업해야 하는 경우 서로 작업을 전달하는 것을 말한다.
포워드의 종류는 다음 네가지이다.
- redirect
- Refresh
- location
- dispatch (일반적인 포워드 방식)
이 네가지 포워드 방식을 알아보자.
redirect
HttpServletResponse
객체의 sendRedirect()
메서드를 이용한다.
- 웹 브라우저(클라이언트)에게서
- 첫번째 서블릿이
요청
을 받으면 - 첫번째 서블릿이 다시 브라우저에게
응답
을 보낸 후 - 브라우저가 다시 두번째 서블릿에게
요청
을 보낸다. - 요청을 받은 두번째 서블릿은 다시 브라우저에게
응답
한다.
- 첫번째 서블릿이
WAS에서 객체가 두번 생성되기 때문에 매핑 url이 달라지는 것을 볼 수 있다.
아래 코드로 자세하게 확인해보자
FirstSerlvet.java
@WebServlet("/first") //Annotation으로 서블릿을 매핑해보겠다.
public class FirstServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
resp.sendRedirect("second"); //second로 매핑되어있는 서블릿으로 redirect하겠다.
}
}
SecondServlet.java
@WebServlet("/second")
public class SecondServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<html><body>");
out.println("Redirect 되었습니다. first->second");
out.println("</body></html>");
}
}
결과
FirstSerlvet에서 second로 매핑된 SecondServlet으로 Redirect한 코드는 브라우저를 한번 거쳐서 다시 WAS
에서HttpServletResponse
와 HttpServletRequest
객체를 생성하기 때문에 url이 변경된 것을 확인 할 수 있다.
Refresh
HttpServletResponse
객체의 addHadder()
메서드를 이용한다.
- 웹 브라우저(클라이언트)에게서
- 첫번째 서블릿이
요청
을 받으면 - 첫번째 서블릿이 다시 브라우저에게
응답
을 보낸 후 - 브라우저가 다시 두번째 서블릿에게
요청
을 보낸다. - 요청을 받은 두번째 서블릿은 다시 브라우저에게
응답
한다. 요청/응답
방식은redirect
와 동일하다.
- 첫번째 서블릿이
redirect와 요청/응답 방식은 비슷하다. 다만 Refresh 포워드 방식은 addHadder에 정보를 넣고 첫번째 서블릿을 잠깐 머물렀다가 다시 브라우저에 응답한다는 것이 차이이다.
아래 코드로 자세하게 확인해보자
FirstSerlvet.java
@WebServlet("/first")
public class FirstSerlvet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
out.print("1초간 머물 것 입니다");
resp.addHeader("Refresh", "1;url=second"); //화면을 출력하고 1초 후에 second로 매핑된 서블릿으로 Refresh하겠다.
}
}
SecondServlet.java
@WebServlet("/second")
public class SecondServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<html><body>");
out.println("Refresh 되었습니다. first->second");
out.println("</body></html>");
}
}
결과
redirect와 똑같이 객체가 두번 생성되어 매핑된 url값이 달라졌지만 차이점은 첫번째 서블릿에서 잠시 머문다는 것이다.
location
특이하게도 JavaScript
의 location
객체를 이용한다.
바로 확인해보자
FirstSerlvet.java
@WebServlet("/first")
public class FirstServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
out.print("<script type='text/javascript'>");
out.print("location.href='second';"); //JavaScript의 location 객체를 이용하여 second로 매핑된 서블릿으로 이동한다.
out.print("</script>");
}
}
SecondServlet.java
@WebServlet("/second")
public class SecondServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<html><body>");
out.println("JavaScript의 location 객체로 Redirect 되었습니다. first->second");
out.println("</body></html>");
}
}
결과
이 또한 마찬가지로 매핑url은 first에서 second로 변한 것을 알 수 있다.이 말인 즉슨 location 포워드 방식도 HttpServletRequest
객체와 HttpServletResponse
객체가 새로 생성되었다는 것이다.
dispatch
포워딩이라고 하면 이 dispatch를 일반적으로 나타낸다.RequestDispatcher
클래스의 forward()
메서드를 이용한다.
- 웹 브라우저(클라이언트)에게서
- 첫번째 서블릿이
요청
을 받아 - 첫번째 서블릿이
HttpServletRequest
와HttpServletResponse
객체에 정보를 담아서 직접 두번째 서블릿으로포워드
를 하면 - 두번째 서블릿이 객체를 받아 작동한 후 웹 브라우저에게
응답
을 보낸다.
- 첫번째 서블릿이
한 번 생성된 객체에 정보를 담아 두번째 서블릿에 포워드 했으므로 객체에는 변함이 없고 url도 변하지 않는다.
FirstSerlvet.java
@WebServlet("/first")
public class FirstServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
RequestDispatcher dispatch = req.getRequestDispatcher("second");
dispatch.forward(req, resp); //dispatch 클래스의 forward()메서드에 객체를 각각 담아 전송한다.
}
}
SecondServlet.java
@WebServlet("/second")
public class SecondSerlvet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<html><body>");
out.println("Dispatch를 이용하여 forward 된 서블릿입니다. first---");
out.println("</body></html>");
}
}
결과
브라우저가 요청한 후 WAS에서 생성된 HttpServletRequest
,HttpServletRespons
객체는 첫번째 서블릿에서 정보를 담아 그대로 두번째 서블릿으로 포워드 되기 때문에 url도 변함없는 것을 확인 할 수 있다.
주로 Redirect와 forward(dispatch)로 쉽게 명칭하는 듯 하다...
이 다음 공부는 Dispatch를 이용한 binding이다.
'Backend' 카테고리의 다른 글
[JAVA] 서블릿 스코프 (Servlet Scope) (0) | 2021.08.12 |
---|---|
[JAVA] 서블릿 초기화 파라미터 (ServletConfig & ServletContext) (0) | 2021.08.12 |
[JAVA] Servlet의 생명주기 (Life Cycle) (0) | 2021.08.12 |
[JAVA] 중첩 클래스(nested Class) (0) | 2021.08.12 |
[JAVA] DBCP 커넥션 풀 Connection Pool (0) | 2021.08.12 |