Servlet 生命週期、工做原理

  1. Servlet 生命週期:Servlet 加載--->實例化--->服務--->銷燬。html

  2. init():在Servlet的生命週期中,僅執行一次init()方法。它是在服務器裝入Servlet時執行的,負責初始化Servlet 對象。能夠配置服務器,以在啓動服務器或客戶機首次訪問Servlet時裝入Servlet。不管有多少客戶機訪問Servlet,都不會重複執行 init()。java

  3. service():它是Servlet的核心,負責響應客戶的請求。每當一個客戶請求一個HttpServlet對象,該對象的 Service()方法就要調用,並且傳遞給這個方法一個「請求」(ServletRequest)對象和一個「響應」 (ServletResponse)對象做爲參數。在HttpServlet中已存在Service()方法。默認的服務功能是調用與HTTP請求的方法 相應的do功能。web

  4. destroy(): 僅執行一次,在服務器端中止且卸載Servlet時執行該方法。當Servlet對象退出生命週期時,負責釋放佔用的資 源。一個Servlet在運行service()方法時可能會產生其餘的線程,所以須要確認在調用destroy()方法時,這些線程已經終止或完成。apache

Tomcat 與 Servlet 是如何工做的:tomcat

步驟:服務器

  1. Web Client 向Servlet容器(Tomcat)發出Http請求app

  2. Servlet容器接收Web Client的請求框架

  3. Servlet容器建立一個HttpRequest對象,將Web Client請求的信息封裝到這個對象中。this

  4. Servlet容器建立一個HttpResponse對象url

  5. Servlet容器調用HttpServlet對象的service方法,把HttpRequest對象與HttpResponse對象做爲參數傳給 HttpServlet 對象。

  6. HttpServlet調用HttpRequest對象的有關方法,獲取Http請求信息。

  7. HttpServlet調用HttpResponse對象的有關方法,生成響應數據。

  8. Servlet容器把HttpServlet的響應結果傳給Web Client。

 

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對象的時機:

  1. Servlet容器啓動時:讀取web.xml配置文件中的信息,構造指定的Servlet對象,建立ServletConfig對象,同時將ServletConfig對象做爲參數來調用Servlet對象的init方法。

  2. 在Servlet容器啓動後:客戶首次向Servlet發出請求,Servlet容器會判斷內存中是否存在指定的Servlet對象,若是沒有則 建立它,而後根據客戶的請求建立HttpRequest、HttpResponse對象,從而調用Servlet 對象的service方法。

  3. 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>

對於Servlet容器(Tomcat)與HttpServlet是怎樣進行交互的呢,看下類圖

Servlet的框架是由兩個Java包組成的:javax.servlet與 javax.servlet.http。在javax.servlet包中定義了全部的Servlet類都必須實現或者擴展的通用接口和類。在 javax.servlet.http包中定義了採用Http協議通訊的HttpServlet類。Servlet的框架的核心是 javax.servlet.Servlet接口,全部的Servlet都必須實現這個接口。

在Servlet接口中定義了5個方法,

其中3個方法表明了Servlet的生命週期:

一、init方法:負責初始化Servlet對象。

二、service方法:負責響應客戶的請求。

三、destroy方法:當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容器中以單例的形式存在。

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方法。

 

爲了驗證下,我新建了一個web app工程,新建一個Servlet,以下:

Java代碼  收藏代碼

  1. package com.tdt.servlet;  

  2.   

  3. import java.io.IOException;  

  4. import java.io.PrintWriter;  

  5. import javax.servlet.ServletException;  

  6. import javax.servlet.http.HttpServlet;  

  7. import javax.servlet.http.HttpServletRequest;  

  8. import javax.servlet.http.HttpServletResponse;  

  9.   

  10. public class TestServlet extends HttpServlet {  

  11.     public void doGet(HttpServletRequest request, HttpServletResponse response)  

  12.             throws ServletException, IOException {  

  13.         this.doPost(request, response);  

  14.     }  

  15.     public void doPost(HttpServletRequest request, HttpServletResponse response)  

  16.             throws ServletException, IOException {  

  17.   

  18.         response.setContentType("text/html");  

  19.         PrintWriter out = response.getWriter();  

  20.         out.println("Hello,this is a test");  

  21.       

  22.         out.flush();  

  23.         out.close();  

  24.     }  

  25.   

  26.     public void destroy() {  

  27.         System.err.println(getServletName()+"生命週期結束");;  

  28.     }  

  29.       

  30.     public void init() throws ServletException {  

  31.         System.out.println(getServletName()+"執行初始化");  

  32.     }  

  33. }  

 當servlet被銷燬時會在控制檯上打印提示語句,不過我發如今tomcat中,只要不中止web容器,servlet是不會被銷燬的。

相關文章
相關標籤/搜索