Servlet運行週期與運行原理

一、Servlet運行週期

      Servlet運行在Servlet容器中,其生命週期由容器來管理。Servlet的生命週期通過javax.servlet.Servlet接口中的init()、service()和destroy()方法來表示。

      Servlet的生命週期包含了下面4個階段:

   (1)加載和實例化

Servlet容器負責加載和實例化Servlet。當Servlet容器啓動時,或者在容器檢測到需要這個Servlet來響應第一個請求時,創 建Servlet實例。當Servlet容器啓動後,它必須要知道所需的Servlet類在什麼位置,Servlet容器可以從本地文件系統、遠程文件系 統或者其他的網絡服務中通過類加載器加載Servlet類,成功加載後,容器創建Servlet的實例。因爲容器是通過Java的反射API來創建 Servlet實例,調用的是Servlet的默認構造方法(即不帶參數的構造方法),所以我們在編寫Servlet類的時候,不應該提供帶參數的構造方法。

    (2)初始化

在Servlet實例化之後,容器將調用Servlet的init()方法初始化這個對象。初始化的目的是爲了讓Servlet對象在處理客戶端請求前完成一些初始化的工作,如建立數據庫的連接,獲取配置信息等。對於每一個Servlet實例,init()方法只被調用一次。在初始化期間,Servlet實例可以使用容器爲它準備的ServletConfig對象從Web應用程序的配置信息(在web.xml中配置)中獲取初始化的參數信息。在初始化期間,如果發生錯誤,Servlet實例可以拋出ServletException異常或者UnavailableException異常來通知容器。ServletException異常用於指明一般的初始化失敗,例如沒有找到初始化參數;而UnavailableException異常 用於通知容器該Servlet實例不可用。例如,數據庫服務器沒有啓動,數據庫連接無法建立,Servlet就可以拋出 UnavailableException異常向容器指出它暫時或永久不可用。

    (3)請求處理

Servlet容器調用Servlet的service()方法對請求進行處理。要注意的是,在service()方法調用之前,init()方法 必須成功執行。在service()方法中,Servlet實例通過ServletRequest對象得到客戶端的相關信息和請求信息,在對請求進行處理後,調用ServletResponse對象的方法設置響應信息。在service()方法執行期間,如果發生錯誤,Servlet實例可以拋出 ServletException異常或者UnavailableException異常。如果UnavailableException異常指示了該實 例永久不可用,Servlet容器將調用實例的destroy()方法,釋放該實例。此後對該實例的任何請求,都將收到容器發送的HTTP 404(請求的資源不可用)響應。如果UnavailableException異常指示了該實例暫時不可用,那麼在暫時不可用的時間段內,對該實例的任 何請求,都將收到容器發送的HTTP 503(服務器暫時忙,不能處理請求)響應。

   (4)服務終止

當容器檢測到一個Servlet實例應該從服務中被移除的時候,容器就會調用實例的destroy()方法,以便讓該實例可以釋放它所使用的資源, 保存數據到持久存儲設備中。當需要釋放內存或者容器關閉時,容器就會調用Servlet實例的destroy()方法。在destroy()方法調用之 後,容器會釋放這個Servlet實例,該實例隨後會被Java的垃圾收集器所回收。如果再次需要這個Servlet處理請求,Servlet容器會創建 一個新的Servlet實例。

在整個Servlet的生命週期過程中,創建Servlet實例、調用實例的init()和destroy()方法都只進行一次,當初始化完成 後,Servlet容器會將該實例保存在內存中,通過調用它的service()方法,爲接收到的請求服務。


 


 

二、Servlet運行原理和流程

        1. Servlet運行原理

    ①. WebApplication的標準目錄結構:

WEB-INF/classes

      /lib

Web.xml

,也就是一個完整的web應用程序目錄下,必須包含以上的目錄結構。

Classes 文件夾下是項目中用到的類文件,均由JDK編譯成了.class文件

Lib文件夾是我們項目中引用的jar包

Web.xml是整個web應用程序的配置文檔。

瞭解了這些,我們再來看Tomcat的工作流程。

            ②. Tomcat解析URL

a) 首先來看URL中包含的信息:”協議” + “端口號” + “路徑(項目名稱+文件路徑)”

Tomcat啓動後,監聽我們的8080端口,當有Url請求發過來之後,解析出項目名稱 abingtest,然後到webapps目錄下搜索到該項目文件夾。

b) 項目文件找到後,開始尋找類文件。

這個時候Tomcat去Web.xml文件中尋找<servlet-mapping> 配置節中包含”servlet/FirstServlet”字符串,進而找到該類文件所在的位置。

            ③. Servelt中的doGet() 和 doPost() 方法

我們寫的FirstServlet 繼承了HttpServlet ,重寫了HttpServlet中的doGet() 方法,HttpServlet中還有一個doPost()方法。這兩個方法都是用來處理Http請求的。Servlet會根據我們提交表單的方法 (method=post/get)調用service方法來自動選擇。


         2、一個servlet運行流程圖:

                   

出處:http://blog.csdn.net/lfsf802/article/details/7212308

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章