각 속성을 setAttribute()로 바인딩하고 getAttribute()로 꺼내서 쓴다.
서블릿 스코프scope란, 서블릿 속성에 접근할 수 있는 범위를 말한다.
스코프 종류 | 해당 서블릿API | 속성의 스코프 |
---|---|---|
애플리케이션 스코프 | ServletContext | 속성은 애플리케이션 전체에서 접근할 수 있다. |
세션 스코프 | HttpSession | 속성은 브라우저에서만 접근할 수 있다. |
리퀘스트 스코프 | HttpServletRequest | 속성은 해당 요청-응답 사이클 안에서만 접근할 수 있다. |
ServletContext, HttpSession, HttpServletRequest
각각 서블릿API의 스코프를 알아보는 예제다.
SetAttribute.java
@WebServlet("/seta")
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 contextMsg = "context에 바인딩 됩니다.";
String sessionMsg = "session에 바인딩 됩니다.";
String requestMsg = "request에 바인딩 됩니다.";
ServletContext ctx = getServletContext();
HttpSession session = request.getSession();
ctx.setAttribute("context", contextMsg);
session.setAttribute("session", sessionMsg);
request.setAttribute("request", requestMsg);
out.print("binding.....");
RequestDispatcher dis = request.getRequestDispatcher("/geta");
dis.forward(request, response);
}
}
GetAttribute.java
@WebServlet("/geta")
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();
String contextMsg = (String)ctx.getAttribute("context");
String sessionMsg = (String)session.getAttribute("session");
String requestMsg = (String)request.getAttribute("request");
out.print("context : " + contextMsg + "<br>");
out.print("session : " + sessionMsg + "<br>");
out.print("request : " + requestMsg + "<br>");
}
}
리퀘스트 스코프인 경우, 모든 서블릿API가 접근할 수 있다.
RequestDispatcher dis = request.getRequestDispatcher("/geta");
dis.forward(request, response);
Dispatcher를 이용하여 GetAttribute서블릿으로 이동하도록 포워드 했으므로,
GetAttribute서블릿이 request.setAttribute(..)로 보낸 정보를 getAttribute()로 꺼내볼 수 있다.
위 코드를
response.sendRedirect("/geta");
이렇게 바꾼다면, 과정은 이렇다.
브라우저 -> '/seta' -> 브라우저 -> '/geta'
바꿔 말하자면, 요청 -> 응답 -> 요청 -> 응답이다. request스코프는 설명했다시피 요청 - 응답 한 사이클 안에서만 유효하다. 따라서 위처럼 반복하면, 바인딩된 값이 유실될 수밖에 없다.
위에서 코드는 그대로 유지한 채로, 다른 브라우저를 이용해서 '/geta'에 접속하면 이런 결과가 나타난다.
엣지 브라우저로 접속한 결과다.
SetAttribute.java에서 세션 객체에 바인딩한 값은 Chrome에 저장된다. 엣지 브라우저에서 크롬 세션에 접근할 수 없기 때문에 null을 반환한다. 반면 Context객체에 바인딩된 데이터는 파이어폭스나 사파리로 접속해도 같은 결과를 얻을 수 있다.
어플리케이션 스코프 같은 경우는 다른 디바이스로 접속해도 같은 결과가 나올까요?