jsp

[jsp] 서블릿 Servlet

sian han 2022. 5. 7. 17:20

JSP는 사실상 서블릿이라 불리는 클래스로 변환되어 실행되는 자바언어의 일부

 

 

※ Servlet

  - 자바의 클래스 중 오직 서버에서만 해석되어 실행되어지는 클래스

  - 서블릿 규약에 따라 만든 클래스

  - 자바의 클래스 중 오직 서버에서만 실행될 수 있는 클래스를 의미함

 

 

 

 

▶ 서블릿 생성

  - 서블릿 API 이용

  - javax.servlet 패키지 이용 : 프로토콜에 독립적인 서블릿을 만들기 위한 클래스 제공

  - javax.servlet.http 패키지 이용: HTTP 프로토콜의 고유한 기능(GET, POST 등)을 제공하는 서블릿을 만드는 클래스를 제공

 

 

 

 

 

▶ 서블릿 구현

  - GenericServlet 이나 HTTPServlet 중 하나를 상속 받아서 서블릿 구현

  - main() 메서드를 갖지 않는대신 서블릿의 특정한 메서드(service() )는

     서버(=웹컨테이너=톰캣) 가 호출함

 

 

  ▷ GenericServlet

        - 요청을 처리하기 위해 자신의 service() 메서드를 오버라이드해야 함

                                                    ㄴ 두 개의 매개변수(request객체, response객체)를 받아들임

 

  HTTPServlet

        - Service() 메서드가 doGet(),doPost() 를 자동으로 호출함

 

 

 

▶ 웹컨테이너

  - ex ) 톰캣

 

 ▷ 서블릿을 관리

      - 서블릿에 대한 요청을 받고 응답을 해주는 중간 역할

      - 요청을 넘겨받은 컨테이너는 Http Request와 Http response객체를 만들어

        서블릿의 doPost(), doGet() 메서드 중 하나를 호출한다.

 

 

 ▷ 생명주기 관리

      - 초기화 메소드를 호출 – init()

      - 요청이 들어오면 적절한 서블릿 메소드를 호출 – service(), doGet(), doPost()

 

 

 ▷ 클라이언트의 요청에 대한 처리

 

1. 사용자가 서블릿에 대한 링크를 클릭

2. 웹 컨테이너는 들어온 요청이 서블릿이라는 것을 간파하고 HttpServletResponse와 HttpServletRequest객체를 생성

3. 사용자가 날린 URL을 분석하여 어떤 서블릿에 대한 요청인지 알아냄.(여기서 DD : web.xml를 참조)

그 다음 해당 서블릿 스레드를 생성하여 Request/Response객체를 인자로 넘김

4. 웹 컨테이너는 서블릿 service() 메소드를 호출. 요청에 지정한 방식(method)에 따라 doGet()을 호출할지, doPost()를 호출할지 결정

5. doGet()/doPost()메소드는 동적인 페이지를 생성한 다음, 이를 Response객체에 실어 보냄  보내고 난 후에도 웹 컨테이너는 Response객체에 대한 렌퍼런스값(참조값)을 가지고 있다.

6. 스레드 작업이 끝나면, 웹 컨테이너는 Response객체를 HTTP Response로 전환하여 클라이언트로 내려 보냄

마지막으로 Request와 Response객체를 소멸시킴

 

 

 

 

▶ 서블릿 라이프 사이클

 

class loded → Instantiation (인스턴스화) → init() → service() → destroy() → Finalizaion and Garbage Collection

 

1. 서블릿이 처음에 로드되면 init()메서드가 호출됨

2. init()메서드 에서는 서블릿이 서비스하기 위해 필요한 초기화 작업 을 수행하고,

init() 메서드가 service()메서드를 호출함

3. 초기화된 서블릿은 클라이언트의 요청이 있을 때마다 쓰레드가 생성 되어서 병행적으로 service() 메서드를 실행함

4. 서블릿은 더 이상 서비스를 하지 않을 경우에는 서블릿 엔진에 의 해 메모리에서 unload됨

5. unload 되기 전에 destroy()메서드가 실행됨