日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

框架:Servlet的生命周期

發布時間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 框架:Servlet的生命周期 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

1.加載和實例化

2.初始化

3.請求處理

4.服務終止

?

?

Web服務器在與客戶端交互時Servlet的工作過程是:

1.?????在客戶端對web服務器發出請求

2.???? web服務器接收到請求后將其發送給Servlet

3.???? Servlet容器為此產生一個實例對象并調用ServletAPI中相應的方法來對客戶端HTTP請求進行處理,然后將處理的響應結果返回給WEB服務器.

4.???? web服務器將從Servlet實例對象中收到的響應結構發送回客戶端.

?

servlet的生命周期:

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異常向容器指出它暫時或永久不可用。

?

I.如何配置Servlet的初始化參數?

?? 在web.xml中該Servlet的定義標記中,比如:

??? <servlet>
???????? <servlet-name>TimeServlet</servlet-name>
???????? <servlet-class>com.allanlxf.servlet.basic.TimeServlet</servlet-class>
????????<init-param>
??????????? <param-name>user</param-name>
??????????? <param-value>username</param-value>
???????</init-param>
???????<init-param>
?????????? <param-name>blog</param-name>
?????????? <param-value>http://。。。</param-value>
???????</init-param>

??? </servlet>

配置了兩個初始化參數user和blog它們的值分別為username和http://。。。, 這樣以后要修改用戶名和博客的地址不需要修改Servlet代碼,只需修改配置文件即可。

II.如何讀取Servlet的初始化參數?

?????? ServletConfig中定義了如下的方法用來讀取初始化參數的信息:

?????? public String getInitParameter(String name)

????????? 參數:初始化參數的名稱。
????????? 返回:初始化參數的值,如果沒有配置,返回null。

???III.init(ServletConfig)方法執行次數

?????? 在Servlet的生命周期中,該方法執行一次。

IV.init(ServletConfig)方法與線程

?????該方法執行在單線程的環境下,因此開發者不用考慮線程安全的問題。

V.init(ServletConfig)方法與異常

???該方法在執行過程中可以拋出ServletException來通知Web服務器Servlet實例初始化失敗。一旦ServletException拋出,Web服務器不會將客戶端請求交給該Servlet實例來處理,而是報告初始化失敗異常信息給客戶端,該Servlet實例將被從內存中銷毀。如果在來新的請求,Web服務器會創建新的Servlet實例,并執行新實例的初始化操作

?

?

3.請求處理

  Servlet容器調用Servlet的service()方法對請求進行處理。要注意的是,在service()方法調用之前,init()方法必須成功執行。在service()方法中,

Servlet實例通過ServletRequest對象得到客戶端的相關信息和請求信息,在對請求進行處理后,調用ServletResponse對象的方法設置響應信息。在service

()方法執行期間,如果發生錯誤,Servlet實例可以拋出ServletException異常或者UnavailableException異常。如果UnavailableException異常指示了該實

例永久不可用,Servlet容器將調用實例的destroy()方法,釋放該實例。此后對該實例的任何請求,都將收到容器發送的HTTP 404(請求的資源不可用)響應

。如果UnavailableException異常指示了該實例暫時不可用,那么在暫時不可用的時間段內,對該實例的任何請求,都將收到容器發送的HTTP 503(服務器暫

時忙,不能處理請求)響應。

  

I.?service()方法的職責

???? service()方法為Servlet的核心方法,客戶端的業務邏輯應該在該方法內執行,典型的服務方法的開發流程為:

??? 解析客戶端請求-〉執行業務邏輯-〉輸出響應頁面到客戶端

II.service()方法與線程

???? 為了提高效率,Servlet規范要求一個Servlet實例必須能夠同時服務于多個客戶端請求,即service()方法運行在多線程的環境下,Servlet開發者必須保證該方法的線程安全性。

III.service()方法與異常

???? service()方法在執行的過程中可以拋出ServletException和IOException。其中ServletException可以在處理客戶端請求的過程中拋出,比如請求的資源不可用、數據庫不可用等。一旦該異常拋出,容器必須回收請求對象,并報告客戶端該異常信息。IOException表示輸入輸出的錯誤,編程者不必關心該異常,直接由容器報告給客戶端即可。

編程注意事項說明:

1) 當Server Thread線程執行Servlet實例的init()方法時,所有的Client Service Thread線程都不能執行該實例的service()方法,更沒有線程能夠執行該實例的destroy()方法,因此Servlet的init()方法是工作在單線程的環境下,開發者不必考慮任何線程安全的問題。

2) 當服務器接收到來自客戶端的多個請求時,服務器會在單獨的Client Service Thread線程中執行Servlet實例的service()方法服務于每個客戶端。此時會有多個線程同時執行同一個Servlet實例的service()方法,因此必須考慮線程安全的問題。

3) 請大家注意,雖然service()方法運行在多線程的環境下,并不一定要同步該方法。而是要看這個方法在執行過程中訪問的資源類型及對資源的訪問方式。分析如下:

???? i. 如果service()方法沒有訪問Servlet的成員變量也沒有訪問全局的資源比如靜態變量、文件、數據庫連接等,而是只使用了當前線程自己的資源,比如非指向全局資源的臨時變量、request和response對象等。該方法本身就是線程安全的,不必進行任何的同步控制。

????? ii. 如果service()方法訪問了Servlet的成員變量,但是對該變量的操作是只讀操作,該方法本身就是線程安全的,不必進行任何的同步控制。

????? iii. 如果service()方法訪問了Servlet的成員變量,并且對該變量的操作既有讀又有寫,通常需要加上同步控制語句。

????? iv. 如果service()方法訪問了全局的靜態變量,如果同一時刻系統中也可能有其它線程訪問該靜態變量,如果既有讀也有寫的操作,通常需要加上同步控制語句。

????? v. 如果service()方法訪問了全局的資源,比如文件、數據庫連接等,通常需要加上同步控制語句。

?

?

4.服務終止

  當容器檢測到一個Servlet實例應該從服務中被移除的時候,容器就會調用實例的destroy()方法,以便讓該實例可以釋放它所使用的資源,保存數據到持久存

儲設備中。當需要釋放內存或者容器關閉時,容器就會調用Servlet實例的destroy()方法。在destroy()方法調用之后,容器會釋放這個Servlet實例,該實例

隨后會被Java的垃圾收集器所回收。如果再次需要這個Servlet處理請求,Servlet容器會創建一個新的Servlet實例。

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

總結

以上是生活随笔為你收集整理的框架:Servlet的生命周期的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。