1. 서틀 컨테이너로 시작하겠습니다. 모두가 가장 친숙한 서블릿 컨테이너는 Tomcat입니다. 서블릿 컨테이너는 서블릿을 어떻게 관리합니까?
Tomcat의 컨테이너 모델을 먼저 살펴 보겠습니다.
위의 그림에서 Tomcat의 컨테이너가 4 단계로 나뉘어 있음을 알 수 있습니다. 서블릿을 진정으로 관리하는 컨테이너는 컨텍스트 컨테이너이며 컨텍스트는 웹 프로젝트에 해당합니다.
Tomcat의 컨테이너 레벨에서 컨텍스트 컨테이너는 컨테이너의 서블릿의 래퍼 클래스 래퍼 (StandardWrapper)를 직접 관리하는 컨테이너이므로 컨텍스트 컨테이너가 실행되는 방법은 서블릿의 작동 방식에 직접적인 영향을 미칩니다.
여기서는 서블릿의 포장 클래스 : StandardWrapper를 설명하겠습니다. 여기에는 서블릿이 서블릿 객체가 아닌 표준 서플러에 직접 래글을 감아 야하는 이유가 있습니다. StandardWrapper는 Tomcat 컨테이너의 일부이기 때문에 컨테이너의 특성을 가지고 있으며 서블릿은 독립적 인 웹 개발 표준이며 Tomcat에서 강하게 결합해서는 안됩니다.
서블릿을 표준 서플러로 감싸고 컨텍스트에 하위 함유 자로 추가하는 것을 제외하고 다른 모든 web.xml 속성은 컨텍스트에 구문 분석되므로 컨텍스트 컨테이너는 실제로 서블릿을 실행하는 서블릿 컨테이너입니다. 웹 응용 프로그램은 컨텍스트 컨테이너에 해당합니다. 컨테이너의 구성 속성은 응용 프로그램의 web.xml에 의해 지정되므로 Web.xml의 역할을 이해할 수 있습니다.
2. 다음은 서블릿의 작업 프로젝트를 간략하게 설명합니다.
웹 서버가 클라이언트와 상호 작용하면 서블릿의 작업 프로세스는 다음과 같습니다.
1. 클라이언트의 웹 서버에 요청하십시오.
2. 웹 서버는 요청을받은 후 서블릿으로 보냅니다.
3. 서블릿 컨테이너는 이에 대한 인스턴스 객체를 생성하고 Servlet API의 해당 메소드를 호출하여 클라이언트 HTTP 요청을 처리 한 다음 처리 된 응답 결과를 웹 서버에 반환합니다.
4. 웹 서버는 서블릿 인스턴스 객체에서 수신 된 응답 구조를 클라이언트로 다시 보냅니다.
3. 서블릿의 수명주기 :
위의 그림에서 볼 수 있듯이, 서블릿의 수명주기는 4 단계, 즉 로딩 클래스 및 생성 단계, 초기화 단계, 서비스 단계 및 인스턴스 파괴 단계로 나눌 수 있습니다. 다음은 각 단계의 프로그래밍 작업 및 예방 조치에 대한 자세한 설명입니다.
1. 서블릿 인스턴스 생성 :
기본적으로 서블릿 인스턴스는 첫 번째 요청이 도착하면 나중에 재사용 될 때 생성됩니다. 일부 서블릿에 파일 열기, 네트워크 연결 초기화 등과 같은 초기화를로드 할 때 완료 해야하는 복잡한 작업이 필요한 경우, 시작시 서플렛 인스턴스를 작성하도록 서버에 알릴 수 있습니다. 특정 구성은 다음과 같습니다.
<Servlet> <Servlet-name> TimesErvlet </servlet-name> <Servlet-class> com.allanlxf.servlet.basic.timeservlet </servlet-class> <load-on-startup> 1 </load-on-startup> </servlet>
서블릿 객체의 관련 클래스 구조를 만듭니다.
2. 초기화
Servlet 인스턴스가 작성되면 웹 서버는 Servlet (ServletConfig Config) 메소드를 자동으로 호출하여 서블릿을 초기화합니다. 메소드 파라미터 구성에는 서버에서 생성 한 초기화 매개 변수와 같은 서블릿의 구성 정보가 포함되어 있습니다.
I. 서블릿의 초기화 매개 변수를 구성하는 방법은 무엇입니까?
예를 들어 web.xml의 서블릿의 정의 태그에서 다음과 같습니다.
<Servlet> <Servlet-name> timeservlet </servlet-name> <servlet-class> com.allanlxf.servlet.basic.timeservlet </servlet-class> <Init-Param> <par am-name> user </param-name> <param-value> username </param-value> </init-param> <init-param> <param-name> blog </param-name> <param- value> http : //. . . </param-value> </init-param> </servlet>
두 개의 초기화 매개 변수 사용자와 블로그는 사용자 이름과 http : //의 값으로 구성됩니다. . . 이러한 방식으로 향후 사용자 이름과 블로그 주소를 수정하려면 서블릿 코드를 수정할 필요가 없으며 구성 파일 만 수정하십시오.
II. 서블릿의 초기화 매개 변수를 읽는 방법은 무엇입니까?
ServletConfig 초기화 매개 변수의 정보를 읽는 다음 방법을 정의합니다.
공개 문자열 getInitParameter (문자열 이름)
매개 변수 : 초기화 매개 변수의 이름입니다.
반환 : 구성되지 않은 경우 초기화 매개 변수의 값은 NULL을 반환합니다.
iii.init (servletconfig) 메소드의 실행 시간 수
이 방법은 서블릿의 수명주기 동안 한 번 실행됩니다.
iv.init (servletconfig) 메소드 및 스레드
이 방법은 단일 스레드 환경에서 실행되므로 개발자는 스레드 안전 문제를 고려할 필요가 없습니다.
v.init (servletconfig) 메소드 및 예외
실행 중에이 메소드는 ServleTexception을 던질 수 있으며 Servlet 인스턴스가 초기화되지 않았 음을 웹 서버에 알릴 수 있습니다. ServleTeXception이 발생하면 웹 서버는 처리를 위해 클라이언트 요청을 Servlet 인스턴스로 넘겨주지 않지만 초기화 실패 예외 정보를 클라이언트에보고하여 메모리에서 파괴됩니다. 새 요청이 이루어지면 웹 서버는 새 서블릿 인스턴스를 생성하고 새 인스턴스의 초기화 작업을 수행합니다.
3. 서비스
서블릿 인스턴스가 성공적으로 생성되고 초기화되면 서버 인스턴스를 서버에서 사용하여 클라이언트의 요청을 제공하고 응답을 생성 할 수 있습니다. 서비스 단계에서 웹 서버는 인스턴스의 서비스 (Servletrequest 요청, ServletRepponse 응답) 메소드를 호출합니다. 요청 객체와 응답 객체는 서버에 의해 생성되어 서블릿 인스턴스로 전달됩니다. 요청 객체는 클라이언트가 서버에 보낸 정보를 캡슐화하고 응답 객체는 서버가 보낸 정보를 클라이언트에게 캡슐화합니다.
I. 서비스 () 방법의 책임
Service () 메소드는 서블릿의 핵심 방법입니다. 이 방법 내에서 클라이언트의 비즈니스 로직을 실행해야합니다. 일반적인 서비스 방법의 개발 프로세스는 다음과 같습니다.
클라이언트 요청-> 클라이언트에 대한 비즈니스 로직-> 출력 응답 페이지를 분석하십시오
ii.service () 메소드 및 스레드
효율성을 향상시키기 위해서는 서블릿 사양에 따라 서블릿 인스턴스가 동시에 여러 클라이언트 요청을 제공 할 수 있어야합니다. 즉, Service () 메소드는 다중 스레드 환경에서 실행되며 서블릿 개발자는 메소드의 스레드 안전을 보장해야합니다.
iii.service () 메소드 및 예외
Service () 메소드는 실행 중에 servletexception 및 ioexception을 던질 수 있습니다. 그중에서도 요청 된 리소스를 사용할 수없고 데이터베이스를 사용할 수없는 클라이언트 요청을 처리하는 과정에서 ServleTexception을 던질 수 있습니다. 예외가 발생하면 컨테이너는 요청 객체를 재활용하고 클라이언트의 예외 정보를보고해야합니다. IOException은 입력 및 출력 오류를 나타냅니다. 프로그래머는 예외를 신경 쓰지 않아도 컨테이너로 클라이언트에게 직접보고합니다.
프로그래밍 예방 조치 :
1) 서버 스레드 스레드가 Servlet 인스턴스의 init () 메소드를 실행하면 모든 클라이언트 서비스 스레드가 인스턴스의 Service () 메소드를 실행할 수 없으며 인스턴스의 Destrove () 메소드를 실행할 수 없습니다. 따라서 서블릿의 init () 메소드는 단일 스레드 환경에서 작동하며 개발자는 스레드 안전 문제를 고려할 필요가 없습니다.
2) 서버가 클라이언트로부터 여러 요청을 수신하면 서버는 각 클라이언트에 서비스를 제공하기 위해 별도의 클라이언트 서비스 스레드에서 서블릿 인스턴스의 서비스 () 메소드를 실행합니다. 현재 여러 스레드가 동일한 서블릿 인스턴스의 Service () 메소드를 동시에 실행하므로 스레드 안전 문제를 고려해야합니다.
3) Service () 메소드는 다중 스레드 환경에서 실행되지만 메소드를 동기화 할 필요는 없습니다. 대신, 실행 중이 방법에 의해 액세스되는 리소스 유형과 리소스에 액세스하는 방법에 따라 다릅니다. 분석은 다음과 같습니다.
나. Service () 메소드가 Servlet 멤버 변수 또는 정적 변수, 파일, 데이터베이스 연결 등과 같은 글로벌 리소스에 액세스하지 않으면 전 세계 리소스를 가리키지 않는 임시 변수, 요청 및 응답 개체와 같은 현재 스레드의 자체 리소스 만 사용합니다. 이 방법 자체는 스레드 안전이며 동기화 제어가 필요하지 않습니다.
II. Service () 메소드가 서블릿 멤버 변수에 액세스하지만 변수의 작업이 읽기 전용 작업 인 경우 메소드 자체는 스레드 안전이며 동기화 제어가 필요하지 않습니다.
III. Service () 메소드가 서블릿 멤버 변수에 액세스하고 변수의 작동이 읽고 서면으로 작성되면 일반적으로 동기화 제어 문이 필요합니다.
IV. Service () 메소드가 글로벌 정적 변수에 액세스하는 경우, 시스템에 정적 변수에 동시에 액세스하는 다른 스레드가있을 수있는 경우 읽기 및 쓰기 작업이 모두 있으면 동기화 제어 문이 일반적으로 필요합니다.
v. Service () 메소드가 파일, 데이터베이스 연결 등과 같은 글로벌 리소스에 액세스하면 일반적으로 동기화 제어 문을 추가해야합니다.
4. 파괴
웹 서버에서 응용 프로그램 재 장전 또는 서버 종료와 같은 서블릿 인스턴스가 필요하지 않다고 생각하면 서블릿이 오랫동안 액세스되지 않았습니다. 서버는 메모리에서 인스턴스를 파괴 (제거) 할 수 있습니다. 웹 서버는 서블릿이 요청한 리소스를 재활용하거나 다른 중요한 처리를 수행하기 위해 서블릿 인스턴스를 제거하기 전에 서블릿 인스턴스의 Destrove () 메소드가 호출되도록해야합니다.
웹 서버는 Destroy () 메소드를 호출하기 전에 인스턴스 종료의 서비스 () 메소드에서 실행되는 모든 스레드가 일정 시간 동안이 스레드를 기다리도록해야합니다. Destrove () 메소드가 실행되면 웹 서버는 서블릿 인스턴스에 대한 모든 새로운 요청을 거부합니다. Destroy () 메소드가 종료되고 서블릿 인스턴스는 쓰레기를 수집 할 수 있습니다.
4. 서틀 구문 분석 클라이언트 HTTP 요청의 흐름도 :
1. 웹 클라이언트는 서블릿 컨테이너에 HTTP 요청을 발행합니다.
2. 서블릿 컨테이너는 웹 HTTP 요청을 구문 분석합니다.
3. 서블릿 컨테이너는 HTTPrequest 객체를 생성 하여이 개체에서 HTTP 요청 정보를 캡슐화합니다.
4. 서블릿 컨테이너는 httpresponse 객체를 만듭니다.
5. 서블릿 컨테이너 (액세스 된 서블릿이 서버 시작에서 생성되지 않은 경우 먼저 서블릿 인스턴스를 작성하고 init () 메소드를 호출하여 객체를 초기화) httpservlet의 service () 메소드를 호출하고 httprequest 및 httpresponse 객체의 매개 변수를 httpservlet 객체로 전달하십시오.
6. httpservlet는 HTTP 요청 정보를 얻기 위해 관련된 httprequest의 관련 방법을 호출합니다.
7. httpservlet는 반응 데이터를 생성하기 위해 HttPresponse의 관련 방법을 호출합니다.
8. 서블릿 컨테이너는 웹 클라이언트에 Httpservlet 응답 결과를 전달합니다.
위의 기사는 Servlet의 실행 원칙 및 수명주기 (포괄적 인 분석)를 기반으로합니다. 나는 그것이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.