Servlet運行原理以及生命周期


Servlet運行原理  

  

 

Servlet生命周期定義了一個Servlet如何被加載、初始化,以及它怎樣接收請求、響應請求,提供服務。在討論Servlet生命周期之前,先讓我們來看一下這幾個方法:

1. init()方法

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

2. service()方法

      它是Servlet的核心,每當一個客戶請求一個HttpServlet對象,該對象的Service()方法就要調用,而且傳遞給這個方法一個“請求”(ServletRequest)對象和一個“響應”(ServletResponse)對象作為參數。在HttpServlet中已存在Service()方法。默認的服務功能是調用與HTTP請求的方法相應的do功能。

3. destroy()方法

      僅執行一次,在服務器端停止且卸載Servlet時執行該方法,有點類似於C++的delete方法。一個Servlet在運行service()方法時可能會產生其他的線程,因此需要確認在調用destroy()方法時,這些線程已經終止或完成。

     下面來談談Servlet的生命周期,Servlet的生命周期是由Servlet容器來控制的,它始於裝入Web服務器的內存時,並在終止或重新裝入Servlet時結束。這項操作一般是動態執行的。然而,Server通常會提供一個管理的選項,用於在Server啟動時強制裝載和初始化特定的Servlet。

     在代碼中,Servlet生命周期由接口javax.servlet.Servlet定義。所有的Java Servlet 必須直接或間接地實現javax.servlet.Servlet接口,這樣才能在Servlet Engine上運行。javax.servlet.Servlet接口定義了一些方法,在Servlet 的生命周期中,這些方法會在特定時間按照一定的順序被調用。

Servlet生命周期

加載和實例化Servlet

我們來看一下Tomcat是如何加載的:

     1. 如果已配置自動裝入選項,則在啟動時自動載入。

     2. 在服務器啟動時,客戶機首次向Servlet發出請求。

     3. 重新裝入Servlet時。

      當啟動Servlet容器時,容器首先查找一個配置文件web.xml,這個文件中記錄了可以提供服務的Servlet。每個Servlet被指定一個Servlet名,也就是這個Servlet實際對應的Java的完整class文件名。Servlet容器會為每個自動裝入選項的Servlet創建一個實例。所以,每個Servlet類必須有一個公共的無參數的構造器。

初始化

      當Servlet被實例化后,Servlet容器將調用每個Servlet的init方法來實例化每個實例,執行完init方法之后,Servlet處於“已初始化”狀態。所以說,一旦Servlet被實例化,那么必將調用init方法。通過Servlet在啟動后不立即初始化,而是收到請求后進行。在web.xml文件中用<load-on-statup> ...... </load-on-statup>對Servlet進行預先初始化。

      初始化失敗后,執行init()方法拋出ServletException異常,Servlet對象將會被垃圾回收器回收,當客戶端第一次訪問服務器時加載Servlet實現類,創建對象並執行初始化方法。

請求處理

      Servlet 被初始化以后,就處於能響應請求的就緒狀態。每個對Servlet 的請求由一個Servlet Request 對象代表。Servlet 給客戶端的響應由一個Servlet Response對象代表。對於到達客戶機的請求,服務器創建特定於請求的一個“請求”對象和一個“響應”對象。調用service方法,這個方法可以調用其他方法來處理請求。

      Service方法會在服務器被訪問時調用,Servlet對象的生命周期中service方法可能被多次調用,由於web-server啟動后,服務器中公開的部分資源將處於網絡中,當網絡中的不同主機(客戶端)並發訪問服務器中的同一資源,服務器將開設多個線程處理不同的請求,多線程同時處理同一對象時,有可能出現數據並發訪問的錯誤。

      另外注意,多線程難免同時處理同一變量時(如:對同一文件進行寫操作),且有讀寫操作時,必須考慮是否加上同步,同步添加時,不要添加范圍過大,有可能使程序變為純粹的單線程,大大削弱了系統性能;只需要做到多個線程安全的訪問相同的對象就可以了。

卸載Servlet

      當服務器不再需要Servlet實例或重新裝入時,會調用destroy方法,使用這個方法,Servlet可以釋放掉所有在init方法申請的資源。一個Servlet實例一旦終止,就不允許再次被調用,只能等待被卸載。

      Servlet一旦終止,Servlet實例即可被垃圾回收,處於“卸載”狀態,如果Servlet容器被關閉,Servlet也會被卸載,一個Servlet實例只能初始化一次,但可以創建多個相同的Servlet實例。如相同的Servlet可以在根據不同的配置參數連接不同的數據庫時創建多個實例。

 

 

摘自-fifiyong


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM