자바(JAVA)/JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)
JAVA/JSP 9. 내장 객체의 영역(Scope) - session 영역, application 영역
개발학생
2023. 5. 3. 13:24
반응형
3. session 영역
- session: 클라이언트가 서버에 접속해 있는 상태 혹은 단위. 주로 회원인증 후 로그인 상태를 유지하는 처리에 사용됨 → 포털 사이트에서 웹 브라우저를 닫으면 자동으로 로그아웃이 되는 이유가 session 객체의 특성 때문
- 클라이언트가 웹 브라우저를 최초로 열고 난 후 닫을 때까지 요청되는 모든 페이지는 session 객체 공유 가능
*session 영역 동작 확인, session 영역이 이동된 페이지에서도 공유되는지 확인
//session 영역 동작 확인용
//SessionMain.jsp
<%@ page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset="UTF-8"
page encoding="UTF-8"%>
<%
//1.(아래 코드 3줄)
ArrayList<String> lists = new ArrayList<String>();
list.add("리스트");
list.add("컬렉션");
session.setAttribute("lists", lists); //2.
%>
<html>
<head><title>session 영역</title></head>
<body>
<h2>페이지 이동 후 session 영역의 속성 읽기</h2>
<a href="SessionLocation.jsp">SessionLocation.jsp 바로가기</a> //3.
</body>
</html>
- ArrayList 컬렉션 생성 후 2개의 String 객체를 저장
- 1.의 ArrayList 컬렉션을 통째로 session 영역에 저장
- session 영역이 이동된 페이지에서도 공유되는지 확인하기 위한 링크
//링크릴 클릭해 이동할 페이지(session 영역이 이동된 페이지에서도 공유되는지 확인)
//SessionLocation.jsp
<%@ page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head><title>session 영역</title></head>
<body>
<h2>페이지 이동 후 session 영역의 속성 읽기</h2>
<%
ArrayList<String> lists = (ArrayList<String>)session.getAttribute("lists"); //1.
for (String str : lists) //2.
out.print(str + "<br/>");
%>
</body>
</html>
- session 영역에서 속성을 읽어온 후 형변환 [컬렉션 타입은 ArrayList(String)]
- for문을 이용해 ArrayList(String) 컬렉션에서 객체들을 꺼내 출력
SessionMain.jsp 파일 실행, [SessionLocation.jsp 바로가기] 링크 클릭
→ 페이지가 이동되었지만, session 영역에 저장된 속성값은 정상적으로 출력됨
- 웹 브라우저 전체를 닫고, SessionLocation.jsp 파일을 실행하면 session 영역의 속성값이 삭제되어 ‘500 에러’ 발생
→ getAttribute(”lists”)로 속성값을 읽어오려 하면 null을 반환하여 NullPointerException이 발생하는 것
→ SessionMain.jsp 파일을 실행하면 그때 새로운 session 객체가 만들어지고,
그때 저장된 속성값이 정상적으로 출력됨
4. application 영역
- 웹 애플리케이션은 단 하나의 application 객체를 생성하고, 클라이언트가 요청하는 모든 페이지가 application 객체를 공유하게 됨
- application 객체는 웹 서버를 시작할 때 만들어지며, 웹 서버를 내릴 때 삭제됨
- 이 영역에 한 번 저장된 정보는 페이지를 이동하거나, 웹 브라우저를 닫았다가 새롭게 접속해도 삭제되지 않음
1) application 영역 동작 확인
//ApplicationMain.jsp
<%@ page import="java.util.HashMap"%>
<%@ page import="common.Person"%>
<%@ page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head><title>application 영역</title></head>
<body>
<h2>application 영역의 공유</h2>
<%
//1.(아래 3줄)
Map<String, Person> maps = new HashMap<>();
maps.put("actor1", new Person("이승기", 30));
maps.put("actor2", new Person("신민아", 28));
application.setAttribute("maps", maps); //2.
%>
application 영역에 속성이 저장되었습니다.
</body>
</html>
- HashMap 컬렉션 생성 후 두 개의 Person 객체를 저장함
- 컬렉션을 통째로 application 영역에 저장함
- 파일 실행 시, application 영역에 속성값이 저장됨
2) application 영역에 저장한 속성을 읽어오는 결과 페이지
//ApplicationResult.jsp
<%@ page import="java.util.Set"%>
<%@ page import="common.Person"%>
<%@ page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head><title>application 영역</title></head>
<body>
<h2>application 영역의 속성 읽기</h2>
<%
Map<String, Person> maps
= (Map<String, Person>)application.getAttribute("maps"); //1.
Set<String> keys = maps.keySet(); //2.
//3.(for 문 전체)
for (String key : keys) {
Person person = maps.get(key);
out.print(String.format("이름 : %s, 나이: %d<br/>",
person.getName(), person.getAge()));
}
%>
</body>
</html>
- application 영역에 저장한 “maps” 속성값을 읽어서 원래 형태인 Map<String, Person> 타입 변수에 저장함
- Map 컬렉션에 담긴 데이터를 확인하려면 key를 알아야 하는데, 여기서 keySet( )으로 얻어 옴
- 확장 for문에서 모든 키에 해당하는 값들을 하나씩 꺼내 출력 → Map에 저장된 객체를 꺼낼 때는 get( ) 사용
- 위처럼 웹 브라우저 전체를 닫고(크롬 창이 단 한 개도 열려 있으면 안 된다) 파일 실행 시, ApplicationMain.jsp에 저장했던 속성값이 여전히 정상 출력됨
- 이클립스 [Severs] 뷰에서 마우스 우클릭 → [Restart]로 톰캣 웹 서버를 재시작해보기 → 웹 브라우저에서는 500 에러 메세지를, 이클립스의 [Console] 뷰에서는 NullPointerException을 확인할 수 있음
반응형