▸JSP & Servlet/기본 문법

RequestDispatcher - 페이지 forward/include

코데방 2020. 2. 21.
728x90

[ javax.servlet.RequestDispatcher 클래스 ]

  • forward() : 액션태그의 <jsp:forward>를 구현한 메소드
  • include() : 액션태그의 <jsp:include>를 구현한 메소드

두 액션태그의 개념을 구현한 메소드이기 때문에 액션태그를 이해하고 있으면 어렵지 않게 이해할 수 있는 메소드입니다. 

 

 


 

 

[ forward() ]


JSP에서는 액션태그의 forward 사용을 통해 다른 페이지나 서블릿으로 제어 흐름을 이동시킬 수 있었습니다. Response 객체의 sendRedirect()와는 달리 사용자가 다시 페이지를 호출하는게 아니라 내부적으로 해당 URI에 매핑된 부분으로 흐름을 넘기는 방식입니다. 이 부분에 대한 자세한 내용은 아래 링크를 참조하시면 됩니다.

 

2020/02/14 - [· JSP & Servlet/- 기본 문법] - JSP 태그의 종류와 사용법

 

 

 

이 액션태그의 foward는 서블릿으로 변환됐을 때 RequestDispatcher 클래스의 forward() 메소드를 실행하게 됩니다. 이 메소드는 사용자가 해야할 URI 호출을 내부적으로 호출해서 처리하는 방식입니다. 다만 sendRedirect() 와는 달리 웹 어플리케이션 외부 리소스에 포워딩해줄 수 없고, 사용자측에서는 보여지는 페이지의 실제 주소가 보이지 않기 때문에 즐겨찾기를 지정하는 것이 불편할 수 있는 등의 차이점이 있습니다.

 

 

* HttpServletRequest 객체를 통한 RequestDispatcher 객체 생성

 

사용법은 간단히 request 객체에서 생성한 뒤 forward() 메소드를 수행해주면 됩니다. 여러 글들을 보니 request 객체에서 생성하는 RequestDispatcher 객체는 상대경로로밖에 지정하지 못한다고 돼있는데 테스트를 해보니 절대경로와 상대경로 모두 사용 가능한 것 같습니다. 앞에 슬레시'/'를 붙여주면 절대경로를 의미하고 슬레시 없이 지정해주면 상대경로로 지정됩니다. 자바 버전마다 다르게 작동할 수 있으니 충분히 테스트를 해보는 것이 좋을 것 같습니다.

 

테스트를 위해 아래와 같은 폴더 구조에 'test01.jsp' 파일과 'test02.jsp'를 생성했습니다. 먼저 상대경로로 지정해보겠습니다. 둘 다 공통적으로 join 폴더 아래에 있으므로 'test01.jsp' 입장에서는 상대경로가 'join2/test02.jsp'가 됩니다. 슬레시 없이 상대경로로 설정해주면 정상 작동하는 것을 볼 수 있습니다.

 

 

<%
	RequestDispatcher dispatcher = request.getRequestDispatcher("join2/test02.jsp");
	dispatcher.forward(request, response);
%>

 

 

위에서 앞에 슬레시를 붙여주면 절대경로로 인식돼 페이지를 찾을 수 없다는 404에러가 발생합니다. 이번에는 앞에 슬레시를 붙여 절대 경로로 설정해보았습니다. 역시 정상적으로 작동하는 것을 확인할 수 있습니다. 

 

	<%
		RequestDispatcher dispatcher = 
        			request.getRequestDispatcher("/join/join2/test02.jsp");
		dispatcher.forward(request, response);
	%>

 

 

forward할 때 전달할 객체는 request 객체나 response 객체에 실어서 전달하면 됩니다. 

 

 


 

 

[ include() ]

 

역시 JSP 액션태그의 <jsp:include>를 구현하는 메소드입니다. 액션태그의 include에 대한 자세한 개념과 설명 및 지시자를 이용한 include 디렉티브와의 차이는 아래 링크를 참조하시면 됩니다.

 

2020/02/14 - [· JSP & Servlet/- 기본 문법] - JSP 태그의 종류와 사용법

 

 

forward() 방식은 다른 곳으로 페이지의 제어 흐름을 넘기는 방식이었습니다. forward를 호출한 곳에서 출력한 내용은 클라이언트에게 가지 못하고 버퍼에서 비워지며, 다시 호출한 페이지로 돌아가지 않고 호출된 페이지에서 완료 작업까지 모두 처리합니다.

 

 

 

반대로 include() 방식은 현재 페이지의 결과에 include된 페이지의 결과를 삽입하는 방식입니다. 현재 페이지에서 출력한 내용도 클라이언트에게 가고, include한 페이지의 내용도 사용자로 간 뒤 다시 호출한 쪽으로 돌아가서 로직을 마저 수행한 뒤 최종 응답을 합니다. 

 

 

 

 

아래와 같은 코드로 사용하면 되고, 전달할 객체가 있다면 request, response 객체에 추가해주면 됩니다.

 

		RequestDispatcher dispatcher = request.getRequestDispatcher("test02.jsp");
		dispatcher.include(request, response);

 

728x90

댓글

💲 추천 글