서블릿은 컨테이너에 의해 동작하므로 객체의 생성 및 종료 과정도 컨테이너 안에서 이루어진다. 이와 같이 객체의 생성에서 종료에 이르는 과정을 생명 주기라고 하며, 개발자는 필요에 따라 해당 생명 주기 안에서 적절한 기능을 구현할 수 있어야 한다.
서블릿 클래스는 기본적으로 doGet(), doPost()와 같이 HTTP 요청 메서드에 따라 필요한 메서드를 오버라이딩해 구현하며, 서블릿 컨테이너에 의해 객체의 생성과 소멸 등이 관리되므로 필요에 따라 특정 생명 주기 이벤트에 동작하는 메서드를 구현하기도 한다.
클라이언트의 요청이 들어오면 컨테이너는 해당 서블릿이 메모리에 있는지 확인한다. 해당 서블릿이 메모리에 없다면 서블릿을 메모리에 적재해야 하는데 이 때 서블릿의 init() 메서드가 호출되며 각종 초기화 작업을 수행한다.
즉 init() 메서드는 처음 한번만 실행되므로 해당 서블릿에 각각의 스레드에서 공통적으로 사용하기 위해 필요한 작업이 있다면 init() 메서드를 오버라이딩해서 구현한다.
만일 실행 중 서블릿이 변경되는 경우에는 기존 서블릿은 종료되고 다시 시작되면서 init() 메서드가 호출된다.
init() 메서드는 최초 한번만 수행되고 이 후 요청은 스레드로 실행되며 service() 메서드를 통해 각각 doGet()이나 doPost()로 분기된다. 이때 파라메터로 HttpServletRequest와 HttpServletResponse 클래스 타입인 request와 response 객체가 제공되는데, 사용자 요청처리는 request로, 응답 처리는 response 객체로 처리한다.
컨테이너로부터 서블릿 종료 요청이 있을 때 destory() 메서드를 호출한다. init() 메서드와 마찬가지로 한번만 실행되며 서블릿이 종료되면서 정리해야할 작업이 있을 때는 destroy() 메서드를 오버라이딩해서 구현하면 된다.