java servlet生命週期

來源:互聯網
上載者:User

Servlet是使用 Java Servlet應用程式設計介面及相關類和方法的Java程式。它在Web伺服器上或應用伺服器上運行並擴充了該伺服器的能力。Java Servlet對於Web伺服器就好像Java Applet對於Web瀏覽器。Applet裝入Web瀏覽器並在Web瀏覽器內執行,而Servlet則是裝入Web伺服器並在Web伺服器內執行。 Java Servlet API 定義了Servlet和伺服器之間的一個標準介面,這使得Servlet具有跨伺服器平台的特性。

  Servlet通過建立一個架構擴充伺服器的能力,採用要求-回應模式提供 Web服務。當客戶機發送請求至伺服器時,伺服器將請求資訊發送給Servlet,Servlet產生響應內容並將其傳給Server,然後再由 Server將響應返回給用戶端。

  Servlet的功能

  Servlet的功能涉及範圍很廣。例如,Servlet可完成如下功能:

  建立並返回一個包含基於客戶請求性質的動態內容的完整的 HTML頁面。

  建立可嵌入到現有 HTML 頁面中的一部分 HTML 頁面(HTML 片段)。與其他伺服器資源(檔案、資料庫、Applet、Java應用程式等)進行通訊。

  用多個客戶機處理串連,接受多個客戶機的輸入,並將結果廣播到多個客戶機上。例如,Servlet 可以是多參與者的遊戲伺服器。

  允許在單串連方式下傳送資料的情況下,在瀏覽器上開啟伺服器至Applet的新串連,並將該串連保持在開啟狀態。允許客戶機和伺服器簡單、高效地執行會話的情況下,Applet也可以啟動客戶瀏覽器和伺服器之間的串連。可以通過定製協議或標準(如 IIOP)進行通訊。

  對特殊的處理採用 MIME 類型過濾資料,例如映像轉換和伺服器端(包括SSI)。

  將定製的處理提供給所有伺服器的標準例行程式。例如,Servlet 可以修改如何認證使用者。

  Java Servlet與現有網路技術的差別

  那麼Java Servlet與一些現有的網路技術有什麼具體的差別呢。

  Java Servlet與Applet之間的差別 從基本上來說,Servlet與 Applet 是截然相反的。Servlet可以被視為伺服器方面的 Applet。Servlet在網路伺服器內運行而Applet在網路瀏覽器內運行。瀏覽器提交一個請求執行Servlet的命令;而由於瀏覽器可直接命令Applet,所以它可以在運行時單機運行。

  Java Servlet與CGI之間的差別 與傳統的CGI和許多其他類似CGI的技術相比,Java Servlet具有更高的效率,更容易使用,功能更強大,具有更好的可移植性,更節省投資。其中最大的區別是在效能方面。

  在傳統的CGI中,每個請求都要啟動一個新的進程,如果CGI程式本身的執行時間較短,啟動進程所需要的開銷很可能反而超過實際執行時間。而使用Servlet時,伺服器上僅有一個Java虛擬機器在運行,只有當Servlet被調用時,它才被載入,且直到Servlet更改時,它才會被再次載入。在傳統CGI中,如果有N個並發的對同一CGI程式的請求,則該CGI程式的代碼在記憶體中重複裝載了N次;而對於Servlet,處理請求的是N個線程,只需要一份Servlet類代碼。在效能最佳化方面,Servlet也比CGI有著更多的選擇,比如緩衝以前的計算結果,保持資料庫連接的活動,等等。

  通過使用Servlet API,開發人員不必擔心伺服器的內部運作方式。表格資料、伺服器頭、cookies等皆可通過Servlet處理。另外,因為Servlet是用 Java寫的,能將其從一個伺服器移到另一個伺服器以供發布,同時不必擔心作業系統或伺服器的類型。這一優點充分體現了Java"一次編寫,隨處運行"的優越特性。

  Servlet的生命週期

  Servlet的生命週期定義了一個Servlet如何被載入、初始化,以及它怎樣接收請求、響應請求、提供服務。

  在代碼中,Servlet生命週期由介面 javax.servlet.Servlet定義。所有的Java Servlet 必須直接或間接地實現javax.servlet.Servlet介面,這樣才能在Servlet Engine上運行。Servlet Engine提供network Service,響應MIME request,運行Servlet Container。 javax.servlet.Servlet介面定義了一些方法,在Servlet 的生命週期中,這些方法會在特定時間按照一定的順序被調用。如圖14-1所示。

  
                  Servlet的生命週期

  Servlet 如何被載入(Load)、被執行個體化(Instantiated)

  Servlet Engine 負責執行個體化和載入Servlet,這個過程可以在Servlet Engine 載入時執行,可以在Servlet 響應請求時執行,也可以在兩者之間的任何時候執行。

  Servlet如何被初始化(Initialized)

  Servlet Engine 載入好Servlet 後,必須要初始化它。初始化時Servlet 可以從資料庫裡讀取初始資料,建立JDBC Connection,或者建立對其他有價值的資源的引用。

  在初始化階段,Init( )方法被調用。這個方法在javax.servlet.Serlet介面中定義。Init( )方法以一個Servlet 設定檔(ServletConfig 型)為參數。Servlet configuration 對象由Servlet Engine 實現,可以讓Servlet 從中讀取一些name-value對的參數值。ServletConfig對象還可以讓Servlet接受一個Servlet Context對象。

  Servlet 如何處理請求

  Servlet 被初始化以後,就處於能響應請求的就緒狀態。每個對Servlet 的請求由一個Servlet Request 對象代表。Servlet 給用戶端的響應由一個Servlet Response對象代表。當用戶端有一個請求時,Servlet Engine 將ServletRequest 和ServletResponse對象都轉寄給Servlet,這兩個對象以參數的形式傳給Service方法。這個方法由 javax.servlet.Servlet定義並由具體的Servlet 實現。

  Servlet還可以實現 ServletRequest 和ServletResponse介面。ServletRequest介面可以讓Servlet 擷取用戶端請求中的參數,如form data、request資訊、協議類型,等等。Servlet 可以從ServletInputStream流中讀取request 資料。ServletResponse介面允許Servlet設定response headers和status codes。實現這個介面可以使Servlet能訪問ServletOutputStream流用來向用戶端返回資料。

  Servlet如何被釋放

  Servlet Engine 沒有必要在Servlet 生命週期的每一段時間內都保持Servlet的狀態。Servlet Engine可以隨時隨意使用或釋放Servlet。因此,你不能依賴Servlet class或其成員儲存資訊。當Servlet Engine判斷一個Servlet應當被釋放時(比如說Engine準備Shut down 或需要回收資源),Engine必須讓Servlet 能釋放其正在使用的任何資源,並儲存持久性的狀態資訊。這些可以通過調用Servlet的destroy方法實現。     在Servlet Engine 釋放一個Servlet 以前,必須讓其完成當前執行個體的service方法或是等到timeout(如果Engine定義了timeout)。當Engine釋放一個 Servlet以後,Engine將不能再將請求轉寄給它,Engine必須徹底釋放該Servlet並將其標明為可回收的(給garbage collection)。

  在Servlet API中最重要的是Servlet interface。所有的Servlets執行這個interface的方式有很多種:或者是直接的,或者通過extending這個class執行它,如 HttpServlet。這個Servlet interface 提供並安排Servlet與用戶端聯絡的方法。Servlet 編寫者可以在他們開發Servlet程式時提供更多一些或所有這樣的方法。

  當一個Servlet接收來自用戶端的調用請求時,它接收兩個對象:一個是 ServletRequest,另外一個是ServletResponse。這個ServletRequest class 概括從用戶端到伺服器之間的聯絡,而 ServletResponse class 概括從Servlet返回用戶端的聯絡。

  ServletRequest interface 可以擷取到這樣一些資訊,如由用戶端傳送的參數名稱,用戶端正在使用的協議,產生請求並且接收請求的伺服器遠端主機名稱。它也提供擷取資料流的 Servlet、ServletInputStream,這些資料是用戶端引用中使用HTTP POST和PUT方法遞交的。一個ServletRequest的子類可以讓Servlet擷取更多的協議特性資料。

  例如,HttpServletRequest 包含擷取HTTP-specific頭部資訊的方法。ServletResponse interface 給出相應用戶端的Servlet方法。它允許Servlet設定內容長度和回應的MIME類型,並且提供輸出資料流ServletOutputStream,通過編寫者可以發回相應資料。ServletResponse子類可以給出更多protocol-specific容量的資訊。例如,HttpServletResponse 包含允許Servlet操作HTTP-specific頭部資訊的方法。

  上面有關classes 和 interfaces的描述構成了一個基本的Servlet架構。HTTP Servlets有一些附加的可以提供session-tracking capabilities的方法。Servlet編寫者可以用這些API在有他人操作時維護Servlet與用戶端之間的狀態。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.