프로그래밍 언어/자바 웹

ServletContext 사용법

· 코딩마이데이

ServletContext 클래스

ServletContext 클래스는 톰캣 컨테이너 실행 시 각 컨텍스트(웹 애플리케이션)마다 한 개의 ServletContext 객체를 생성합니다. 그리고 톰캣 컨테이너가 종료하면 ServletContext 객체 역시 소멸됩니다. ServletContext 객체는 웹 애플리케이션 전체의 공통 자원이나 정보를 미리 바인딩해서 서블릿들이 공유하여 사용합니다.

ServletContext 클래스의 특징은 다음과 같습니다.

  • javax.servlet.ServletContext로 정의되어 있습니다.
  • 서블릿과 컨테이너 간의 연동을 위해 사용합니다.
  • 컨텍스트(웹 애플리케이션)마다 하나의 ServletContext가 생성됩니다.
  • 서블릿끼리 자원(데이터)을 공유하는 데 사용합니다.
  • 컨테이너 실행 시 생성되고 컨테이너 종료 시 소멸됩니다.

ServletContext가 제공하는 기능은 다음과 같습니다.

  • 서블릿에서 파일 접근 기능
  • 자원 바인딩 기능
  • 로그 파일 기능
  • 컨텍스트에서 제공하는 설정 정보 제공 기능

톰캣 컨테이너를 실행할 때 각 애플리케이션에서 생성되는 ServletContext와 ServletConfig 객체를 나타내었습니다. ServeltContext는 컨텍스트당 생성되는 반면에 ServeltConfig는 각 서블릿에 대해 생성됩니다.

톰캣 컨테이너의 ServletContext와 ServletConfig 생성 상태

 

ServletContext에서 제공하는 여러 가지 매서드의 기능을 정리한 것입니다.

메서드 기능
getAttribute(String name) - 주어진 name을 이용해 바인딩된 value를 가져옴
- name이 존재하지 않으면 null을 반환
getAttributeNames( ) 바인딩된 속성들의 name을 반환
getContext(String uripath) 지정한 uripath에 해당되는 객체를 반환
getInitParameter(String name) - name에 해당되는 매개변수의 초기화 값을 반환
- name에 해당되는 매개변수가 존재하지 않으면 null을 반환
getInitParameterNames( ) - 컨텍스트의 초기화 관련 매개변수들의 이름들을 String 객체가 저장된 Enumeration 타입으로 반환
- 매개변수가 존재하지 않으면 null을 반환
getMajorVersion( ) 서블릿 컨테이너가 지원하는 주요 서블릿 API 버전을 반환
getRealPath(String path) 지정한 path에 해당되는 실제 경로를 반환
getResource(String path) 지정한 path에 해당되는 Resource를 반환
getServerInfo( ) 현재 서블릿이 실행되고 있는 서블릿 컨테이너의 이름과 버전을 반환
getServletContextName( ) 해당 애플리케이션의 배치 관리자가 지정한 ServletContext에 대한 해당 웹 애플리케이션의 이름을 반환
log(String msg) 로그 파일에 로그를 기록
removeAttribute(String name) 해당 name으로 ServletContext에 바인딩 된 객체를 제거
setAttribute(String name, Object object) 해당 name으로 객체를 ServletContext에 바인딩
setInitParameter(String name, String value) 주어진 name으로 value를 컨텍스트 초기화 매개변수로 설정

 

ServletContext 바인딩 기능

1. 다음과 같이 GetServletContext, SetServletContext 클래스 파일을 준비합니다.

실습 파일 위치

 

2. SetServletContext 클래스를 다음과 같이 작성합니다. getServletContext() 메서드를 이용해 ServletContext 객체에 접근한 다음 ArrayList에 이름과 나이를 저장한 후 다시 ServletContext 객체에 setAttribute() 메서드를 이용해 바인딩합니다.

package sec05.ex01;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

@WebServlet("/cset")
public class SetServletContext extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		ServletContext context = getServletContext();
		List member = new ArrayList();
		member.add("이순신");
		member.add(30);
		context.setAttribute("member", member);
		out.print("<html><body>");
		out.print("이순신과 30 설정");
		out.print("</body></html>");
	}
}

 

3. GetServletContext 클래스를 다음과 같이 작성합니다. getServletContext() 메서드를 이용해 ServletContext 객체에 접근합니다. 그리고 getAttribute() 메서드를 이용해 다른 서블릿에서 ArrayList를 가져와 회원 정보를 출력합니다.

package sec05.ex01;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

@WebServlet("/cget")
public class GetServletContext extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		ServletContext context = getServletContext();
		List member = (ArrayList) context.getAttribute("member");
		String name = (String) member.get(0);
		int age = (Integer) member.get(1);
		out.print("<html><body>");
		out.print(name + "<br>");
		out.print(age + "<br>");
		out.print("</body></html>");
	}
}

 

4. 크롬 브라우저에서 http://localhost;8090/pro08/cset으로 요청하면 ServletContext 객체에 데이터를 바인딩합니다.

첫 번째 브라우저에서 /cset으로 요청

 

5. 이번에는 인터넷 익스플로러에서 http://localhost:8090/pro08/cget으로 요청합니다. 마찬가지로 바인딩된 데이터를 브라우저에 표시합니다.

IE에서 /cget으로 요청

 

이처럼 ServletContext에 바인딩된 데이터는 모든 서블릿들(사용자)이 접근할 수 있습니다. 따라서 웹 애플리케이션에서 모든 사용자가 공통으로 사용하는 데이터는 ServletContext에 바인딩해놓고 사용하면 편리합니다.