다연이네

[days02] 리다이렉트(redirect)와 포워딩(forward)의 차이점 본문

JSP

[days02] 리다이렉트(redirect)와 포워딩(forward)의 차이점

 다연  2020. 12. 23. 22:45
반응형

ex07.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="">
<style>
</style>
<script>
   $(document).ready(function (){     
   });
</script>
</head>
<body>
<!-- 리다이렉트(redirect)와 포워딩(forward)의 차이점 -->
<%
	String name = "admin";
	int age = 20;
	String params = String.format("?name=%s&age=%d", name, age);
%>
<a href="ex07_redirect.jsp<%= params %>">리다이렉트(redirect)</a><br>
<a href="ex07_forward.jsp<%= params %>">포워딩(forward)</a><br>
</body>
</html>

ex07_redirect.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
//ex07_redirect.jsp?name=admin&age=20 받아서
String name = request.getParameter("name");
String age = request.getParameter("age");
String params = String.format("?name=%s&age=%s", name, age);

	String location = "ex07_finish.jsp"+params; 
	response.sendRedirect(location);
%>

<!-- 
http://localhost/jspPro/days02/ex07_finish.jsp
redirect가 아니라 finish 경로가 떴고, name, age 파라미터 전달이 안됐다

왜?
ex07에서 get방식으로 요청 -> redirect로 오니까 sendRedirect해서 
 ex07(클라이언트)한테 다시 요청하라고 시킴 (브라우저에서 다시 finish요청한 것)
 -- 서버에서 간 것이 아니라 클라이언트한테 요청하라고 시키는 것이 sendRedirect
 
 다시 새로운 요청이 일어났기 때문에 처음 요청시 파라미터 값은 전달이 안된다.
 (새로운 요청 인것)
 
 그러면 다시 finish한테도 파라미터 값을 넘기기 위해선 어떤 작업을 ?
 인위적으로 파라미터값을 받아 넘겨줘야 한다 (위의 4,5,6줄 추가해줌)
-->

ex07_finish.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="">
<style>
</style>
<script>
   $(document).ready(function (){     
   });
</script>
</head>
<body>
<!-- ex07.jsp -> xe07_redirect.jsp -> (리다이렉트) ex07_finish.jsp -->
<%
	String name = request.getParameter("name");
	String age = request.getParameter("age");
%>

> ex07.jsp에서 전송된 name값 : <%=name %><br>
> ex07.jsp에서 전송된 age값 : <%=age %><br>
</body>
</html>

ex07_forward.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%

	//RequestDispatcher == 요청배송(파견)기
	String path = "ex07_finish.jsp";
	//전달자 객체 생성
	RequestDispatcher dispatcher = request.getRequestDispatcher(path);
	dispatcher.forward(request, response); //기본 객체
	//위 두줄은 그냥 암기 (포워딩 시킬 때)
%>

<!-- http://localhost/jspPro/days02/ex07_forward.jsp?name=admin&age=20 -->
<!-- 마지막이 finish가 아니다. finish로 간지도 모른다 그런데 파라미터 값이 전달 됐다 (이게 차이점) -->

<!-- 
정리
redirect로 요청시 finish로 바로 간게 아니라 클라이언트한테 알려서 브라우저인 클라이언트에서 새로 요청한 것
== 그전의 파라미터는 전달이 안돼서 인위적으로 finish뒤에 달아줘야 함

포워드는 RequestDispatcher 전달자를 만들면 클라이언트는 모르게 서버에서 finish로 전달시킴
+request, response로 파라미터를 줬기 때문에 처음 파라미터 name, age를 받을 필요도 없다
request, response가 finish까지 전달되어졌기 때문에

둘의 차이점 꼭 알고 있어야 하고, 이유 알아야 한다 개념,,+
 -->

리다이렉트 클릭시
포워딩 클릭시

반응형
Comments