什麼是http,什麼是tomcat,什麼是Servlet

為了不讓網路程式設計在自己看來是一個黑盒子
在學習tomcat和servlet,jsp之前,需要了解這些

一、tomcat是一個封裝和實現了http傳輸協議的容器,那麼http是什麼?

http全稱是超文字傳輸協議
即是指從全球資訊網伺服器端(http server端)傳送超文字到本地瀏覽器的協議
它是基於安全連線tcp/ip協議產生的
所謂超文字傳輸,傳輸的即是html/css/js視覺化前端程式碼

  1. http的特點

    socket是在底層封裝了tcp/ip協議的java類
    http也是基於tcp/ip協議的傳輸協議
    如果嘗試在socket中開啟一個埠並等待,獲取socket後輸出這個socket物件通過字元流獲取的請求,然後再在瀏覽器中輸入127.0.0.1:portNum 會發現在控制檯中輸出了當前瀏覽器的配置資訊,客戶端ip地址等
    簡單的說,socket和http都是封裝了ip/tcp協議,在使用時不需要去在意那些從物理層到網路層等的實現(TTL包頭等),只需要進行業務資料的處理即可
    那麼http協議的三個特點,可以結合socket類的執行機制進行理解
    

    A.無連線
    結合socket進行理解,socket分為serversocket和socket,前者是伺服器端的tcp介面,socket進行資料收發是監聽機制,即伺服器端的serversocket建立好了以後,會開放一個埠進行監聽
    它的傳輸是通過流進行傳輸的,客戶端socket封裝了一個輸入流一個輸出流,伺服器端serversocket封裝了一個輸入流和一個輸出流,兩個流建立連線後,AtoB,BtoA進行訊息傳送,但是如果!如果在一次請求和迴應之後關閉當前的流,會導致獲取了一個socket請求就將當前監聽埠關閉了
    可以理解為http沒有對資料進行迴圈監聽和定時重新整理驗證的機制

    http大概是同理的,它每一次在載入頁面,或者說獲取超文字資料時,沒有一個登陸狀態或者說沒有一個定時重新整理的機制向服務端請求重新整理當前的資料,超文字資料獲取了就獲取,如果需要對頁面的內容進行變更,需要再次根據url/ajax等再次進行請求
    這裡寫圖片描述

    B.http是媒體獨立的
    只要客戶端知道如何進行資料處理,理論上可以接受任何形式的資料,這個很好理解,在socket中,傳輸的媒介 是通過流實現的,流分很多種,但究其本質都是位元組流的包裝,傳輸資料時本身肯定還是以位元組為單位的

    C.http是無狀態的
    這一點其實有一點重複,是根據第一點引申出來的,你每一次通訊都要重新建立連線,傳輸過來的超文字對於客戶來說是可修改的透明的,每一次獲取資料都要重新傳送請求,那自然是無狀態,

    從這裡大概可以猜測到比如網路遊戲這一類需要保持連線的架構了,tcp/ip可以做成長連線,也可以做成短連線,但是長連線應該也是重複重新整理的短連線吧,只要遵循tcp的長連線協議就可以保持登入狀態,比如諸如java等語言對於長連線就封裝了一個類來簡單實現

    還有一個有趣的事是作為客戶端向伺服器端傳送時,每次傳送的埠都不同,並且都是50000

  2. http報文格式

    這是http請求報文格式
    

    這裡寫圖片描述
    這是伺服器響應訊息格式
    這裡寫圖片描述
    下面是我通過瀏覽器向socket傳送url連結請求獲取的Http請求頭
    這裡寫圖片描述

二. 什麼是tomcat

一般的B/S架構web工程結構為下圖:
這裡寫圖片描述
CGI(Common Gateway Interface) 是WWW技術中最重要的技術之一,有著不可替代的重要地位。CGI是外部應用程式(CGI程式)與WEB伺服器之間的介面標準,是在CGI程式和Web伺服器之間傳遞資訊的過程。(摘自百度百科)

可不可以說Tomcat就是實現了CGI介面的web應用開發的容器?

再直白一點,既然socket可以返回響應,那就也可以向客戶端返回一個伺服器相應的資料包,並且將業務需要的超文字內容放到其中,然後傳輸完成一次關一次流實現無連線雙工通訊。那麼我也能做到B/S互動(事實上已經試驗成功了)

但是這樣做很麻煩,更何況在http1.1協議下,還需要考慮到安全問題對不同的請求進行不同的回覆和內容細分,比如Get請求傳送過來,總不可能瞎回一個POST請求的資料包吧,還有一個web專案的基礎邏輯也需要遵守
等等

這些內容就放到tomcat裡面自行給我們封裝好了,並且還將請求和迴應按照業務劃分成了GET/POST等方法,但是其本質(無連線的雙工TCP/IP通訊)是不變的!

這是tomcat的檔案結構
這裡寫圖片描述

tomcat除了實現了http協議以外,
還針對javaweb專案做了很多業務優化,簡單的說就是可以更好的管理java專案
比如
通過war包對工程jar包進行二次封裝,區分公用lib檔案和私有lib檔案,多專案開發管理,JAVAWEB日誌處理
等等

三、什麼是Servlet

Servlet是一個獨立的開發標準,不是強耦合在Tomcat中的jar包

JAVAEE是一個針對JAVA開發的B/S架構專案的框架,簡單的說是一個jar包
servlet是其中的一個介面,業務定義為用來處理一部分頁面業務同時也是作為service層和前端html頁面互動的橋樑

其中包含的方法包括servlet生命週期,service服務,獲取servlet配置資訊
繼承關係

GenericServlet抽象類繼承了Servlet介面
實現了除Service()以外的方法
HTTPServlet繼承了GenericServlet抽象類
將Service()方法細分為了doGet(),doPost(),doHead(),doPull()方法
不過除了doGet()和doPost(),其它幾個和實現B/S互動業務不太相關