728x90
서블릿 속성
서블릿 속성이란 다음 세 가지 서블릿 API 클래스에 저장되는 객체(정보)이다.
- ServletContext
- HttpSession
- HttpServletRequest
서블릿 API의 setAttribute(String name, Object value)로 바인딩하고, 필요할 때 getAttribute(String name)으로 바인딩 된 속성을 가져오면 된다. 또한 removeAttribute(String name)을 이용해 속성을 서블릿 API에서 제거할 수도 있다.
서블릿의 스코프
서블릿 API에 바인딩 된 속성에 대한 접근 범위를 의미한다.
- ServletContext에 바인딩 된 속성은 애플리케이션 전체에서 접근할 수 있으므로 애플리케이션 스코프를 가짐
- HttpSession에 바인딩 된 속성은 그 HttpSession에 해당하는 브라우저에서만 접근할 수 있으므로 세션 스코프를 가짐
- HttpServletRequest는 해당 요청/응답에 대해서만 접근하므로 리퀘스트 스코프를 가짐
스코프의 기능
- 로그인 상태 유지 기능
- 장바구니 기능
- MVC의 Model과 View의 데이터 전달 기능
스코프의 종류와 특징
스코프 종류 | 해당 서블릿 API | 속성의 스코프 |
애플리케이션 스코프 | ServletContext | 속성은 애플리케이션 전체에 대해 접근이 가능 |
세션 스코프 | HttpSession | 속성은 브라우저에서만 접근이 가능 |
리퀘스트 스코프 | HttpServletRequest | 속성은 해당 요청/응답 사이클에서만 접근이 가능 |
각 서블릿 API에 바인딩 된 속성의 스코프 알아보기
// SetAttribute.java
package sec01.ex01;
import java.io.IOException;
import java.io.PrintWriter;
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 SetAttribute
*/
@WebServlet("/set")
public class SetAttribute extends HttpServlet {
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
String ctxMesg = "context에 바인딩됩니다.";
String sesMesg = "session에 바인딩됩니다.";
String reqMesg = "request에 바인딩됩니다.";
// HttpServletContext 객체, HttpSession 객체, HttpServletRequest 객체를 얻은 후 속성을 바인딩 함
ServletContext ctx = getServletContext();
HttpSession session = request.getSession();
ctx.setAttribute("context", ctxMesg);
session.setAttribute("session", sesMesg);
request.setAttribute("request", reqMesg);
out.print("바인딩을 수행합니다.");
}
}
ServletContext, HttpSession, HttpServletRequest 객체의 setAttribute( ) 메서드를 이용해 속성을 바인딩 한다.
// GetAttribute.java
package sec01.ex01;
import java.io.IOException;
import java.io.PrintWriter;
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 GetAttribute
*/
@WebServlet("/GetAttribute")
public class GetAttribute extends HttpServlet {
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
ServletContext ctx = getServletContext();
HttpSession sess = request.getSession();
// 각 서블릿 API에서 바인딩 된 속성의 값을 가져옴
String ctxMesg = (String) ctx.getAttribute("context");
String sesMesg = (String) sess.getAttribute("session");
String reqMesg = (String) request.getAttribute("request");
out.print("context값 : " + ctxMesg + "<br>");
out.print("session값 : " + sesMesg + "<br>");
out.print("request값 : " + reqMesg + "<br>");
}
}
브라우저에서 /set으로 요청해 속성을 바인딩한다.
Context와 Session 객체에 바인딩 된 속성은 같은 브라우저에서 접근할 수 있어서 값을 출력하지만, 기존에 바인딩 된 request 객체는 /get으로 요청하여 생성된 request 객체와 다르기때문에 null이 출력된다.
아래와 같이 인터넷 익스플로러에서 /get으로 요청하면 크롬의 세션 객체에는 접근할 수 없어 null을 출력하지만,
Context 객체에 바인딩 된 데이터는 모든 브라우저에서 같은 결과를 출력한다.
728x90
'웹 개발 기초 > 자바 웹을 다루는 기술' 카테고리의 다른 글
Filter API (0) | 2023.02.22 |
---|---|
서블릿의 여러 가지 URL 패턴 (0) | 2023.02.22 |
세션을 이용한 로그인 예제 (0) | 2023.02.22 |
encodeURL( ) 사용법 (0) | 2023.02.22 |
세션을 이용한 로그인 정보 바인딩 실습 (0) | 2023.02.22 |