1. 程式人生 > >Tomcat如何與Servlet物件進行互動

Tomcat如何與Servlet物件進行互動

此文出自http://blog.csdn.net/guoshaohong/article/details/3352559

Tomcat 是Web應用伺服器,是一個Servlet/JSP容器. Tomcat 作為Servlet容器,負責處理客戶請求,把請求傳送給Servlet,並將Servlet的響應傳送回給客戶.而Servlet是一種執行在支援Java語言的伺服器上的元件. Servlet最常見的用途是擴充套件Java Web伺服器功能,提供非常安全的,可移植的,易於使用的CGI替代品.下面我們描述一下Tomcat與Servlet是如何工作的,首先看下面的時序圖.

1、1、Web客戶向Servlet容器(Tomcat)發出Http請求

2、Servlet容器分析客戶的請求資訊

3、Servlet容器建立一個HttpRequest物件,將客戶請求的資訊封裝到這個物件中

4、Servlet容器建立一個HttpResponse物件

5、Servlet容器呼叫HttpServlet物件的service方法,把HttpRequest物件與HttpResponse物件作為引數

     傳給 HttpServlet物件

6、HttpServlet呼叫HttpRequest物件的有關方法,獲取Http請求資訊

7、HttpServlet呼叫HttpResponse物件的有關方法,生成響應資料

8、Servlet容器把HttpServlet的響應結果傳給Web客戶

看到以上這個過程,那麼我們會問Servlet容器與HttpServlet又是基於什麼樣的約定進行互動的?

HttpServlet物件的生命週期如何?

首先我們來了解一下Servlet物件的API

Servlet的框架是由兩個Java包組成的:javax.servlet與javax.servlet.http。在javax.servlet包中定義了所有

的Servlet類都必須實現或者擴充套件的通用介面和類。在javax.servlet.http包中定義了採用Http協議通訊的

HttpServlet類。Servlet的框架的核心是javax.servlet.Servlet介面,所有的Servlet都必須實現這個介面。

在Servlet介面中定義了5個方法,

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

1、init方法:負責初始化Servlet物件。

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

3、destroy方法:當Servlet物件退出生命週期時,負責釋放佔用的資源。

      下面我們來看下面的類圖。

javax.servlet.Servlet介面中有一些do方法,它們對應的是http的請求方式。下面我們就結合類圖來

描述一下HttpServlet物件的生命週期

一、建立Servlet物件的時機

1、Servlet容器啟動時:讀取web.xml配置檔案中的資訊,構造指定的Servlet物件,建立ServletConfig物件,

      同時將ServletConfig物件作為引數來呼叫Servlet物件的init方法。

2、在Servlet容器啟動後:客戶首次向Servlet發出請求,Servlet容器會判斷記憶體中是否存在指定的Servlet對

      象,如果沒有則建立它,然後根據客戶的請求建立HttpRequest、HttpResponse物件,從而呼叫Servlet

     物件的service方法。

3、Servlet的類檔案被更新後,重新建立Servlet

      Servlet容器在啟動時自動建立Servlet,這是由在web.xml檔案中為Servlet設定的<load-on-startup>屬性決定

      的。從中我們也能看到同一個型別的Servlet物件在Servlet容器中以單例的形式存在。

二、銷燬Servlet物件的時機

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

以上內容只是對Tomcat與Servlet物件之間互動的原理進行一個總的概括,這是我們在學習Java Web應用技術中

需要清晰認識的一些內容,如有不當之處請指出,我會虛心接受。這些內容參考自孫衛琴編寫的

<Tomcat與Java Web 技術詳解>