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 技術詳解>