JSP 4일차
상태정보
상태정보 유지
- 서블릿, JSP도 HTTP 프로토콜 기반에서 동작하는 웹 프로그램 ⇒ 무상태 특성
- 이전 요청에서 처리된 결과 사용하려면 클라이언트나 서버에 저장해서 유지해야 함
저장 위치
- 클라이언트
- 웹 브라우저에 저장
- 브라우저가 종료되기 전까지 정보 유지, 또는 종료된 후에도 유지 가능
- 쿠키(Cookie)
- 서버
- 서버의 힙 메모리 영역에 만들어진 객체에 상태정보를 저장
- 객체가 힙 메모리 영역에 존재하는 한 계속해서 사용 가능
유지 기간
- 웹 애플리케이션 단위 유지
- 웹 애플리케이션이 서비스되고 있는 동안
- ServletContext
- 클라이언트 단위 유지
- 클라이언트별로 구분해서 유지
- A 클라이언트가 계속 사용해야 할 상태정보를 다른 클라이언트가 사용할 수 없어야 할 때 사용
- 쿠키
- 요청 단위 유지
- 클라이언트의 서비스 요청 단위로 유지
ServletContext
- 웹 애플리케이션 단위로 정보를 서버 쪽에 유지할 수 있는 방법
- 서블릿가 서블릿 컨테이너 간의 통신 기능 제공
servletContext 생성
- 서블릿 컨테이너가 시작될 때 웹 서버에 등록된 웹 애플리케이션 단위로 하나의 ServletContext 객체 자동 생성, 중지될 때 소멸
- 웹 애플리케이션 단위로 컨텍스트가 생성되는 이유 ⇒ 서블릿 컨테이너가 웹 애플리케이션 단위로 관리할 수 있게 하기 위해
ServletContext 변수
- 설정
- 웹 애플리케이션 단위로 사용할 수 있는 변수 선언하고 활용하려면
web.xml
에 변수 선언 ⇒ ServletContext 객체로 추출 -
<context-param>
태그 사용 -
<param-name>
변수의 이름 설정 -
<param-value>
변수의 값 설정
- 웹 애플리케이션 단위로 사용할 수 있는 변수 선언하고 활용하려면
- 추출
-
getInitParameter()
메소드 사용
-
서버 정보 추출
- 웹 애플리케이션 단위로 만들어진 ServletContext 객체를 통해 웹 애플리케이션에 관한 정보 추출
웹 애플리케이션 단위 정보 공유
- 동일한 웹 애플리케이션 안에 있는 모든 페이지에서 동일한 ServletContext 객체 사용
- void setAttribute(String name, Object value) : 웹 애플리케이션 범위에서 공유할 데이터 ServletContext 객체에 등록
- Object getAttribute(String name) : ServletContext 객체에 등록한 데이터 추출
- void removeAttribute(String name) : setAttribute() 메소드로 등록한 데이터 삭제
쿠키
- 클라이언트 단위로 상태정보를 유지해야 할 경우 사용
쿠키란
- 서버가 클라이언트에 저장하는 정보
- 클라이언트 쪽에 필요한 정보를 저장해놓고 필요할 때 추출하는 것을 지원하는 기술
- 클라이언트와의 연결이 끊어져도 클라이언트마다 개별적으로 상태 정보를 유지하고자 할 때 활용
쿠키 사용
- 쿠키 생성 : Cookie(String name, String value)
- 쿠키 유효 시간 설정 : setMaxAge(int expiry)
- 쿠키 경로 설정 : setPath(String uri)
- 쿠키 도메인 설정 : setDomain(String domain)
- 쿠키 전송 : addCookie(Cookie cookie)
쿠키 추출
- 쿠키 추출 : Cookie[] getCookie()
- 쿠키 검색 : String getName()
- 쿠키 값 추출 : String getValue()
세션
- HTTP 기반으로 동작하는 클라이언트가 서버에 정보를 요청할 때 생성되는 상태정보
- 로그인, 로그아웃 기능에 주로 사용
세션 생성
- HttpWervletRequest의 getSession() : 클라이언트가 갖고 있는 세션 ID와 동일한 세션 객체 찾아 주소 반환. 세션이 없으면 새로운 HttpSession 객체 생성하여 반환
- HttpWervletRequest의 getSession(boolean create) : 클라이언트가 갖고 있는 세션 ID와 동일한 세션 객체 찾아 주소 반환. 세션이 없으면 매개변수 create가 true면 새로운 객체 생성 후 반환, false면 null 반환
HttpServletRequest
- 여러 페이지 간 공유하는 방법
-
HttpServletRequest 객체는 클라이언트로부터 실행 요청 들어올때마다 서블릿의 service() 메소드 실행되기 전에 자동 생성, service() 메소드 종료되면 자동 소멸
⇒ 여러 페이지에서 공유할 정보를 저장하는게 의미가 있을까?
- 한번의 클라이언트 요청으로 실행된 여러 페이지 간 데이터를 공유할 때 사용
요청 재지정
- 요청 재지정 : 클라이언트가 요청한 페이지가 실행되다가 다른 페이지로 이동하는 것
- HttpServletResponse 요청 재지정
- 해당 메소드 사용해서 요청을 재지정할 경우 다른 웹 애플리케이션의 파일이나 다른 웹서버의 자원으로 요청을 재지정 할 수 있음.
- RequestDispatcher 요청 재지정
- 요청을 재지정하는 자원이 반드시 현재 자원과 동일한 웹 애플리케이션에 있어야만 함
- RequestDispatcher 객체 생성
- forward(ServletRequest request, ServletResponse response) : 클라이언트 요청으로 생성되는 두 객체를 다른 자원에 전달하고 수행 제어를 완전히 넘겨 다른 자원의 수행 결과를 클라이언트로 응답
- include(ServletRequest request, ServletResponse response) : 클라이언트 요청으로 생성된 두 객체를 다른 자원에 전달하고 수행한 다음, 그 결과를 클라이언트에서 요청한 서블릿 내에 포함하여 클라이언트로 응답
- Request 단위 정보 공유
- forward(), include() 메소드를 이용해 다른 페이지로 이동할 때 현재 페이지가 사용하는 HttpServletRequest, HttpServletResponse 객체를 그대로 전달하면서 이동 ⇒ 이전 페이지나 이동한 페이지나 같은 객체 사용
- 한번의 요청으로 실행된 페이지끼리 정보 공유할 때 사용