잡동사니에도 사랑을

[21.10.07] start.jsp / sendProc / sendResult / forwardProc / forwardResult(exam) - 페이지 이동(sendRedirect 와 forward 이용) 본문

JAVA_EE/EL-JSTL

[21.10.07] start.jsp / sendProc / sendResult / forwardProc / forwardResult(exam) - 페이지 이동(sendRedirect 와 forward 이용)

luvforjunk 2021. 10. 7. 11:00
728x90
반응형

이번 시간 다룰 내용은 페이지 이동 방식인 sendRedirect와 forward방식이다.

웹은 현재 작업 중인 페이지에서 다른 페이지로 이동하기 위해 위 두가지 페이지 전환 기능을 제공한다.

두 방식의 특징을 알아보자.

 

[sendRedirect]

 

1. jsp파일을 만들 때마다 request, response가 생성된다.

2. sendRedirect는 단순 이동으로, 데이터가 공유되지 않는다.

    - 예를 들어, aa.jsp에서 request영역에 변수명 apple, 사과라는 데이터를 갖고 bb.jsp로 이동하려는데, bb.jsp는 그 데이터를 알지 못한다. aa.jsp와 bb.jsp는 각각의 페이지를 갖고 request, response를 따로따로 관리하기 때문이다.

 

 

 

 

[forward]

 

1. Web container 차원에서 페이지 이동만 존재할 뿐 실제 웹 브라우저는 다른 페이지로 이동했음을 알 수 없다.

   - 웹 브라우저에는 최초 호출한 URL이 표시되고, 이동한 페이지의 URL정보는 확인할 수 없다.

2. 데이터가 공유된다

    - aa.jsp와 bb.jsp에서 request, response가 따로 관리되는 것이 아닌 하나로 통합된다.

 

 

 

 

 

 

////////start.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>
<font color="red"><b>
start.jsp - sendPro.jsp - sendResult.jsp 페이지 이동합니다<br>
sendRedirect로 이동하므로 데이터는 공유하지 않습니다<br>
주소는 sendResult.jsp가 보인다<br>
</b></font>
<br>

<font color="blue"><b>
start.jsp - forwaedProc.jsp  - forwardResult.jsp 페이지 이동합니다<br>
forward로 이동하므로 데이터는 공유합니다<br>
주소는 forwardProc.jsp로 보이지만 결과는 forwardResult.jsp가 나온다<br>
</b></font>
<br>

<input type="button" value="sendRedirect" onclick="location.href='sendProc.jsp'">
<input type="button" value="forward" onclick="location.href='forwardProc.jsp'">

</body>
</html>

 

 

 

 

////////sendProc.jsp

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

<% 
//데이터
request.setAttribute("apple", "사과");

//페이지 이동
response.sendRedirect("sendResult.jsp");
%>

*주요 내용

→ request.setAttribute("apple", "사과");의 의미 : request라는 영역 안에 apple이라는 변수와 사과라는 데이터를 넣어놓은 것

→ <% %> : JSP 코드 중 JAVA 구현 부분. 서버에서 실행된다.

 

 

////////sendResult.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
String apple = (String)request.getAttribute("apple"); 
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
결과 = <%=apple %>
</body>
</html>

<!-- 
sendProc에서의 request와 sendResult에서의 request는 다른 것이다. 
같은 것이 절대 아니다. 
-->

*주요 내용

→ String apple = (String)request.getAttribute("apple");의 의미 : Attribute에서 apple이라는 변수를 꺼내와라

 

 

 

////////forwardProc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   
<% 
//데이터
request.setAttribute("apple", "사과");

//페이지 이동
//forward와 같은 의미
RequestDispatcher dispatcher = request.getRequestDispatcher("forwardResult.jsp");
//상대 번지만 먹히고, 절대 번지는 형식 자체상의 이유로 쓸 수 없다
dispatcher.forward(request, response); //제어권 넘기기
%>

<%-- <jsp:forward page = "forwardResult.jsp" /> --%>

<!-- 
forwardProc에서의 request와 forwardResult에서의 request는 같은 것이며,
관리는 forwardProc에서 한다. forwardResult의 request는 죽은 것이다
-->

*주요 내용

RequestDispatcher의 개념 :

     - 클라이언트로부터 최초에 들어온 요청(request)에 담긴 정보를 저장하고 있다가

       다음 페이지에서도 해당 정보를 볼 수 있도록 계속해서 저장하는 기능을 한다.

RequestDispatcher의 forward() 메서드 :

     - forward()메서드는 대상 자원으로 제어를 넘기는 역할을 한다.

       브라우저에서 a.jsp로 요청했을 때 a.jsp에서 forward()를 실행하여 b.jsp로 제어를 넘길 수 있다.

       브라우저에게 출력되는 결과는 b.jsp가 되는 것이다. 

 

 

 

 

////////forwardResult.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
String apple = (String)request.getAttribute("apple"); 
%>      
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
결과 = <%=apple %>
</body>
</html>

 

 

 

결과창1 - start.jsp

 

결과창2 - 주소는 sendResult.jsp가 보인다

 

결과창3 - 주소는 forwardProc.jsp로 보이지만 결과는 forwardResult.jsp가 나온다

 

728x90
반응형