이번 포스팅 주제는 서블릿 스코프(Scope)이다.
서블릿에서는 필요시 임의의 데이터를 저장하고 나중에 저장된 데이터를 사용할 수 있는 4가지 저장소를 제공한다.
1) Page, 2) Request, 3) Session, 4)Application
해당 스코프에 대해서 정리하고 실습을 시작하자.
1. Page 스코프
- 한 번의 클라이언트 요청으로 하나의 JSP 페이지가 응답한다.
- 하나의 JSP 페이지 내에서만 데이터를 저장 및 공유 한다.
- JSP 파일에는 pageContext가 내정되어 있어 Page 내부에서만 사용 가능하다.
- JSP 파일에 <% %> 태그를 사용하여 JSP 파일 내에서 변수를 사용하는데 이는 Page 스코프에 저장하여 사용하다
2. Request 스코프
- HttpServletRequest API 사용
- 요청 ~ 응답까지의 Life Cycle을 가진다. (Response 시 해당 스코프는 삭제 된다.)
- setAttribute(Key, value)와 getAttribute(Key) 메서드를 사용한다.
3. Session 스코프
: 톰캣의 세션, 서블릿의 세션이라는 말과 함께 데이터를 저장하는 장소 중 가장 많이 들어본 단어이다. Session 스코프의 특징은 다음과 같다
- HttpSession API 사용
- 브라우저의 Life Cycle을 가짐
- SetAtttibute(Key, value)와 getAttribute(Key) 메서드를 사용한다.
4. Application
: 해당 어플리케이션이 종료 되기 전까지 저장한다.
- SerlvetContext API 사용
- 웹 어플리케이션에서의 context의 Life Cycle을 가짐
- setAttribute(key, value)와 getAttribute(key) 메서드 이용
이중 2,3,4번에 항목에 대해서 실습을 진행하였다.
//setServlet (값 set 서블릿)
package com.controller;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class SetServlet
*/
@WebServlet("/setServlet")
public class setServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public setServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//1.request 스코프에 저장, HttpServletRequest 이용.
request.setAttribute("request", "리퀘스트 스코프 테스트");
// 2. Session 스코프 저장, HttpSession API 이용
HttpSession session = request.getSession();
session.setAttribute("session", "세션 스코프 테스트");
// 3. application 스코프에 저장, ServletContext API 이용
ServletContext application = getServletContext();
application.setAttribute("application", "어플리케이션 스코프 테스트");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
/*
* 스코프는 총 네개로
* 1) Page
* 2) Request
* 3) Session
* 4) Application
*
*/
}
// 값 불러오기 (getServlet)
package com.controller;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class getServlet
*/
@WebServlet("/getServlet")
public class getServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public getServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// 1. request 스코프 데이터 얻기, HttpServletRequest API 사용, 단 getAttribute는 Object 리턴이므로 String 형변환 해줘야한다, life-cycle이 요청 - 응답에 해당
String name = (String) request.getAttribute("request");
System.out.println(name);
// 2. Session 스코프 저장, HttpSession API 이용, life-cycle이 브라우저에 해당됨.
HttpSession session = request.getSession();
String sessionName = (String) session.getAttribute("session");
System.out.println(sessionName);
// 3. application 스코프에 저장, ServletContext API 이용
ServletContext application = getServletContext();
String appRequest = (String)application.getAttribute("application");
System.out.println(appRequest);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
setServlet -> getServlet 페이지로 이동하면
Request값은 null, 그 외 session, application 값은 모두 출력된다.
왜냐하면 request는 setServlet setServlet의 Response 후 getServlet 페이지 이동하기 때문에 값은 null로 바뀌게 된다.
해당 이미지는 웨일에서 setServlet를 호출하고 크롬에서 getServlet을 호출 했는데 세션 스코프가 null값이 나오는 현상이다. 즉 브라우저 Life Cycle에 따라 저장된다는 것을 확인 할 수 있다.
끝.
'개발 지식 > JSP & Servlet' 카테고리의 다른 글
[JSP & Servlet] 서블릿 요청 처리 (0) | 2020.08.09 |
---|---|
[JSP & Servlet] 서블릿 파라미터(init-Param, context-param) (0) | 2020.08.07 |
[JSP & Servlet] doGet, doPost 그리고 기타 메소드의 lifeCycle (0) | 2020.08.04 |
[JSP & Servlet] Servlet 이란 무엇일까? (0) | 2020.08.04 |
댓글