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 的生命週期中,這些方法會在特定時間按照一定的順序被調用。如下圖所示。
 
  servlet的定義及其生命週期
 
                                                    Servlet的生命週期
  Servlet 如何被加載(Load)、被實例化(Instantiated)
 
  Servlet Engine 負責實例化和加載Servlet,這個過程可以在Servlet Engine 加載時執行,可以在Servlet 響應請求時執行,也可以在兩者之間的任何時候執行(配置爲load on start  up的 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頭部信息的方法。
 
總結與運用:
     在實踐中可以配置一個load on start up 的Servlet,它隨服務器啓動而初始化,在其init方法中啓用一些參數設置,例如把某些變量存入ServletContext,這樣以後在其他Servlet中就可以獲得該參數了;而在其destroy中寫入一些資源回收的代碼,當服務器關閉時就可以自動關閉相遇的資源了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章