서블릿 확장 API 사용하기

조예빈·2024년 5월 5일

Servlet

목록 보기
8/10

forward(포워드)

  • 하나의 서블릿에서 다른 서블릿이나 JSP와 연동하는 방법
    ex)쇼핑몰에서 상품 관리 서블릿과 조회된 상품을 화면에 표시하는 JSP는 따로 존재하는데, 이 때 사용자가 상품 조회를 요청하면 상품 관리 서블릿이 DB에서 상품 정보를 조회한 후 다시 JSP에게 전달하여 표시하는 기능

용도

  • 요청에 대한 추가 작업을 다른 서블릿에게 수행하게 함
  • 요청(request)에 포함된 정보를 다른 서블릿이나 JSP와 공유할 수 있음
  • 요청(request)에 정보를 포함시켜 다른 서블릿에게 전달할 수 있음
  • 모델2 개발 시 서블릿에서 JSP로 데이터를 전달하는 데 사용됨
    서블릿에서 다른 서블릿이나 JSP로 요청을 전달하는 역할

서블릿의 포워드 방법

redirect
  • HttpServletResponse 객체의 sendRedirect() 메소드를 이용함
  • 웹 브라우저에 재요청하는 방식(클라이언트를 거침)

    sendRedirect("포워드할 서블릿 또는 JSP");

Refresh
  • HttpServletResponse 객체의 addHeader() 메소드 이용
  • 웹 브라우저에 재요청하는 방식(클라이언트를 거침)

    response.addHeader("Refresh",경과시간(초);url=요청할 서블릿 또는 JSP"); //경과시간 마다 url로 새로 고침

location
  • 자바스크립트 location 객체의 href 속성 이용
  • 자바스크립트에서 재요청하는 방식(클라이언트를 거침)

    location.href='요청할 서블릿 또는 JSP';

dispatch
  • 일반적으로 포워딩 기능을 지칭
  • 서블릿이 직접 요청하는 방식(클라이언트를 거치지 않고 서버에서 포워딩 진행) -> 웹 브라우저 주소의 URL이 변경되지 않음(=클라이언트는 포워드가 진행되었는지를 모름)
  • RequestDispatcher 클래스의 forward() 메소드를 이용함

    RequestDispatcher dis = request.getRequestDispatcher("포워드할 서블릿 또는 JSP"); //경로를 매개변수로 받아 현재 요청과 관련된 객체를 가져옴
    dis.forward(request,response); //request를 다른 서블릿이나 JSP 페이지로 전달하고, 해당 페이지가 response를 생성하도록 하는 작업 수행(요청을 다른 페이지로 포워딩)

redirect 예시

  1. 클라이언트의 웹 브라우저에서 첫 번째 서블릿에 요청
  2. 첫 번째 서블릿은 sendRedirect() 메소드를 이용해 두 번째 서블릿을 웹 브라우저를 통해 요청
  3. 웹 브라우저는 sendRedirect() 메소드가 지정한 두 번째 서블릿을 다시 요청
@WebServlet("/first")
public class FirstServlet extends HttpServlet { //redirect 기능을 구현한 서블릿
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		response.sendRedirect("second");
		}
}
@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>");
	}
}

브라우저에서 http://localhost:8080/~/first로 요청하면 ~/second로 재요청되며 url도 바뀌는 것을 볼 수 있다.

refresh 예시(포워딩)

  1. 클라이언트의 웹 브라우저에서 첫 번째 서블릿에 요청
  2. 첫 번째 서블릿은 addHeader() 메소드를 이용해 두 번째 서블릿을 웹 브라우저를 통해서 요청
  3. 웹 브라우저는 addHeader() 메소드가 지정한 두 번째 서블릿을 다시 요청
@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");
	}
}
@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>");
	}
}

브라우저에서 http://localhost:8080/~/first로 요청하면 ~/second로 재요청되며 url도 바뀌는 것을 볼 수 있다.

location 예시

@WebServlet("/first")
public class FirstServlet extends HttpServlet { //서블릿에서 JS 코드를 출력해 서블릿 second로 재요청
	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/html;charset=utf-8");
		out.print("location.href='second';");
		out.print("</script>");
		}
}
@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>");
	}
}

브라우저에서 http://localhost:8080/~/first로 요청하면 ~/second로 재요청되며 url도 바뀌는 것을 볼 수 있다.

redirect 예시(다른 서블릿 호출 + 원하는 데이터 전달)

@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");
	}
}
@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"); //name으로 이전 서블릿에서 전달된 lee를 받음
		out.print("<html><body>");
		out.println("이름:" + name);
		out.println("</body></html>");
	}
}

GET방식을 이용해 redirect 되는 서블릿 second로 이름이 전달되는 것을 알 수 있음.
localhost:~/second?name=lee
참고로 refresh, location도 GET 방식을 통해 다른 서블릿으로 데이터를 전달할 수 있음.

dispatch 예시(포워딩)

  1. 클라이언트의 웹 브라우저에서 첫 번째 서블릿에 요청
  2. 첫 번째 서블릿은 RequestDispatcher를 이용해 두 번째 서블릿으로 포워드
@WebServlet("/first5")
public class FirstSetvlet5 extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		RequestDispatcher dispatch = request.getRequestDispatcher("second5"); //second5로 전달
		dispatch.forward(request, response); //request 객체를 response로 보냄
	}
}
@WebServlet("/second5")
public class SecondServlet5 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>");
	}
}

브라우저에서 http://localhost:8080/~/first로 요청하면 웹 브라우저 주소 창의 URL이 변경되지 않고 그대로 있는 것을 알 수 있음(서블릿의 포워드가 서버에서 수행되었기 때문)

dispatch 예시(GET방식)

@WebServlet("/first5")
public class FirstSetvlet5 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();
		RequestDispatcher dispatch = request.getRequestDispatcher("second5?name=lee");
		dispatch.forward(request, response);
	}
}
@WebServlet("/second5")
public class SecondServlet5 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"); //사용자가 입력한 name 파라미터 값을 가져오는 것
		out.println("<html><body>");
		out.println("이름:" + name);
		out.println("<br>");
		out.println("dispatch를 이용한 forward 실습입니다.");
		out.println("</body></html>");
	}
}

여전히 웹 브라우저의 URL 값은 변경되지 않는 것을 알 수 있다.

profile
컴퓨터가 이해하는 코드는 바보도 작성할 수 있다. 사람이 이해하도록 작성하는 프로그래머가 진정한 실력자다. -마틴 파울러

0개의 댓글