이전글


<jsp:forward> 액션태그
forward 액션태그는 현재 실행중인 JSP페이지의 제어 흐름을 특정한 다른 JSP로 넘기고자 할 때 사용하는 표준 액션태그입니다. 표준 액션태그이기 때문에 jsp: 라는 네임스페이스를 사용하며, 기본적으로 제공되는 기능입니다.

다음처럼 사용자가 a.jsp페이지를 요청하고 서버에서 a.jsp를 실행하던 도중 <jsp:forward> 액션태그를 사용하여 b.jsp로 흐름을 이동시키면 b.jsp에서 흐름이 끝납니다.



1. 브라우저에서 서버로 /a.jsp 페이지를 요청합니다.
2. 서버에서는 /a.jsp페이지를 실행하던 중 forwad 액션태그를 통해 흐름을 /b.jsp 페이지로 넘깁니다.
3. 흐름이 이동되는 시점에 /a.jsp페이지에서 사용하던 request 객체와 response 객체를 함께 전달합니다. (즉 두 가지 객체를 통해 요청 데이터 및 출력 버퍼를 공유할 수 있고, 브라우저 입장에서는 하나의 요청 범위 안에서 처리되는것으로 보입니다.)
4. /b.jsp 페이지가 흐름을 넘겨받아 처리하고 최종 결과를 브라우저에 전달합니다.




<jsp:include> 액션태그와의 차이점
이전글의 include 액션태그와 거의 비슷하지만 한번 흐름이 넘어가면 제어가 다시 돌아오지 않는다는 차이점이 있습니다. 두번째 차이점은 include 액션태그는 a.jsp에서 출력하는 내용도 브라우저로 출력되는 반면 forward 액션태그는 a.jsp에서 출력되는 내용은 무시되고 b.jsp에서 출력하는 내용만 브라우저로 전달됩니다. 따라서 a.jsp에서는 출력 이외의 내용만 실행하고 b.jsp로 제어를 넘겨야 합니다.




<jsp:forward> 액션태그 사용시 출력 버퍼 동작
<Jsp:forward> 액션태그를 사용하면 호출하는 쪽에서 출력하는 내용은 무시된다고 했는데, 왜 그런일이 발생할까요? 그 이유는 forward 액션태그의 동작방식에 있습니다. forward 액션태그는 서블릿으로 변환되면 다음과 같이 pageContext의 forward() 메서드를 사용하는 코드로 변환됩니다. pageContext에 대한 내용은 다음 링크를 참고합니다. -> [서블릿/JSP] JSP pageContext 객체 
 
pageContext.forward("forwarding.jsp");                                                        
cs

따라서 pageContext 객체의 forward() 메서드의 동작방식 이해를 하는것이 좋습니다. 최초에 실행된 페이지에서 출력되는 내용은 출력 버퍼에 출력되는데, forward() 가 실행되는 시점에 버퍼의 내용을 모두 비워버린 후 흐름이 이동됩니다.

따라서 최초 실행되는 JSP 페이지에서는 내용을 출력해봤자 의미가 없습니다. 만약 forward를 실행하기 전에 강제로 flush하여 출력 버퍼의 내용을 브라우저로 출력하게 되면 forawrd 실행이 실패하게 됩니다.

또한 출력버퍼를 사용하지 않기 위해 page 디렉티브의 buffer 속성을 none으로 해도 forward 액션태그가 동작하지 않습니다.(더 정확하게 설명하자면 이 동작은 서블릿 컨테이너마다 달라질 수 있는데, 톰캣7버전 기준으로는 buffer를 none으로 하게 되면 에러가 발생하게 되며, 톰캣8 버전을 기준으로는 forward 액션태그 호출 이전 내용만 브라우저로 전달되지만 HTTP 응답 코드는 500으로 표기됩니다.)





<jsp:forward> 액션태그 사용방법
forward 액션태그는 다음과 같은 형식으로 사용합니다.
<jsp:forward page="이동할 JSP 페이지" />                                                        
cs

include 액션 태그에서 처럼 페이지를 그대로 지정하거나 표현식을 통해 지정할 수 있습니다.
<jsp:forward page="forwarding.jsp" />                                                        
cs

표현식을 사용한 경로 지정
<%                                                                                            
    String jspUrl = "forwarding.jsp";
%>
<jsp:forward page="<%= jspUrl %>" />
cs


main.jsp
<%@ page contentType="text/html; charset=utf-8"%>                                             
<%
    String jspUrl = request.getParameter("page"); 
%>
<jsp:forward page="<%= jspUrl %>" /> 
cs


forwarding.jsp
<%@ page contentType="text/html; charset=utf-8"%>                                             
<html> 
<head> 
</head> 
<body> 
     <h1>forwarding.jsp 페이지 내용</h1> 
</body> 
</html> 
cs


다음과 같이 page 파라미터에 forwarding.jsp를 지정해 주었고 main.jsp에서는 파라미터값을 경로로 사용해 forward 액션태그를 사용했습니다. http://localhost:8080/main.jsp?page=forwarding.jsp
브라우저가 요청한 페이지는 main.jsp페이지이지만 최종 결과를 실질적으로 실행한 페이지는 forwarding.jsp입니다.




다음글
블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,