[서블릿] 포워드

hoonak·2023년 6월 21일
0

서블릿

목록 보기
6/16

포워드(forward)
하나의 서블릿에서 다른 서블릿이나 jsp와 연동하는 방법임. 한마디로 포워드 기능은 서블릿에서 다른 서블릿이나 jsp로 요청을 전달하는 역할을 함. 그리고 이 요청(request)을 전달할 때 추가 데이터를 포함시켜서 전달할 수도 있음. 모델2 개발 방식으로 웹 애플리케이션을 개발할 경우 서블릿에서 jsp로 데이터를 전달할 때 주로 사용됨.

  1. 요청에 대한 추가 작업을 다른 서블릿에게 수행하게 함.
  2. 요청(request)에 포함된 정보를 다른 서블릿이나 jsp와 공유할 수 있음.
  3. 요청(request)에 정보를 포함시켜 다른 서블릿에 전달 할 수 있음.
  4. 모델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.getRequestDispatcher('포워드할 서블릿 또는 jsp'); dis.forward(request, response);

redirect, refresh, location 방법은 서블릿이 웹 브라우저를 거쳐 다른 서블릿이나 jsp에게 요청하는 방법. 반면 dispatch 방법은 서블릿에서 클라이언트를 거치지 않고 바로 다른 서블릿에게 요청하는 방법임.

예 1) redirect

  1. 클라이언트의 웹 브라우저에서 첫 번째 서블릿에 요청함.
  2. 첫 번재 서블릿은 sendRedirect() 메서드를 이용해 두 번째 서블릿을 웹 브라우저를 통해서 요청함.
  3. 웹 브라우저는 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

  1. 클라이언트의 웹 브라우저에서 첫 번째 서블릿에 요청함.
  2. 첫 번째 서블릿은 addHeader() 메서드를 이용해 두 번째 서블릿을 웹 브라우저를 통해서 요청함.
  3. 웹 브라우저는 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이 변경되지않음. 즉 클라이언트 측에서는 포워드가 진행됐는지 알 수 없음.

  1. 클라이언트의 웹 브라우저에서 첫 번째 서블릿에 요청함.
  2. 첫 번째 서블릿은 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>");
	}

}
profile
Hello World!

0개의 댓글