[JSP] 7.1 <jsp:forward> 액션 태그를 이용한 JSP 페이지 이동

2022. 4. 8. 15:19JAVA/Servlet&JSP

<jsp:forward>의 요청 흐름

  1. 웹 브라우저 요청이 from.jsp에 전달
  2. form.jsp는 <jsp:forward> 액션 태그를 실행
  3. <jsp:forward> 액션 태그가 실행되면 요청 흐름이 to.jsp로 이동한다.
  4. 요청 흐름이 이동할 때 from.jsp에서 사용한 request 기본 객체와 response 기본 객체가 to.jsp로 전달
  5. to.jsp는 응답 결과를 생성
  6. to.jsp가 생성한 결과를 웹 브라우저에게 전송

주목할점

  • from.jsp가 아닌 to.jsp가 생성한 응답 결과가 웹 브라우저에게 전달
  • from.jsp에서 사용한 request 기본객체와 response 기본객체가 to.jsp에 그대로 전달됨

 

1. <jsp:forward> 액션 태그

문법

<jsp:forward page="이동할 페이지"/>

 

01_from.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
이 페이지는 from.jsp가 생성한 것입니다.
<jsp:forward page="02_to.jsp" />
</body>
</html>

02_to.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
이 페이지는 to.jsp가 생성한 것입니다.
</body>
</html>

  • from.jsp에서 <jsp:forward>를 사용해서 이동한 to.jsp가 생성한 결과가 웹 브라우저에 출력됨
  • from.jsp에서 출력한 결과는 웹 브라우저에 출력되지 않음
  • 웹 브라우저의 URL 주소는 from.jsp로써 최초로 요청을 받은 JSP의 주소가 됨

2. <jsp:forward> 액션 태그의 page 속성에서 지정할 경로의 표시

이동할 페이지 이동경로 입력 방식

  • 웹 어플리케이션 폴더를 기준으로 한 절대 경로
  • 현재 JSP 페이지를 기준으로 한 상대 경로
절대경로
<jsp:forward page="/to/to.jsp"/>

상대경로
<jsp:forward page="../to/to.jsp"/>

 

절대 경로 vs 상대 경로

  • 절대 경로 입력 방식을 권장

 

3. <jsp:forward> 액션 태그와 출력 버퍼와의 관계

이전 예제에서 from.jsp 페이지의 생성 결과는 출력되지 않고 to.jsp에서 생성한 결과만 웹 브라우저에 출력된 것을 확인할 수 있었습니다. <jsp:forward> 액션 태그를 사용하는 JSP 페이지(from.jsp)의 출력 결과가 웹 브라우저에 전송되지 않은 이유는 출력 버퍼때문입니다.

 

<jsp:forward>와 출력 버퍼의 관계

  • <jsp:forward> 액션 태그 실행시 기존 저장되어 있는 출력 버퍼를 비우기 때문에 from.jsp의 내용은 출력되지 않음

출력 버퍼가 없는 상태에서 <jsp:forward> 예제

<%@ page buffer="none" language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
이 페이지는 from.jsp가 생성한 것입니다.
<jsp:forward page="02_to.jsp" />
</body>
</html>

 

4. <jsp:forward> 액션 태그의 전형적인 사용법

04_select.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="<%= request.getContextPath() %>/Chapter07/05_view.jsp">
보고싶은 페이지 선택:
	<select name="code">
		<option value="A">A페이지</option>
		<option value="B">B페이지</option>
		<option value="C">C페이지</option>
	</select>
	<input type="submit" value="이동">
</form>
</body>
</html>

 

  • select 안에 페이지 선택시 05_view.jsp로 이동

view.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String code = request.getParameter("code");
	String viewPageURI = null;
	
	if(code.equals("A"))
	{
		viewPageURI = "/Chapter07/viewModule/a.jsp";
	}else if(code.equals("B"))
	{
		viewPageURI = "/Chapter07/viewModule/b.jsp";
	}else if(code.equals("C"))
	{
		viewPageURI = "/Chapter07/viewModule/c.jsp";
	}
	
%>

<jsp:forward page="<%= viewPageURI %>"></jsp:forward>

a.jsp, b.jsp, c.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
이 페이지는 <b><font size="5">A</font></b>입니다.
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
이 페이지는 <b><font size="5">B</font></b>입니다.
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
이 페이지는 <b><font size="5">C</font></b>C입니다.
</body>
</html>

 

5. 이동할 페이지에 정보 전달하기: 파라미터 전달 방법

<jsp:forward> 액션태그에 파라미터 설정 방법

<jsp:forward page="moveTo.jsp">
    <jsp:param name="first" value="BK" />
    <jsp:param name="second" value="Choi" />
</jsp:forward>
  • name - 이동할 페이지에 전달될 파라미터 이름 (표현식 사용 불가)
  • value - 이동할 페이지에 전달될 파라미터의 값 (표현식 사용 가능)

 

07_paramFrom.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String value = request.getParameter("p1");
	if(value==null)
	{
		value = "NOPARAM";
	}
		
%>
<jsp:forward page="08_paramTo.jsp" >
	<jsp:param name="p1" value="<%=value %>"/>
</jsp:forward>

08_paramTo.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	p1 파라미터 : <%=request.getParameter("p1") %>
</body>
</html>
http://localhost:8080/jsp2/Chapter07/param/07_paramFrom.jsp

6. 이동할 페이지 사이에 정보 전달하기: request 기본 객체 속성 사용

속성을 통한 값의 전달

  • request 기본 객체는 한번의 요청에 대해서 유효하게 동작
  • 한번의 요청을 처리하는데 사용되는 모든 JSP에서 공유됨

09_makeTime.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.Calendar" %>
<%

	Calendar cal = Calendar.getInstance();
	request.setAttribute("time", cal);
%>
<jsp:forward page="/Chapter7/to/10_viewTime.jsp"/>

 

10_viewTime.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="java.util.Calendar" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	Calendar cal = (Calendar)request.getAttribute("time");
%>
현재 시간은 <%= cal.get(Calendar.HOUR) %>시
	<%= cal.get(Calendar.MINUTE) %>분
	<%= cal.get(Calendar.SECOND) %>초 입니다.
</body>
</html>

 

  • makeTime.jsp에서 request 기본 객체에 속성 이름을 "time", 값을 Calendar 인스턴스를 저장합니다.
  • viewTime.jsp로 이동하여 request 기본 객체를 통하여 Calendar 인스턴스를 참조

 

References

source code : https://github.com/yonghwankim-dev/JSP2.0/tree/master/jsp2/src/main/webapp/Chapter07
JSP 2.0 프로그래밍 기초부터 중급까지