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
'Jsp' 카테고리의 다른 글
[jsp] 회원가입, 회원정보 수정, 회원탈퇴(필수 값 검증, 정규표현식 검증) (0) | 2022.05.17 |
---|---|
[jsp 내장 객체] session 개념, 로그인 성공 시 아이디 저장 예제 (0) | 2022.05.12 |
[jsp] jsp 내장 객체: request (0) | 2022.05.10 |
[jsp] 에러 페이지 설정: 지시자, web.xml, 서블릿 (0) | 2022.05.09 |
Form태그(get방식, post방식) (0) | 2022.04.26 |