Servlet編程專題1之Servlet生命周期
1、Servlet初步認識:
- 通常來說,Servlet是宏觀上Servlet規範中的一個具體的接口,Servlet規範中包含一套接口。而Servlet接口僅僅是其中之一。
- 從微觀地角度上講,Servlet是Servlet接口實現類的一個實例對象,是運行在服務器上的一段Java小程序,即Server Applet,也就是Servlet這個單詞的由來。Servlet的主要功能是根據客戶端提交的請求,調用服務器端相關java代碼,完成對請求的處理和運算。
2、Servlet生命周期:
a、所謂Servlet生命周期是指:Servlet對象的創建、Servlet對象的初始化、Servlet對象服務的執行以及最後Servlet對象被銷毀的整個過程。
- Servlet的整個生命周期過程的執行,均由Web服務器負責管理,即Servlet從創建到服務到銷毀的整個過程中方法的調用,都是由Web服務器負責調用執行,程序員無法控制其執行流程。
- 但是程序員可以獲取到Servlet的這些生命周期時間點(實例化、初始化、服務以及銷毀時間點),並可以指定讓Servlet做一些具體業務相關的事情。
b、Servlet生命周期具體方法執行流程:
- 說明:
a、當請求發送到Web容器後,Web容器會解析請求URL,並從中分離出Servlet對應的URI。
b、根據分離出來的URI,通過web.xml中配置的URI和Servlet的映射關系,找到要執行的Servlet,即找到用於處理該請求的Servlet。
- web.xml中配置的URI和Servlet的映射關系表示如下:
c、若該Servlet不存在,則調用該Servlet的無參數構造器,init()方法,實例化該Servlet,然後執行service()方法。
d、若該Servlet已經被創建,則直接調用service方法。
e、當web容器被關閉,或者該應用被關閉,則調用執行destroy()方法,銷毀該Servlet實例。
3、Servlet特征:
a、Servlet是單例多線程的。
b、一個Servlet實例只會執行一次無參數構造器與init()方法,並且是在第一次訪問時執行。
c、用戶每提交一次對當前Servlet的請求,就會執行一次service()方法。
d、一個Servlet實例只會執行一次destroy()方法,在應用停止時執行。
e、由於Servlet是單例多線程的,所以為了保證其線程安全性,一般情況下是不為Servlet類定義可修改的成員變量。因為每個線程均可修改這個成員變量,會出現線程安全問題。
f、默認情況下,Servlet在Web容器啟動時是不會被實例化的。
3、在web.xml文件中註冊Servlet時,如果希望Servlet在Web容器啟動時創建Servlet需要在<servlet>標簽中設置<load-on-startup>標簽。
4、Web容器中的兩個Map:
- 當Servlet實例被創建好後放在了哪裏?web.xml中URI和Servlet的映射關系反映到內存中是以什麽樣的形式存在的呢?
- 當Servlet實例被創建好之後,會將該Servlet實例的引用放入到一個Map集合中。該Map集合的key為URI,而value則為Servlet實例的引用,即Map<String,Servlet>。當Web容器從用戶請求中分離出URI後,會首先到這個Map中查找是否存在其所對應的value。若存在,則直接調用其service()方法。若不存在,則需要創建該Servlet實例。
- 若請求的Servlet實例不存在,Web容器又是根據什麽創建這個Servlet實例的呢?在Web容器的內存中,還存在一個Map集合。該Map集合的key為URI,而value則為web.xml中配置的與之對應的Servlet的全限定性類名,即Map<String, String>。
- 當Web容器從用戶請求中分離出URI後,到第一個Map中查找沒有找到其所對應的Servlet實例,則會馬上查找這第二個Map,從中找到其所對應的類名,再根據反射機制,創建這個Servlet實例。然後再將這個創建好的Servlet的引用放入到第一個Map中。
5、關於getServletInfo()方法:
- Servlet接口中的方法getServletInfo(),是由程序自己定義的有關當前Servlet的一些基本信息,不屬於Servlet生命周期中的方法。對程序的運行沒有任何影響和作用,僅僅是返回一些讓他人閱讀的信息而已。
-
javax.servlet.Servlet接口中getServletInfo()的方法描述說明:6、附:需要註意,同一個URI只能夠映射一個Servlet。
本文出自 “12392717” 博客,請務必保留此出處http://12402717.blog.51cto.com/12392717/1972458
Servlet編程專題1之Servlet生命周期