본문 바로가기
Jsp

[jsp 내장 객체] pageContext, request, session, application의 Scope

by 쟈근꿈틀이 2022. 5. 11.
728x90

jsp 내장 객체: pageContext, request, session, application

내장 객체 범위(Scope)
pageContext 현재 JSP 페이지에서만 
request 클라이언트가 특정 리소스를 요청했을 때부터 다른 리소스를 요청하기 전까지
session 웹 서버와 클라이언트가 연결된 후부터 연결이 끊기기 전까지
application 웹 서버가 시작된 후부터 종료되기 전까지

 


웹 서버가 클라이언트를 식별하는 방법: 세션 아이디(sessionId)

 

웹 서버는 다양한 웹 브라우저와 동시에 연결을 맺을 수 있다.

만약 크롬과 마이크로소프트 엣지라는 웹 브라우저를 클릭하였다고 가정해보자!

웹 서버의 클라이언트는 Chrome과 Microsoft Edge로 하나의 웹 서버가 동시에 두 클라이언트와 연결된 상태이다.

이때 웹 서버는 어떻게 두 클라이언트를 구분할 수 있을까?

 

클라이언트(웹 브라우저)가 웹 서버에게 첫 요청을 보내면, 서버는 요청을 처리한 후 응답 헤더에 set-cookie를 추가하여 응답한다. 클라이언트는 부여된 고유한 세션 아이디를 헤더에 추가한다.

이후에 클라이언트가 웹 서버에게 요청을 보낼 때마다 웹 서버는 헤더의 세션 아이디를 확인한다.

웹 서버클라이언트를 고유한 값인 세션 아이디를 통해 식별할 수 있다.

 


redirect와 forward방식의 차이점

 

 

a태그의 href, 자바 스크립트의 location.href, response의 sendRedirect()를 통한 페이지의 이동은 모두 클라이언트의 request가 유지되지 않고, 클라이언트가 웹 서버에게 받은 경로(/b.jsp)를 재요청하고 이에 대한 응답을 웹 서버에게 전달받는 방식이다.

 

그와 달리 RequestDispatcher를 통한 제어 이동웹 서버가 클라이언트가 요청한 jsp 파일(a.jsp)을 실행하고, 그 결과를 response에 담아 클라이언트에게 전달한다. 

따라서 클라이언트의 request가 유지된다.

이때 외부에 존재하는 파일 즉, 다른 프로젝트에 존재하는 파일(Context root가 다른 파일)은 forward를 통해 처리될 수 없다.


예제를 통해 자세히 알아보자!

 

ex05_A.jsp

 

<html>
<head>
<meta charset="UTF-8">
<title>ex05_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="ex05_C.jsp">C페이지로 이동</a> 
</body>
</html>

 

웹 브라우저가 웹 서버에게 ex05_A라는 jsp 파일을 요청(request)하였고, 웹 서버는 이를 실행한 페이지를 웹 브라우저에게 전달할 것이다(응답; response).

 

웹 서버가 ex05_A를 실행하며 pageContext 내장 객체에 id라는 속성에 pageId라는 값을 저장한다.

내장 객체인 request, session, application에도 역시 동일한 방법으로 속성 값이 저장됐다.

그 후, RequestDispatcher를 통해 forward 방식으로 ex05_b.jsp로 이동하였다.

forward 방식은 웹 브라우저의 ex05_A 요청에 대한 응답으로서 ex05_B를 실행한 결과를 클라이언트에게 전달한다.

 

ex05_B.jsp
<html>
<head>
<meta charset="UTF-8">
<title>ex05_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="ex05_C.jsp">C페이지로 이동</a> 
</body>
</html>

 

 

이때, request의 요청이 유지되었으므로 request 내장 객체의 id 속성 값도 역시 유지된다.

session과 application 객체 역시 소멸되지 않았으므로 id 속성 값도 유지된다.

하지만, pageContext 객체의 scope는 ex05_A 페이지이므로, 이를 벗어난 순간 객체와 속성이 모두 소멸된다.

 

C페이지로 이동하는 a태그를 클릭해보자!

 

ex05_C.jsp
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>C페이지</h2>
	페이지: <%=pageContext.getAttribute("id") %><br>
	요청: <%=request.getAttribute("id") %><br>
	세션: <%=session.getAttribute("id") %><br>
	애플리케이션: <%=application.getAttribute("id") %><br>
</body>
</html>

 

 

a태그를 클릭하면, 웹 서버는 ex05_C 페이지의 경로를 웹 브라우저에 보낸다.

웹 브라우저는 전달받은 경로로 웹 서버에 새롭게 요청(request)을 보내고, 웹 서버는 ex05_C 파일을 실행한 결과를 클라이언트에게 전달한다.

웹 브라우저가 새로운 요청을 보낼 때 기존 request객체는 소멸되었고, session과 application객체는 소멸되지 않았다.

 

 

 

 

 

 

 

 

  

 

 

 

 

 

 

 

 

 

참고

https://dololak.tistory.com/502

 

[서블릿/JSP] RequestDispatcher란. RequestDispatcher로 forward() 하기

참고글 [서블릿/JSP] JSP 리다이렉트로 페이지 이동시키기 [서블릿/JSP] JSP 기본객체 종류 [HTTP] 리다이렉트(Redirect)란? RequestDispatcher란 RequestDispatcher는 클라이언트로부터 최초에 들어온 요청을 JSP..

dololak.tistory.com

 

728x90