web容器解析
目錄:
- 簡述web服務器功能
- web服務器的限制
- 輔助應用servlet
- web容器的作用
- web容器和web服務器的區別和聯系
一、簡述web服務器功能。
? ?web服務器主要作用是處理客戶請求,并作出響應。當瀏覽器發送一個HTTP請求到web服務器,web服務器解析請求,在內部做處理,返回一個HTTP響應給瀏覽器,瀏覽器解析此響應,并作出相應動作(例如:顯示HTML頁面,展示圖片等等。)
? ?瀏覽器和web服務器之間主要是通過http協議來進行交互。這里我們暫不討論http協議,大家只需要知道它是一種網絡通信的規范就可以了。但請求流(http請求)和響應流(http響應)的一些關鍵要素我們是必須要知道的,因為這涉及到了前后端交互。
http請求的關鍵要素:
- 請求方法(get、post等)
- 資源請求路徑(URL)
- 請求參數
http響應的關鍵要素:
- 狀態碼(404、302等)
- 響應內容類型(text、html等)
- 響應內容(圖片、文本等)
二、web服務器的限制
? ?web服務器擅長提供靜態頁面。靜態頁面只是原封不動的呆在目錄中,服務器找到靜態頁面,并把它原封不動的傳回給客戶,每個客戶看到的東西都一樣。但如果想要提供動態頁面和動態數據,例如,淘寶網站中實時更新的商品,不同用戶中購物車中的商品,在結算后寫入數據庫的數據等等。web服務器就顯得有些力不從心了,這時就需要一個輔助應用,能夠生成動態頁面,而且這個應用能與web服務器通信,并且能夠和后端java語言進行交互,從而從數據庫存取數據。這個輔助應用就是servlet。
三、輔助應用servlet
? ?servlet是sun公司提供的一門用于開發動態web資源的技術,我們一般把實現了servlet接口的java類也稱之為servlet。在MVC設計模式中,servlet扮演著C(控制器)的角色,當客戶請求到來,進入到servlet,servlet調用M(業務邏輯)從數據庫中存取數據,并返回頁面或參數給瀏覽器。
? ?但servlet也需要幫助。當請求到來時,必須有人加載、初始化和實例化Servlet,或者創建或分配一個新的線程處理這個請求,調用servlet的doGet()、doPost()方法。并需要有人創建servlet必須的參數HTTPServletRequest和HTTPServletResponse。當請求處理結束后,有人銷毀servlet,管理著servlet的生命周期。這個人就是web容器。
四、web容器
? ?servlet沒有main()方法,它們受控于另一個Java應用,這個Java應用稱為容器。
? ?Tomcat就是這樣一個容器,如果web服務器應用(如Apache)得到一個指向某servlet的請求(而不是其他請求,如請求一個普通的靜態頁面),此時服務器不是把這個請求交給servlet本身,而是交給部署該servlet的容器,要由容器向servlet提供HTTP請求和響應,而且要由容器調用servlet的方法,如doGet()和doPost()。
容器能提供什么?
(1) 通信支持
? ?利用容器提供的方法,你能輕松地讓servlet與web服務器對話。無需自己建立ServerSocket、監聽端口、創建流等等。容器知道自己與web服務器之間的協議,所以你的servlet不必擔心web服務器(Apache)和你自己的web代碼之間的API。你要考慮的只是如何在servlet中實現業務邏輯。
(2)生命周期管理
? ?容器控制著servlet的生與死。它會負責加載類、實例化和初始化servlet、調用servlet方法、并使servlet對象能夠被垃圾回收。有了容器的控制,你就不必考慮太多的資源管理了。
(3)多線程支持
? ?容器會自動為它接受的每個servlet創建一個新的線程。針對客戶的請求,如果servlet已經運行完相應的HTTP服務方法,這個線程就會結束(也就是會死掉)。這并不是說不用考慮線程安全性,還是會遇到同步問題的。不過,由服務器創建和管理多個線程來處理多個請求,這樣確實能讓你少做很多工作。
(4)聲明方式實現安全
? ?利用容器,可以使用xml部署描述文件來配置(和修改)安全性,而不必將其硬編碼寫到servlet(或其他類代碼中)。不用去修改你的java源文件,也不用重新編譯,你就能管理和修改安全性配置。
(5)JSP支持
? ?JSP能提供動態頁面,jsp會被翻譯為java代碼,寫入到響應流中,web服務將響應對象轉換為HTTP響應并返回給瀏覽器,瀏覽器解析HTTP響應,進而形成動態頁面。而web容器負責將jsp翻譯為java代碼。
容器如何處理請求?
如下圖所示:
圖解分析:
(1)用戶點擊一個鏈接,其URL指向一個servlet而不是靜態頁面。
(2)請求到達web服務器,web服務器識別該請求為servlet請求,將請求送到web容器。
(3)容器識別出該請求要的是一個servlet,所以容器創建2個對象HTTPServletRequest和HTTPServletResponse。
(4)容器根據請求中的URL找到正確的servlet,為這個請求創建或分配一個線程,并把請求對象和響應對象傳給這個線程。
(5)容器調用servlet的service()方法。根據請求的不同類型,service()會調用doGet()或doPost()方法。
(6)doGet()或doPost()方法生成動態頁面或數據,并把動態頁面或數據寫入到響應對象。
(7)線程結束,容器將響應對象轉換為一個HTTP響應,把它發回給瀏覽器,然后刪除請求和響應對象。
五、web容器和web服務器的區別和聯系
? ?我們常常將web容器和web服務器和概念和作用混合,對這2個應用總是很模糊。web容器(Tomcat)和web服務器(Apache)都可以作為一個獨立的應用。web服務器擅長處理HTTP服務,但它不能處理動態頁面并和數據庫進行交互。這些功能web容器都可以做到,但web容器沒有web服務器更擅長處理HTTP服務,所以常見的HTTPweb服務器應用經常會結合使用Apache和Tomcat,充分發揮2者的長處,Apache作為HTTPweb服務器,Tomcat作為web容器。這就是為什么我們下載的tomcat的全名為“ apache-tomcat-版本號 ”的原因所在。
總結
- 上一篇: python偶数数列求和_Numpy 斐
- 下一篇: 电脑桌面打开计算机打开多个,如何在电脑桌