1. 程式人生 > >Servlet生命周期與HTTP協議

Servlet生命周期與HTTP協議

servlet http


Servlet生命周期

在web工程中每個Servlet類只會有一個實例化對象,這個實例化對象不能自己創建,只能由web服務器(Tomcat)來創建。這個實例化對象有一個生命周期,也就是所謂的Servlet生命周期。

Servlet生命周期分為三個階段:

  1. 初始化階段

有兩種情況下會進入初始化階段,這個階段是Servlet生命周期的開始。第一種情況是當瀏覽器第一次進行訪問時(註意是第一次),web服務器會去實例化Servlet對象,實例化Servlet對象完成後會把對象放在Servlet實例池中,並且會調用init方法。這個對象在整個生命周期中只會實例化一次,用戶使用完了就會放回實例池,下一個用戶訪問時就不會再進行實例化了,而是從實例池中拿出來用。

重寫init方法就可以得知Servlet對象只會實例化一次,因為只有實例化的時候才會調用init方法,代碼示例:

技術分享


使用瀏覽器進行訪問:

技術分享

會出現405狀態碼,是因為沒有重寫doGet方法,不過這個對我們的實驗沒有影響。


控制臺:

技術分享

可以看到在控制臺上打印了這段話,但是如果第二次訪問就不會打印了,因為Servlet對象只會實例化一次:

技術分享


第二種情況是提前設置在服務器啟動後就進行初始化,這種情況下沒有瀏覽器的訪問也會進入初始化階段進行實例化Servlet對象。

設置在服務器啟動後就進行初始化,需要在註解或web.xml文件上進行配置,註解的配置方式:

技術分享


控制臺:

技術分享

如圖代表配置成功,因為這個時候我只是啟動了服務器,並沒有使用瀏覽器去訪問也進入了初始化階段。


web.xml的配置方式:

技術分享


  1. 響應客戶請求階段

初始化階段過後,就會進入響應客戶請求階段,web服務器就會調用HttpServlet的service方法,把HttpRequest和HttpResponse對象作為參數傳遞給service方法,在service方法中會對請求的方式進行匹配,會選擇調用doGet、doPost等方法,匹配相應的方法後進入方法中調用邏輯層的方法,實現對客戶的響應。然後可以通過調用HttpRequest對象的有關方法獲取http請求信息,同時也可以再調用HttpResponse對象的有關方法,生成響應數據,最後web服務器把響應結果反饋給客戶端。

代碼示例:

技術分享


控制臺:

技術分享


瀏覽器:

技術分享

以上這個接收服務端請求並反饋處理結果的過程就是響應客戶請求階段。


  1. 終止(結束)階段

有兩種方式可以進入終止階段,這個階段也就是Servlet生命周期的結束。第一種方式是當我們修改了web工程源碼文件並進行保存時,Eclipse會重新將工程部署一次,重新部署時會調用destroy方法銷毀Servlet對象。同樣的我們可以重寫destroy方法來觀測到這一點,代碼示例:

技術分享


運行結果:

技術分享


關閉web服務器也會銷毀Servlet對象,註意:要點擊stop關閉,如果點擊控制臺上的那個紅色的小方塊是強制關閉,數據不會被保存到磁盤中,這種關閉方式會導致數據丟失:

技術分享


控制臺:

技術分享



流程圖:

技術分享

  1. 第7步是初始化階段,第7-12步都屬於服務階段也就是響應客戶請求階段,執行第13步中的任意一種操作都會進入終止階段。


思維導圖:

技術分享




HTTP協議

HTTP是超文本傳輸協議,是互聯網上應用最為廣泛的一種協議,所有的網站訪問都必須遵守這個標準。HTTP是基於TCP之上開發出來的,位於OSI模型中的應用層。

所謂協議就是一種通信規則的約定,基於這個協議可以完成從客戶端到服務端等一系列運作流程,可以說,Web是建立在HTTP協議上進行通信的。

HTTP有一個請求頭和響應頭,當客戶端訪問服務器時,會先發送一個請求頭,然後服務器會回執一個響應頭。

HTTP衍生了一個HTTPS加密傳輸協議,這個協議是具有SSL加密的HTTP傳輸協議。

HTTP協議有一個請求頭和響應頭,是文本格式的,如圖:

技術分享


下面這是一個常見的http請求頭的格式:

GET /form.html HTTP/1.1 (CRLF)

Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)

Accept-Language:zh-cn (CRLF)

Accept-Encoding:gzip,deflate (CRLF)

If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)

If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF)

User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)

Host:www.guet.edu.cn (CRLF)

Connection:Keep-Alive (CRLF)

(CRLF)



http有一個就叫做狀態碼的東西,狀態碼是服務器返回的,用於表服務器的響應狀態,它由 RFC 2616 規範定義的,並得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等規範擴展,以下是狀態碼的含義:

2.3.2.1 1**:請求收到,繼續處理

100——客戶必須繼續發出請求

101——客戶要求服務器根據請求轉換HTTP協議版本


2.3.2.2 2**:操作成功收到,分析、接受

200——交易成功

201——提示知道新文件的URL

202——接受和處理、但處理未完成

203——返回信息不確定或不完整

204——請求收到,但返回信息為空

205——服務器完成了請求,用戶代理必須復位當前已經瀏覽過的文件

206——服務器已經完成了部分用戶的GET請求


2.3.2.3 3**:完成此請求必須進一步處理

300——請求的資源可在多處得到

301——刪除請求數據

302——在其他地址發現了請求數據

303——建議客戶訪問其他URL或訪問方式

304——客戶端已經執行了GET,但文件未變化

305——請求的資源必須從服務器指定的地址得到

306——前一版本HTTP中使用的代碼,現行版本中不再使用

307——申明請求的資源臨時性刪除



2.3.2.4 4**:請求包含一個錯誤語法或不能完成

400——錯誤請求,如語法錯誤

401——未授權

HTTP 401.1 - 未授權:登錄失敗

  HTTP 401.2 - 未授權:服務器配置問題導致登錄失敗

  HTTP 401.3 - ACL 禁止訪問資源

  HTTP 401.4 - 未授權:授權被篩選器拒絕

HTTP 401.5 - 未授權:ISAPI 或 CGI 授權失敗

402——保留有效ChargeTo頭響應

403——禁止訪問

HTTP 403.1 禁止訪問:禁止可執行訪問

  HTTP 403.2 - 禁止訪問:禁止讀訪問

  HTTP 403.3 - 禁止訪問:禁止寫訪問

  HTTP 403.4 - 禁止訪問:要求 SSL

  HTTP 403.5 - 禁止訪問:要求 SSL 128

  HTTP 403.6 - 禁止訪問:IP 地址被拒絕

  HTTP 403.7 - 禁止訪問:要求客戶證書

  HTTP 403.8 - 禁止訪問:禁止站點訪問

  HTTP 403.9 - 禁止訪問:連接的用戶過多

  HTTP 403.10 - 禁止訪問:配置無效

  HTTP 403.11 - 禁止訪問:密碼更改

  HTTP 403.12 - 禁止訪問:映射器拒絕訪問

  HTTP 403.13 - 禁止訪問:客戶證書已被吊銷

  HTTP 403.15 - 禁止訪問:客戶訪問許可過多

  HTTP 403.16 - 禁止訪問:客戶證書不可信或者無效

HTTP 403.17 - 禁止訪問:客戶證書已經到期或者尚未生效

404——沒有發現文件、查詢或URl

405——用戶在Request-Line字段定義的方法不允許

406——根據用戶發送的Accept拖,請求資源不可訪問

407——類似401,用戶必須首先在代理服務器上得到授權

408——客戶端沒有在用戶指定的餓時間內完成請求

409——對當前資源狀態,請求不能完成

410——服務器上不再有此資源且無進一步的參考地址

411——服務器拒絕用戶定義的Content-Length屬性請求

412——一個或多個請求頭字段在當前請求中錯誤

413——請求的資源大於服務器允許的大小

414——請求的資源URL長於服務器允許的長度

415——請求資源不支持請求項目格式

416——請求中包含Range請求頭字段,在當前請求資源範圍內沒有range指示值,請求也不包含If-Range請求頭字段

417——服務器不滿足請求Expect頭字段指定的期望值,如果是代理服務器,可能是下一級服務器不能滿足請求長。



2.3.2.5 5**:服務器執行一個完全有效請求失敗

  HTTP 500 - 內部服務器錯誤

  HTTP 500.100 - 內部服務器錯誤 - ASP 錯誤

  HTTP 500-11 服務器關閉

  HTTP 500-12 應用程序重新啟動

  HTTP 500-13 - 服務器太忙

  HTTP 500-14 - 應用程序無效

  HTTP 500-15 - 不允許請求 global.asa

  Error 501 - 未實現

HTTP 502 - 網關錯誤




TCP/IP Monitor

在Eclipse中可以通過配置TCP/IP Monitor,來監視服務端和客戶端交互的數據,這個TCP/IP Monitor其實就是一個轉發的機制,不管是客戶端請求還是服務端響應都會經過TCP/IP Monitor的轉發,所以我們才能通過它去監視請求和響應信息,配置方式:

技術分享

技術分享

技術分享

技術分享



配置完成後,啟動Tomcat然後通過瀏覽器進行訪問,這次不要訪問8080端口了,而是訪問監視器配置的8081端口,這樣才能監視到數據:

技術分享


接著在Eclipse的TCP/IP Monitor窗口中可以查看到以下內容:

技術分享

從這個窗口中可以看到客戶端的請求頭內容和服務端的響應內容。

上面這種直接通過URL訪問的默認是get訪問類型,可以看到請求頭內容裏的第一段寫的就是GET類型。我們可以寫一個簡單的表單,指定post訪問類型,看看訪問後請求頭會顯示什麽:

Html代碼示例:

技術分享


記得將doGet換成doPost:

技術分享


瀏覽器:

技術分享


瀏覽器運行結果:

技術分享


TCP/IP Monitor窗口:

技術分享

從試驗結果可以得知,不僅能夠看到客戶的訪問類型,還能看到表單提交的數據。

除此之外我們還可以向服務器提交文件數據,而且能在TCP/IP Monitor窗口中看到提交文件中的內容,但是要註意只能在post訪問類型才能看得到,get類型是見不到的,例如我要上傳一個文本文件,內容如下:

技術分享


Html代碼:

技術分享



瀏覽器:

技術分享



TCP/IP Monitor窗口:

技術分享

以上就是如何通過TCP/IP Monitor窗口查看服務端和客戶端交互的數據。











本文出自 “zero” 博客,請務必保留此出處http://zero01.blog.51cto.com/12831981/1979158

Servlet生命周期與HTTP協議