Servlet API

개발자 | 2007. 12. 18. 20:47
 
서블릿은 CGI 프로그래밍에 대한 자바측 기술로,
javax.servlet 과 javax.servlet.http 두개의 팩키지로 구성되어 있다.
javax.servlet
모든 서블릿이 상속하거나 구현하는 일반적인 인터페이스와 클래스로 구성.
javax.servlet.http
HTTP 프로토콜에 맞춘 서블릿 클래스로 구성.
javax.servlet.Servlet
인터페이스는 서블릿 아키텍처의 핵심이며 모든 서블릿의 기초.
 
Servlet 인터페이스에는 5개의 메소드가 있는데 그 중 가장 중요한 3개의 메소드는 다음과 같습니다.
  • init() : 서블릿을 초기화
  • service() : 클라이언트 요청에 대한 서비스
  • destory() : 자원반납

이들  메소드는 서블릿 라이프사이클(생명주기) 메소드이다. 모든 서블릿은 상속을 통해서든 아니면 직접적인 구현을 통해서든 반드시 Servlet 인터페이스를 구현해야  한다.


서블릿의 기본 골격인 인터페이스와 클래스

사용자 삽입 이미지

(1) Setvlet 인터페이스
모든 서블릿은 Servlet 인터페이스를 구현해야 한다. Servlet 인터페이스는 서블릿의 라이프사이클 메소드를 선언하고 있다. 라이프사이클 메소드는 init(), service(), destory() 이다.
 
------------------------------------------------------------------------------------
init()
init() 메소드는 서블릿이 그 일생을 시작하게 하는 메소드.
이 메소드는 서블릿이 인스턴스가 된 후 바로 호출되고, 단 한번만 호출.
init() 메소드는 request 를 다룰 때 사용하는 자원을 만들고 이 자원을 초기화할때 사용.
 
Servlet.init()
public void init(ServletConfig config) throws ServletException;
init() 메소드는 파라미터로 ServletConfig 객체를 전달받음.
init() 메소드는 또한 ServletException 을 던질 수 있도록 선언되어 있음.
만약 서블릿이 request 를 핸들링할 수 있는 자원을 초기화할 수 없게 되었을 때 init() 메소드는 ServletException 을 해당 에러 메시지와 함께 전달.
------------------------------------------------------------------------------------
service()
service()메소드는 request/response 패턴을 사용하는 클라이언트로부터 받은 모든 request 에 대해 서비스.
 
Servlet.service()
public void service( ServletRequest req, ServletResponse res) throws ServletException, IOException;
service() 메소드는 ServletRequest 와 ServletResponse 2개의 파라미터를 가짐.

ServletRequest 는 클라이언트가 제공한 정보.
ServletResponse 는 클라이언트에 보내는 정보.

service() 메소드를 가장 일반적인 구현은 HttpServlet 클래스에서.
HttpServlet 클래스는 GenericSevlet 를 상속하므로서 Servlet을 구현.
------------------------------------------------------------------------------------
destory()
서블릿 라이프의 끝을 의미.
웹 애플리케이션이 shutdown 될때, 서블릿의 destory() 메소드가 호출.
그러면 init() 메소드에 의해 만들어진 모든 자원이 반납.
 
Servlet.destory()
public void destroy();
------------------------------------------------------------------------------------
 
 
(2) GenericServlet 과 HttpServlet 클래스
GenericServlet는 Servlet를 구현한 클래스.
HttpServlet 클래스는 GenericServlet 클래스를 상속.
HttpServlet 과 GenericServlet는 서블릿을 개발할 때 이들 중 하나를 사용.
GenericServlet 클래스를 상속하면 service()메소드를 구현해야 함.
GenericServlet.service() 메소드는 상속하는 클래스가 구현해야 함.
 
GenericServlet.service()
public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
service()는 추상 메소드이므로 프로그래머가 반드시 구현해야 함.
service()메소드로 전달되는 2개의 파라미터는 ServletRequest 와 ServletResponse 객체.
ServletRequest 는 서블릿으로 전달되어진 모든 정보.
ServletResponse 는 클라이언트에게 보내고자 하는 데이터.
HttpServlet 클래스를 상속했을때는, service()메소드를 일반적으로 구현할 필요가 없음.
HTTPServlet 클래스는 이미 service()메소드를 구현하고 있기 때문.
 
HttpServlet.service()
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException,IOException;
위의 메소드는 GenericServlet 의 service() 추상 메소드를 구현한 메소드가 아님.
구현한 메소드는 public void service() 메소드이고 이 메소드는 protected void service() 메소드.
그런데 실질적인 서비스는 protected void service() 메소드.
왜냐하면 HttpServlet 의 public service는 단지 protected service 메소드에게 제어권을 넘기는 역할.
(※Serlvets API 문서를 참고하세요)
 
Dispatches client requests to the protected service method. There's no need to override this method.
 
protected void service() 메소드가 호출되면 이 메소드는 request 안에서 HTTP METHOD 타입값(POST, GET)을 읽어내고 이 값에 따라서 doGet(), doPost()를 호출.
이 doGet(), doPost() 가 우리가 오버라이딩 해야 하는 메소드.
메소드 타입이 GET 이면 우리가 오버라이딩 할 메소드는 doGet(), POST 이면 doPost() .

HttpServlet 클래스에 전달되는 파라미터, HttpServletRequest 와 HttpServletResponse 는 GenericServlet 클래스에 전달되는 파라미터였던 ServletRequest, ServletResponse 각각을 상속한 인터페이스.

그럼 HttpServletRequest 와 HttpServletResponse 를 구현한 클래스는 어디에?
 
The servlet container creates an HttpServletRequest object and passes it as an argument to the servlet's service methods (doGet, doPost, etc).
 
위 글은 HttpServletRequest 를 Servlet API 에서 찾을 때 보이는 문구로, HttpServletRequest 를 구현한 클래스는 컨테이너를 만드는 벤더 몫이다.


출처 : http://blog.naver.com/ldev?Redirect=Log&logNo=150020437993

'개발자' 카테고리의 다른 글

ASP 에서 OCX 실행  (0) 2008.04.30
웹페이지(HTML)에서 직접 실행파일(exe) 실행시키기  (0) 2008.04.30
.NET 생명주기  (0) 2008.04.30
JSP 교육실습 10일차  (0) 2007.12.21
Servlet 설정 --> 중요!!!  (0) 2007.12.17
,