天天看點

servlet 運作過程

servlet 運作在servlet 容器中,其生命周期由容器來管理。servlet 的生命周期通過 javax.servlet.Servlet接口中的init(),servce(),和destory();方法表示。

1,加載和執行個體化 servlet 容器負責加載和執行個體化servlet 當容器啟動或在容器中檢測到需要這個servlet來響應一個請求 時。建立servlet執行個體。容器通過java 的反射API來建立servlet執行個體.是以servlet中不應該提供帶參數的構造函數。

2,初始化 在servlet執行個體化後,容器必須調用 init() 方法來初始化這個對象。初始化的目的是為了讓servlet對象在處理客戶請求之前完成一些初始工作。對于每一個servlet執行個體,init() 方法隻會調用一次。

 3,請求處理 servlet 容器調用service()方法對請求處理。servlet 執行個體通過ServletRequest對象獲得用戶端的相關資訊和請求資訊。在對請求處理後調用ServletResponse對象設定響應資訊。

4,服務終止 當容器檢測到一個servlet執行個體應該從伺服器中移除時,容器調用執行個體的destory方法。讓執行個體釋放它所占用的資源。如果在次發請求就會 建立一個新的servlet 執行個體。

在整個servlet 的生命周期中,建立servlet執行個體,調用執行個體的init()和destory()方法都隻執行一次,當初始話完成後,servlet容器将該執行個體儲存在記憶體中,通過servlce() 方法為接受請求服務。

servlet 運作過程

生命周期:(1)加載和執行個體化(2)初始化(3)請求處理(4)服務終止

方法及作用:

 (1) init() 方法   在 Servlet 的生命期中,僅執行一次 init() 方法。它是在伺服器裝入 Servlet 時執行的。 可以配置伺服器,以在啟動伺服器或客戶機首次通路 Servlet 時裝入 Servlet。 無論有多少客戶機通路 Servlet,都不會重複執行 init() 。

     

(2) service() 方法   service() 方法是 Servlet 的核心。每當一個客戶請求一個HttpServlet 對象,該對象的service() 方法就要被調用,而且傳遞給這個方法一個"請求"(ServletRequest)對象和一個"響應"(ServletResponse)對象作為參數。 在 HttpServlet 中已存在 service() 方法。預設的服務功能是調用與 HTTP 請求的方法相應的 do 功能。例如, 如果 HTTP 請求方法為 GET,則預設情況下就調用 doGet() 。Servlet 應該為 Servlet 支援的 HTTP 方法覆寫 do 功能。因為 HttpServlet.service() 方法會檢查請求方法是否調用了适當的處理方法,不必要覆寫 service() 方法。隻需覆寫相應的 do 方法就可以了。  

 

(3)doGet()方法  當一個客戶通過HTML 表單發出一個HTTP GET請求或直接請求一個URL時,doGet()方法被調用。與GET請求相關的參數添加到URL的後面,并與這個請求一起發送。當不會修改伺服器端的資料時,應該使用doGet()方法。  

(4)doPost()方法  當一個客戶通過HTML 表單發出一個HTTP POST請求時,doPost()方法被調用。與POST請求相關的參數作為一個單獨的HTTP 請求從浏覽器發送到伺服器。當需要修改伺服器端的資料時,應該使用doPost()方法。   

(5) destroy() 方法   destroy() 方法僅執行一次,即在伺服器停止且卸裝Servlet 時執行該方法。典型的,将 Servlet 作為伺服器程序的一部分來關閉。預設的 destroy() 方法通常是符合要求的,但也可以覆寫它,典型的是管理伺服器端資源。例如,如果 Servlet 在運作時會累計統計資料,則可以編寫一個 destroy() 方法,該方法用于在未裝入 Servlet 時将統計數字儲存在檔案中。另一個示例是關閉資料庫連接配接。   當伺服器卸裝 Servlet 時,将在所有 service() 方法調用完成後,或在指定的時間間隔過後調用 destroy() 方法。一個Servlet 在運作service() 方法時可能會産生其它的線程,是以請确認在調用 destroy() 方法時,這些線程已終止或完成。

   

(6) GetServletConfig()方法   GetServletConfig()方法傳回一個 ServletConfig 對象,該對象用來傳回初始化參數和ServletContext。ServletContext 接口提供有關servlet 的環境資訊。   

 

(7) GetServletInfo()方法   GetServletInfo()方法是一個可選的方法,它提供有關servlet 的資訊,如作者、版本、版權。   當伺服器調用sevlet 的Service()、doGet()和doPost()這三個方法時,均需要 "請求"和"響應"對象作為參數。"請求"對象提供有關請求的資訊,而"響應"對象提供了一個将響應資訊傳回給浏覽器的一個通信途徑。   

javax.servlet 軟體包中的相關類為ServletResponse和ServletRequest,而javax.servlet.http 軟體包中的相關類為HttpServletRequest 和 HttpServletResponse。Servlet 通過這些對象與伺服器通信并最終與客戶機通信。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整個生命周期過程的UML序列圖,如圖2-16所示。 (點選檢視大圖)圖2-16 Servlet在生命周期内為請求服務 如果需要讓Servlet容器在啟動時即加載Servlet,可以在web.xml檔案中配置元素。