서블릿 속성이란 다음 세 가지 서블릿 API 클래스에 저장되는 객체(정보)라고 보면 됨.
각 장은 앞 장에서 이미 사용해 봤음. 서블릿의 API의 setAttribute(String name, Object value)로 바인딩하고, 필요할 때 getAttrubute(String name)으로 바인딩된 속성을 가져오면 됨. 또한 removeAttribute(String name)을 이용해 속성을 서블릿 API에서 제거할 수도 있음.
서블릿의 스코프(scope) 는 서블릿 API에 바인딩된 속성에 대한 접근 범위를 의미함. 앞 장에서도 사용해 봤듯이 ServletContext에 바인딩된 속성은 애플리케이션 전체에서 접근할 수 있으므로 애플리케이션 스코프를 갖음.
HttpSession에 바인딩된 속성은 그 HttpSession에 해당하는 브라우저에게만 접근할 수 있으므로 세션 스코프를 갖음.
HttpServletRequest는 해당 요청/응답에 대해서만 접근하므로 리퀘스트 스코프를 갖음.
스코프의 기능은 다음과 같음.
애플리케이션 스코프 : ServletContext - 속성은 애플리케이션 전체에 대해 접근할 수 있음.
세션 스코프 : HttpSession - 속성은 브라우저에서만 접근할 수 있음.
리퀘스트 스코프 : HttpServletRequest - 속성은 해당 요청/응답 사이클에서만 접근할 수 있음.
예 ) 각 서블릿 API에 바인딩된 속성의 스코프를 알아보겠음.
ServletContext, HttpSession, HttpServletRequest 객체의 setAttribute() 메서드를 이용해 속성을 바인딩함.
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;
@WebServlet("/SetAttribute")
public class SetAttribute extends HttpServlet {
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("바인딩을 수행합니다.");
}
}
각 서블릿 API들의 getAttribute 메서드를 이용해 속성 이름으로 바인딩한 값을 가져와 브라우저로 출력함.
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;
@WebServlet("/get")
public class GetAttribute extends HttpServlet {
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 session = request.getSession();
// 각 서블릿 API에서 바인딩된 속성의 값을 가져옴.
String ctxMesg = (String)ctx.getAttribute("context");
String sesMesg = (String)session.getAttribute("session");
String reqMesg = (String)request.getAttribute("request");
out.print("context 값 : " + ctxMesg + "<br>");
out.print("session 값 : " + sesMesg + "<br>");
out.print("request 값 : " + reqMesg + "<br>");
}
}