먼저 웹 서버는 원래 클라이언트 요청에 대해 정적인 페이지로만 응답할 수 있다.
but 웹 서버에 프로그램을 붙여 동적인 페이지 생성이 가능하다.
서블릿도 이 프로그램 중 하나이다.
보통 웹 서버와 Servlet 사이에 Servlet Containner 를 두어 클라이언트 요청에 대한 스레드 풀을 관리한다.
Servlet Container는 웹 서버의 요청이 있을 때마다 스레드를 생성, 요청에 맞는 Servlet 메서드를 호출하여 웹 서버로 다시 전달하는 역할을 한다.
대표적으로 WAS로 알려진 Apache Tomcat이 있지만 , WAS는 (Web Server + Servlet Container) 두개가 합쳐진 더 넓은 개념이다.
사용자 요청이 들어오면 서블릿 컨테이너가 사용자 요청과 매핑된 서블릿을 찾음
(설정 파일의 servlet 태그에 정의되어 있음)
서블릿 인스턴스를 찾았는데 없으면 생성해서 사용
서블릿 컨테이너에 스레드 생성
*미리 만든 reqeust,respons를 인자로 해당 서블릿의 서비스()메서드를 실행
인퍼페이스 기능
--> 서블릿 컨테이너는 웹 서버로부터 들어온 클라리언트의 요청을 넘겨 받아 , httpServletReqeust 인터페이스의 객체를 생성 , 이 객체에 클라이언트의 요청사항들을 담아 서블릿 서비스 메서드에 전달 , 클라이언트의 요청에 관한 많은 정보를 내장시키고 있다.
인터페이스의 내장 메서드
httpServletRequest 인터페이스는 내부적으로 ServletRequest 인터페이스를 상속 받는다.
따라서 내장 메서드들은 ServletRequest or httpServletRequest 인터페이스의 멤버이다.
public class MyServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException { // 생성될 때 호출
super.init();
}
public void destroy() { // 소멸 될 떄 호출
super.destroy();
protected void service(HttpServletRequest request, HttpServletResponse response) {
super.service(request,response);
}
}
service 로직 수행
public abstract class HttpServlet extends GenericServlet {
protected void service(HttpServletRequest req, HttpServletResponse resp) trhows IOException{
String method = req.getMethod();
if(method.equals("GET")) {
doGet(req, resp);
} else if (emthod.equals("HEAD")) {
doHead(req,resp);
} else if (method.equals("POST")) {
doPost(req,resp);
} else if (method.equals("PUT")) {
doPut(req, resp);
} else if (method.equals("DELETE")) {
doDelete(req,resp) ;
} else if (method.equals("OPTIONS")) {
doOptions(req,resp);
} else if (method.equals("TRACE")) {
doTrace(req,resp);
} else {
String errMsg ="http.method_not_implemented";
resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED , errMsg);
}
}