JSP - pageContext, request, session, application forward(2022-09-24)

2022. 9. 24. 13:523층 1구역 - 개발의 장/JSP

1. 서론 

pageContext, request, session, application forward의 법칙에 대해 알아보도록 하자.

 

2. 본론

 

일단 들어가기 전에 

pageContext, request, session, application 이 4가지 객체는 뒤에 .setAttribute(String, object);

가 따라 붙게 된다. pageContext로 예를 들자면 pageContext.setAttribute(속성이름(String), 속성의 데이터(object));

로 나타내는 것이다. 그래서 출력할 때 속성이름을 선택해 출력하면 속성에 담겨있는 데이터들이

각각의 법칙에 따라 나온다.

 

ex5_A.jsp

<%
	//setAttribute("속성이름(String)", "속성데이터(object)")
	
	//pageContext는 코드를 사용한 페이지 안에서만 인식이 가능
	//지역변수같은 느낌.
	//그래서 다른 페이지에서 사용하고 싶지 않을 경우 pageContext를 사용함.
	pageContext.setAttribute("id", "pageId");
	
	//request는 하나의 request에서만 사용가능.
	//새로운 request가 발생할 경우 기존 request는 사용할 수 없음.
	request.setAttribute("id", "requestId"); //하나의 요청
	
	//세션은 클라이언트 별 구분
	//(두 클라이언트가 네이버에 접속했을 때, 한 클라이언트는 메일로 갈 수 있고, 다른 클라이언트는 뉴스로 갈 수 있는데 sessionid가 다르기 때문에 가능)
	//클라이언트가 서버에 접속을 하면 session일 경우 처음이라고 인식하면 sessionID를 부여해줌.
	//이후, 클라이언트가 다시 서버에 접속할 경우 그 sessionID로 인식한다.
	//만약 웹페이지를 닫고 재시작 할 경우 sessoin은 클라이언트가 처음 접속이라고 인식하여 sessionID를 새로 부여.
	//은행에서 업무를 보기 위해 번호표를 뽑아가는 것과 비슷한 원리
	//그래서 주로 사용함. 좁은 공간으로 보면 이건 하나의 cookie라고 볼 수 있음.
	session.setAttribute("id", "sessionId");
	
	//application 공용으로 쓰게 된다. 예를 들자면, a클라이언트가 naver메인페이지를 보고 있다면 b,c클라이언트 또한 naver메인페이지를 보고 있다.
	//공용 공간이 생긴다.
	//쓰는 경우는 드물기 때문에 이런게 있다 라고만 기억해두자.
	application.setAttribute("id", "applicationId");
	
	//forward는 예를 들자면 어떤 회사 지원자(클라이언트)가 안내데스크(서버)에 인사과가 어디냐고 물어봤을 때, 안내데스크에서 인사과(클라이언트의 최종 목표사이트)에 가서 지원자가 왔다 라고 보고 후
	//안내데스크에서 저쪽으로 가면 인사과가 있다고 사용자에게 알려주는 것.
	
	//sendRedirect는 사용자가 안내데스크에 인사과 어디냐고 물어보면, 저쪽에 인사과가 있다고 알려주는 것(무책임 함).(사용자가 길을 잃기때문에 새로운 경로가 만들어져 기존의 request와 response는 사용 불가.)
	//둘의 차이는 안내데스크에서 사람이 움직였냐 안 움직였냐.
	request.getRequestDispatcher("ex5_B.jsp").forward(request, response);
	%>

 

ex5_Bjsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex5_B</title>
</head>
<body>
	<h2> B 페이지 </h2>
	페이지 : <%=pageContext.getAttribute("id") %> <br>
	요청 : <%=request.getAttribute("id")%><br>
	세션 : <%=session.getAttribute("id") %><br>
	애플리케이션 : <%=application.getAttribute("id") %><br>
	
	<a href="ex5_C.jsp">C 페이지로 이동</a>
</body>
</html>

 

ex5_C.jsp

%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex5_C</title>
</head>
<body>
	<h2> C 페이지 </h2>
	페이지 : <%=pageContext.getAttribute("id") %> <br>
	요청 : <%=request.getAttribute("id")%><br>
	세션 : <%=session.getAttribute("id") %><br>
	애플리케이션 : <%=application.getAttribute("id") %><br>
</body>
</html>

 

2-1. pageContext

 

어느 한 페이지에서만 인식을 한다.

자바코드로 비교하자면 지역변수와 비슷한 느낌이다.

그래서 해당 데이터를 다음 페이지에서 사용하고 싶지 않다면 context를 쓴다.

 

먼저 ex5_A로 들어왔을 경우 적힌코드가 내장객체밖에 없기 때문에 전송요청이 들어가게 되며

B웹으로 넘어오게 된다. 이에 페이지의 값은 null이 된다. 즉, pageContext는 ex5_A.jsp에서 사용되었으나 B에서는 사용하지 않겠다는 것.

 

이제 C웹으로 넘어가 보자.

2-2. request

 

request는 하나의 요청에서만 사용가능하다.

새로운 요청(request)가 발생할 경우 기존의 request는 사용할 수 없다.

 

 

C웹에선 request도 null이 되었다. 그 말은 A → B로 넘어가는 과정에서 request가 유지되었으나,

B→C로 넘어갈 때 해당 request가 이루어 지지 않았다는 것. 이렇게 request는 하나의 과정에서만 사용이 가능하다.