[Servlet] 서블릿 포워드

sang·2024년 2월 8일

서블릿 포워드 forward

하나의 서블릿에서 다른 서블릿이나 JSP와 연동하는 방법
요청을 전달하는 것
요청 추가 작업 분배
요청 정보 공유
추가 데이터 전달 가능
ex) 서블릿: 상품관리 + JSP: 조회된 상품 표시

포워드 방법

  • 방식 1: 서블릿 1 -> 웹 브라우저 -> 서블릿 2
    redirect, refresh, location
  • 방식 2: 서블릿 1 -> 서블릿 2
    dispatch


redirect

HttpServletResponse sendRedirect("서블릿 || JSP")
웹 브라우저에 재요청

  1. 클라이언트 웹 브라우저 -> 첫번째 서블릿 요청
  2. sendRedirect: 첫번째 서블릿 -> 웹 브라우저
  3. 웹 브라우저 -> 두번째 서블릿 요청

최종적으로 웹 브라우저에는 두번째 서블릿 매핑 이름이 표시됨


pro08/src/sec01/ex01/FirstServlet.java

package sec01.ex01;
...

@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"); //재요청
  }
}

pro08/src/sec01/ex01/SecondServlet.java

package sec01.ex01;
...

@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>");
  }
}

추가 데이터 전달

pro08/src/sec02/ex01/FirstServlet.java

package sec02.ex01;
...

@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"); // 재요청 & GET 방식으로 데이터 전달
  }
}

pro08/src/sec02/ex01/SecondServlet.java

package sec02.ex01;
...
@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>");
  }
}


refresh

HttpServletResponse response.addHeader("refresh", 경과시간(s); url = (서블릿 || JSP))
웹 브라우저에 재요청

  1. 클라이언트 웹 브라우저 -> 첫번째 서블릿 요청
  2. addHeader: 첫번째 서블릿 -> 웹 브라우저
  3. 웹 브라우저 -> 두번째 서블릿 요청

pro08/src/sec01/ex02/FirstServlet.java

package sec01.ex02;
...

@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"); // 1초 후 재요청
  }
}

pro08/src/sec01/ex02/SecondServlet.java

package sec01.ex02;
....

@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>");
  }
}


location

location.href = '서블릿 || JSP';
자바스크립트에서 재요청

pro08/src/sec01/ex03/FirstServlet.java

package sec01.ex03;

@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>");
  }
}

pro08/src/sec01/ex03/SecondServlet.java

package sec01.ex03;
....

@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>");
  }
}


dispatch

RequestDispatcher dis = request.getRequestDispatcher("서블릿 || JSP"); dis.forward(request, response);
일반적인 포워딩 기능
서블릿이 직접 요청

  • 사용처
    • 모델2 방식
    • 스트럿츠
    • 스프링 프레임워크
  1. 클라이언트 웹 브라우저 -> 첫번째 서블릿 요청
  2. RequestDispatcher: 첫번째 서블릿 -> 두번째 서블릿 포워드

pro08/src/sec03/ex01/FirstServlet.java

package sec03.ex01;
...

@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");
    dispatch.forward(request, response);
  }
}

pro08/src/sec03/ex01/SecondServlet.java

package sec03.ex01;
...

@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>");
  }
}

추가 데이터 전달

pro08/src/sec03/ex01/FirstServlet.java

package sec03.ex01;
...

@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 방식으로 데이터 전달 */
    RequestDispatcher dispatch = request.getRequestDispatcher("second?name=lee");
    dispatch.forward(request, response);
  }
}

pro08/src/sec03/ex01/SecondServlet.java

package sex03.ex01;
...
@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("<br>");
    out.println("dispatch를 이용한 forward 실습");
    out.println("</body></html>");
  }
}


*자바 웹을 다루는 기술

profile
CS 메모장

0개의 댓글