大體分爲4部:Servlet類加載-->實例化-->服務-->銷燬html
一、Web Client向Servlet容器(Tomcat)發出Http請求。java
二、Servlet容器接收Client端的請求。程序員
三、Servlet容器建立一個HttpRequest對象,將Client的請求信息封裝到這個對象中。web
四、Servlet建立一個HttpResponse對象。apache
五、Servlet調用HttpServlet對象的service方法,把HttpRequest對象和HttpResponse對象做爲參數傳遞給HttpServlet對象中。服務器
六、HttpServlet調用HttpRequest對象的方法,獲取Http請求,並進行相應處理。多線程
七、處理完成HttpServlet調用HttpResponse對象的方法,返回響應數據。app
八、Servlet容器把HttpServlet的響應結果傳回客戶端。框架
其中的3個方法說明了Servlet的生命週期:post
一、init():負責初始化Servlet對象。
二、service():負責響應客戶端請求。
三、destroy():當Servlet對象退出時,負責釋放佔用資源。
大多數程序員都知道Servlet的生命週期,簡單的歸納這就分爲四步:servlet類加載--->實例化--->服務--->銷燬。對這個過程只是膚淺瞭解下,對於servlet什麼時候被銷燬,仍是不太情楚。下面咱們描述一下Tomcat與Servlet是如何工做的,首先看下面的時序圖.
一、首先簡單解釋一下Servlet接收和響應客戶請求的過程,首先客戶發送一個請求,Servlet是調用service()方法對請求進行響應的,經過源代碼可見,service()方法中對請求的方式進行了匹配,選擇調用doGet,doPost等這些方法,而後再進入對應的方法中調用邏輯層的方法,實現對客戶的響應。在Servlet接口和GenericServlet中是沒有doGet()、doPost()等等這些方法的,HttpServlet中定義了這些方法,可是都是返回error信息,因此,咱們每次定義一個Servlet的時候,都必須實現doGet或doPost等這些方法。
二、每個自定義的Servlet都必須實現Servlet的接口,Servlet接口中定義了五個方法,其中比較重要的三個方法涉及到Servlet的生命週期,分別是上文提到的init(),service(),destroy()方法。GenericServlet是一個通用的,不特定於任何協議的Servlet,它實現了Servlet接口。而HttpServlet繼承於GenericServlet,所以HttpServlet也實現了Servlet接口。因此咱們定義Servlet的時候只須要繼承HttpServlet便可。
三、Servlet接口和GenericServlet是不特定於任何協議的,而HttpServlet是特定於HTTP協議的類,因此HttpServlet中實現了service()方法,並將請求ServletRequest、ServletResponse 強轉爲HttpRequest 和 HttpResponse。
對於Servlet容器(Tomcat)與HttpServlet是怎樣進行交互的呢,看下類圖
Servlet的框架是由兩個Java包組成的:javax.servlet與javax.servlet.http。在javax.servlet包中定義了全部的Servlet類都必須實現或者擴展的通用接口和類。在javax.servlet.http包中定義了採用Http協議通訊的HttpServlet類。Servlet的框架的核心是javax.servlet.Servlet接口,全部的Servlet都必須實現這個接口。
1、建立Servlet對象的時機
一、Servlet容器啓動時:讀取web.xml配置文件中的信息,構造指定的Servlet對象,建立ServletConfig對象,同時將ServletConfig對象做爲參數來調用Servlet對象的init方法。
二、在Servlet容器啓動後:客戶首次向Servlet發出請求,Servlet容器會判斷內存中是否存在指定的Servlet對象,若是沒有則建立它,而後根據客戶的請求建立HttpRequest、 HttpResponse對象,從而調用Servlet
對象的service方法。
三、Servlet的類文件被更新後,從新建立Servlet
Servlet容器在啓動時自動建立Servlet,這是由在web.xml文件中爲Servlet設置的<load-on-startup>屬性決定
的。從中咱們也能看到同一個類型的Servlet對象在Servlet容器中以單例的形式存在。
<servlet> <servlet-name>Init</servlet-name> <servlet-class>org.xl.servlet.InitServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
2、銷燬Servlet對象的時機
一、Servlet容器中止或者從新啓動:Servlet容器調用Servlet對象的destroy方法來釋放資源。以上所講的就是Servlet對象的生命週期。那麼Servlet容器如何知道建立哪個Servlet對象?
Servlet對象如何配置?實際上這些信息是經過讀取web.xml配置文件來實現的。
咱們來看一下web.xml文件中的Servlet對象的配置節信息
<servlet> <servlet-name>action<servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>2</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>2</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
下面對上面的配置節信息進行解析
servlet-name:Servlet對象的名稱
servlet-class:建立Servlet對象所要調用的類
param-name:參數名稱
param-value:參數值
load-on-startup:Servlet容器啓動時加載Servlet對象的順序
servlet-mapping/servlet-name:要與servlet中的servlet-name配置節內容對應
url-pattern:客戶訪問的Servlet的相對URL路徑
當Servlet容器啓動的時候讀取<servlet>配置節信息,根據<servlet-class>配置節信息建立Servlet對象,同時根據<init-param>配置節信息建立HttpServletConfig對象,而後執行Servlet對象的init方法,而且根據<load-on-startup>配置節信息來決定建立Servlet對象的順序,若是此配置節信息爲負數或者沒有配置,那麼在Servlet容器啓動時,將不加載此Servlet對象。當客戶訪問Servlet容器時,Servlet容器根據客戶訪問的URL地址,經過<servlet-mapping>配置節中的<url-pattern>配置節信息找到指定的Servlet對象,並調用此Servlet對象的service方法。
參考:Servlet生命週期