Servlet 生命周期介绍
在面試的時候.
有時會被問到這個問題: 請描述一下Servlet的生命周期.
其實面試官就是想問你1個Servlet何時被創建, 何時被調用等....
本文就是詳細解答這個問題的.
總體流程圖
上面的流程圖從輸入網址 到瀏覽器地址欄開始, 到Web 服務器軟件關閉結束.
其中白底色的圖形代表的是瀏覽器在工作.
灰底色的指的是Web服務器軟件(例如Tomcat, IIS等)
黃底色的代表的是Servlet對象本身在工作.
下面對這個流程圖的每一步都進行解析.
一, 瀏覽器地址輸入地址
例如上面的地址欄輸入
http://localhost:8080/TestServlet2/ABC
其中:
http 指的是網頁瀏覽協議,? 大部分常用的都是http協議,? 需要嚴格安全管理的(例如需要傳送密碼的)的網頁往往會使用https 協議.
localhost 指的服務器名稱. 也就是瀏覽器要從網絡哪一臺主機去獲得需要瀏覽的內容.
8080 指的是服務器的Web 服務器程序用的是哪一個端口.?? 大部分網站都會讓web 服務器軟件使用80端口, 那么瀏覽器地址欄就不用輸入端口(默認就是80), tomcat默認使用的端口是8080.
TestServlet2 指的是網絡應用程序的名字, 這個應用程序是部署在web主機的web服務器軟件內的.? 記住, 這個網絡應用程序只是針對J2EE來講的.? 并不一定適用于其他技術編寫的網站(如asp.net. psp等)
ABC 只于這個地址名稱就是定義在servlet配置中的(一般在WEB-INF/web.xml中, 應用MVC的框架則可能配置在Control 類里)URL后序.? 每1個后序關鍵字對應1個Servlet對象. Web服務器軟件會將Http協議Get請求發送到這個servlet對象, 交由它處理.
二, 瀏覽器分析地址獲得Web主機的ip
例如上面那條URL,? 主機別名是localhost.
那么瀏覽器如何根據localhost 這個關鍵字獲得對應的ip.
第一步就是去瀏覽器所在機器的host文件去找.
例如linux機器的host 文件/etc/hosts 是這樣的: (windows也有host文件, 具體位置忘了)
可以到localhost 正是對應 127.0.0.1 就是本機地址了.
也就是講, 瀏覽器會將localhost解析成127.0.0.1的地址.
但是如果在host文件里找不到, 例如輸入www.163.com?
這是瀏覽器就需要到dns服務器去找, 總之, 必須解析出主機地址.
三,嘗試與web主機的web服務器軟件建立連接.
之前講過TCP協議了, 只需要知道主機地址和端口. 就可以利用socket發起1個連接請求.
Web服務器端, 一旦接受請求, 則會建立一條TCP傳輸通道.??
這個通道里面包含兩條Stream, 方向相反.
四, 瀏覽器發送http請求(Get/post)到web服務器軟件.
一旦瀏覽器與Web主機的服務器軟件(例如Tomcat, Jboss,IIS..)建立了一條連接通道.
瀏覽器就會按照Http協議發送get請求到web服務器軟件.
如上圖, 在瀏覽器按下F12可以看到開發者信息.
這個簡單的例子中,? 瀏覽器只發送了1個Get請求到服務器軟件.
在右下角可以見到該get請求的內容:
Host: localhost:8080 User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive包括host信息,? 瀏覽器與操作系統信息等等..
實際上, 在上圖我們也看到服務器的反饋(respones) . 這個后面再講.
五, Web服務器軟件解析出對應Web應用程序.
好了, 到這一步, 主要工作就輪到Web服務器軟件了.
首先, Server App會繼續解析URL(包括在Get request)中.
對于Tomcat來講, 這一步會解析出對應的web 應用程序 TestServlet2
注: 1個web服務器軟件通常會同時管理多個網絡應用程序.
六, Web服務器軟件解析出對應的URL后序.
好了, 到了這步,?? 整個URL
http://localhost:8080/TestServlet2/ABC
就剩下/ABC 這一部分了.
這部分通常是Servlet來(本文就是基于Servlet技術來講的) 管理,? 對應關系通常編寫在../WEB-INF/web.xml里( MVC框架也可能在Controller類里)
這個例子中. web.xml 的 Servlet配置部分是這樣寫的:
<!-- servlet-name is the nick name of servlet objectThe source name is user defined, it's suggested that using the name of servlet class servlet-class is the full name(include packege path) of the servlet object--><servlet><servlet-name>MyFirstServlet</servlet-name> <servlet-class>com.pkg1.MyFirstServlet</servlet-class> </servlet><!-- the mapping of servlet of jsp actionthe servlet-name must be same with the above "servlet-name"url-pattern is the source name of which will access servlet objectit must be started with "/"--><servlet-mapping><servlet-name>MyFirstServlet</servlet-name> <url-pattern>/ABC</url-pattern></servlet-mapping>先看servlet-mapping部分
/ABC 這個url match的是 MyFirstServlet 這個 Servlet 昵稱(Nick Name).
然后看servlet部分.
MyFirstServlet 對應的就是
com.pkg1.MyFirstServlet而這個就是真正的要工作的Servlet類.
七, Web服務器軟件檢查Servlet對象是否存在.
在web世界中, 我們可以把每1個Servlet類都看成Singleton 類.
也就是講, 對于每1個Servlet類, 都只會有最多1個對象在工作, 不會同時存在兩個相同Servlet類的對象.
例如第6步, 根據/ABC? 得出com.pkg1.MyFirstServlet類后.? Web服務器軟件就會去檢查是否有1個對應的servlet對象已經被創建.
如果有則跳過第八步.
八, Web服務器軟件構造出Servlet對象.
注意, 這一步有1個前提, 就是當前該Servlet沒有任何1個對象被創建.(或者之前的被銷毀)
而我們常寫的Servlet類都沒有寫構造函數的.
一般是重寫 Init(), doGet(). doPost()..
實際上, 這個Servlet不是被new出來的, 而是web服務器軟件利用反射技術構建.( 根據類名創建該類的對象)
在這過程中, 這個Servlet里的init()函數會被執行一次.
而無論這個Servlet對象再被調用多少次, init()方法都不會再杯執行, 直至銷毀后重新創建.
九, Web服務器軟件把接收到的http 請求打包成1個ServletRequest對象, 在構造1個ServletResponse對象發給Servlet對象.
再得到1個Servlet對象后.
Web服務器軟件, 就會把從瀏覽器接收到的Http請求交給Servlet來處理.
其中ServletRequest對象里包含里傳入的參數, 而ServletResponese對象用于獲取Servlet對象的處理結果
十, Servlet對象工作
這里的代碼通常就是程序猿寫的業務代碼了
無非分兩個步驟
1, 處理傳入的ServletRequest對象里的信息
這個例子的代碼:
System.out.println("service() has been called!"); res.getWriter().println("<font color=\"blue\" style=\"font-size:40px;\">Just a testing</font>");res.getWriter().flush();可見它往ServletResponse對象的outputStream寫入了一段很簡單的html語句..
這個一步就是Servlet生命周期最核心的一步, 也是最常用的一步, 1個Servlet可能會被調用很多次, 這個就是Servlet對象的存在意義.
十一, WebServer 軟件對返回信息進行處理
Web服務器軟件會從ServletResponse這個對象中得出Servlet工作處理完的反饋信息.
但是這些信息通常不能被瀏覽器直接解析(或者很耗時間)
所以WebServer軟件通常會將這些信息翻譯成瀏覽器能直接閱讀的格式.
十二, WebServer 把返回信息發送會瀏覽器
看上圖右下角, 我們可以觀察得reponse里面的內容就是 servlet往outputStream寫的內容.
所以瀏覽器就中直接顯示3個藍色的單詞了.
十三, 如果對應的網絡程序被reload或者webServer本身被關閉, 則servlet對象會被銷毀
這個就是Servlet生命周期的最后一步了, 不難理解.
這時, servlet對象會執行自己的destory()方法.
總結
以上是生活随笔為你收集整理的Servlet 生命周期介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WebServer 软件原理简介
- 下一篇: HttpServlet类简介和简单用法