Servlet运行原理
Servlet在容器中的執行過程
1.瀏覽器向服務器發出GET請求
2.服務器上的Tomcat接收到該url,根據該url判斷為Servlet請求,此時Tomcat將產生兩個對象:請求對象(HttpServletRequest)和響應對象(HttpServletResponce)
3.Tomcat根據url找到目標Servlet,且創建一個線程
4.Tomcat將剛才創建的請求對象和響應對象傳遞給該線程
5.Tomcat調用Servlet的service()方法
6.service()方法根據請求類型(本示例為GET請求)調用doGet()(本示例調用doGet())或doPost()方法
7.doGet()執行完后,將結果返回給Tomcat
8.線程被銷毀或被放在線程池中
注意:
1.在容器中的每個Servlet原則上只有一個實例
2.每個請求對應一個線程
3.多個線程可作用于同一個Servlet(這是造成Servlet線程不安全的根本原因)
4.每個線程一旦執行完任務,就被銷毀或放在線程池中等待回收
Servlet生命周期
Servlet的生命周期是由Tomcat容器管理的
a) 客戶發出請求—>Web 服務器轉發到Web容器Tomcat;
b) Tomcat主線程對轉發來用戶的請求做出響應創建兩個對象:HttpServletRequest和HttpServletResponse;
c) 從請求中的URL中找到正確Servlet,Tomcat為其創建或者分配一個線程,同時把2創建的兩個對象傳遞給該線程;
d) Tomcat調用Servlet的servic()方法,根據請求參數的不同調用doGet()或者doPost()方法;
e) 假設是HTTP GET請求,doGet()方法生成靜態頁面,并組合到響應對象里;
Servlet線程結束,Tomcat將響應對象轉換為HTTP響應發回給客戶,同時刪除請求和響應對象。
從該過程中,我們可以理解Servlet的生命周期:Servlet類加載(對應3步);Servlet實例化(對應3步);調用init方法(對應3步);調用service()方法(對應4、5步);;調用destroy()方法(對應6步)。
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異?;蛘遀navailableException異常來通知容器。ServletException異常用于指明一般的初始化失敗,例如沒有找到初始化參數;而UnavailableException異常用于通知容器該Servlet實例不可用。例如,數據庫服務器沒有啟動,數據庫連接無法建立,Servlet就可以拋出UnavailableException異常向容器指出它暫時或永久不可用。
(3)請求處理
Servlet容器調用Servlet的service()方法對請求進行處理。要注意的是,在service()方法調用之前,init()方法必須成功執行。在service()方法中,Servlet實例通過ServletRequest對象得到客戶端的相關信息和請求信息,在對請求進行處理后,調用ServletResponse對象的方法設置響應信息。在service()方法執行期間,如果發生錯誤,Servlet實例可以拋出ServletException異?;蛘遀navailableException異常。如果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运行原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何入门大数据学习
- 下一篇: 算法--职前算法复习