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