※ 리다이렉트 방식 : response 객체의 sendRedirect()로 페이지를 이동하는 방법. 브라우저의 URL을 변경하도록 하여 페이지를 이동하는 방식으로 request와 response 객체가 유지되지 않는다.

 

• 리다이렉트 방식의 데이터 전송 흐름

 

sendRedirect() 메소드로 페이지를 이동하면서 데이터를 전송하기 위해 파라미터 값을 이동할 페이지 뒤에 쿼리 스트링 형태로 덧붙여 주었다.

response.sendRedirect("04_main.jsp?age=" + 25);	// 파라미터 이름 : age, 파라미터 값 : 25

※ 포워드 방식 : 서버 상에서 페이지가 이동되기 때문브라우저는 알아채지 못하고 URL도 변경되지 않는다. 또한 기존의 request와 response는 유지되어 이동된다. 페이지 이동을 위해 포워딩을 하면 요청 당시의 현재 페이지에 대한 URL만 나타날 뿐 제어가 넘어가 특정 페이지의 URL이 전혀 나타나지 않는다.

 

forward() 메소드requestDispatcher 객체로 접근해야만 호출이 가능하다. requestDispatcher 객체는 request 객체의 getRequestDispatcher() 메소드를 호출하여 얻어낸다. 이렇게 얻어낸 requestDispatcher 객체로 forward() 메소드를 호출하면 getRequestDispatcher() 메소드의 매개 변수로 지정한 페이지로 이동된다.

RequestDispatcher dispatcher = request.getRequestDispatcher("05_forwardResult.jsp"); // 이동할 페이지 지정
dispatcher.forward(request, response);

 

• 포워드 방식의 데이터 전송 흐름

 

포워딩 방식으로 페이지를 이동하면 클라이언트의 웹 브라우저의 주소란에 보이는 URL과 실제 웹 브라우저에서 로드하고 있는 문서가 서로 다르므로 사용자는 내부적으로 어떠한 일들이 일어나고 있는지 감지할 수가 없다.

 

sendRedirect()에서는 쿼리 스트링 형태로 데이터 전송을 했다면 forward() 메소드로 페이지를 이동하면서 데이터를 전송하고 싶은 경우에는 기존의 request 객체가 그대로 유지되기 때문setAttribute() 메소드로 request 객체에 속성 값으로 저장해서 보내준다.

request.setAttribute("age", "2");	// 속성 이름 : age, 속성 값 : 20

 

반면 이동한 페이지에서 속성 값을 얻어 와서 사용하려면 getAttribute() 메소드의 매개 변수로 속성 이름을 지정해야 한다. 리턴 타입이 Object형이므로 cast 연산자를 이용해야 한다.

String age = (Integer)request.getAttribute("age");	// 속성 값 : age, 속성 이름 : age

sendRedirect() 메소드로 한글을 전송하려면 URLEncoder.encode() 메소드로 인코딩 과정을 거쳐야 한다.

response.sendRedirect("04_main.jsp?name=" + URLEncoder.encode("베네딕토", "UTF-8"));

 

forward() 메소드는 한글 전송을 위해서 별다른 처리를 안해도 된다.

request.setAttribute("name", "베네딕토");

 

이렇게 넘겨진 String형 데이터를 이동한 페이지에서 얻어오려면 리턴타입이 Object형이므로 cast 연산자를 이용해야 한다.

String name=(String)request.getAttribute("name");

 

• 포워드 방식으로 나이를 입력할 수 있는 화면을 제공하는 페이지 예제(05_forwardForm.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>
	입장하려면 나이를 입력하세요. <br>
	<form action="05_forwardTest.jsp">
		<input type="text" name="age">
		<input type="submit" value="입장">
	</form>
</body>
</html>

 

• 포워드 방식으로 나이 판단 페이지 예제(05_forwardTest.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	int age = Integer.parseInt(request.getParameter("age"));
	if(age<=19)
	{
%>
	<script type="text/javascript">
		alert("19세 미만이므로 입장 불가능")
		history.go(-1)
	</script>
<%
	}
	else
	{
		request.setAttribute("name", "베네딕토");
		RequestDispatcher dispatcher = request.getRequestDispatcher("05_forwardResult.jsp");
		dispatcher.forward(request, response);
	}
%>

 

• 포워드 방식으로 전송한 나이와 이름 출력 페이지 예제(05_forwardResult.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
	String age=request.getParameter("age");
	String name=(String)request.getAttribute("name");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body bgcolor=pink>
	forward 방식으로 이동된 페이지 <br>
	나이 : <%=age %>
	이름 : <%=name %>
</body>
</html>

forward 방식으로 이동하면 기존의 request와 response 객체가 유지된다. 그렇기 때문에 05_forwardResult.jsp를 요청한 05_forwardTest.jsp가 아닌 그 전 페이지인 05_forwardForm.jsp에서 입력받은 나이 값을 request 객체의 getParameter() 메소드로 얻어올 수 있다.

'JSP' 카테고리의 다른 글

[JSP&Servlet] JSP 액션 태그  (0) 2020.10.08
[JSP&Servlet] JSP 내장 객체의 영역  (0) 2020.10.08
[JSP&Servlet] JSP 내장 객체  (0) 2020.10.08
[JSP&Servlet] JSP 기본태그  (0) 2020.10.07
[JSP&Servlet] 서블릿과 JSP의 관계  (1) 2020.10.07

+ Recent posts