1、初始web
最初知道網站是用html寫的,靜態的,會動的那個顯示效果,內容徹底沒變,只是有時候移動了,有時候隱藏了。
這個時候,我認爲:
瀏覽器是一個html的解釋器和http的解釋器的合體。
服務器是一個接收http請求,並能夠根據請求中指定的文件(不管是地址欄寫的,仍是超連接發送的)找到服務器對應的文件,把文件中的內容以http的格式返回給瀏覽器。html
不過據說表單是能夠提交給後臺處理的,也就是內容能夠根據人工輸入而改變的。可是這個過程一直不知道是什麼樣。java
2、java的動態網站
後來學習了java,知道用tomcat和jsp/servlet就能夠實現動態交互的網站,好比提交個表單,後臺處理一下,而後返回一個結果。可是文件不是html了,而jsp了,或者直接後臺的java類了,既然瀏覽器沒有變,那麼後臺返回的內容必定仍是html格式的內容,不管是jsp仍是servlet都是須要tomcat(或者apache+tomcat等)翻譯成html格式的靜態文件。其中tomcat能夠內部劃分爲web服務器和應用服務器(即j2ee的容器)。web
那麼流程大概是這樣的:
一、瀏覽器請求一個地址,
二、web服務器經過地址的格式判斷,若是後綴是html等靜態文件就直接返回文件內容,
三、若是後綴是jsp就發送給應用服務器處理,容器會將相應的jsp文件翻譯爲servlet(即java類),
四、若是後綴是其餘很是規靜態文件和jsp,那麼也會發送給容器,容器檢查web.xml中的servlet定義是否包含了這個路徑,若是有則調用相應的servlet,
五、調用servlet以前,容器會在啓動時進行一系列j2ee規範中的session-config、context-param,welcom-file-list等預處理來準備提供服務,接收請求以前會運行listener,filter等對請求作預處理,這些都不是本文要關心的。
六、終於在第3或第4步等待這麼久的servlet要處理了,web服務器傳給容器的地址,就好像一個標準輸入的文本,容器監聽程序讀取地址,而後解析對應的類,並嘗試調用類的對象。容器管理全部servlet對象的生命週期,對象保存在容器中重複使用,容器根據註冊在web.xml中的類尋找對象,若是沒有,則會建立一個該類的對象並運行其init方法,當有請求時,調用對象的service方法。並將servlet的輸出流(HttpServletResponse.getWriter())做爲返回的結果,而且徹底按照html格式輸出。
七、容器將結果返回給瀏覽器,瀏覽器解析http報文,解釋html文件,顯示。apache
3、cgi是什麼
除了java以外,還有不少語言均可以作動態網站,好比asp、.net,雖然只看過一眼,猜測大概和java的相似,有本身的容器負責處理。可是其餘語言貌似都是用cgi實現,那麼cgi是什麼,雖然百度(鄙視我吧)了一下定義,徹底沒搞清楚,繼續找吧。沒有寫過cgi,只能順藤摸瓜的半猜半看了。
cgi實際上是一套web服務器和各類語言通訊的協議,Common Gateway Interface通用網關接口,其實web服務器須要通訊的東西很少。
一、主要是告訴後臺程序,傳了什麼參數過來(除了用戶手工填寫的參數,還有瀏覽器相關、http協議相關的一些參數),後臺程序若是經過主程序參數傳入很是不通用並且複雜,因此cgi規定了一套環境變量,讓http請求的相關參數所有存在環境變量中,那麼全部後臺語言均可以引用環境變量的參數值。
二、解決了傳參問題,那麼就是如何運行了,在apache(web服務器)中,能夠在httpd.conf中配置程序執行器,例如perl語言就用perl.exe(windows中),web服務器會用瀏覽器請求的地址生成本地文件的路徑,做爲perl.exe的運行參數。固然若是命令行須要其餘的參數,也能夠在web服務器中配置。
三、執行完後,後臺程序輸出到標準輸出流的結果會被web服務器捕獲(固然也是html格式的),封裝成http包發送給瀏覽器。
四、瀏覽器解析顯示。windows
能夠看出,cgi每次請求都從新執行後臺程序的解析工做,進程不像java同樣在容器中能夠重複利用。有個叫fastcgi的就是解決這個問題的,它是一個進程管理器,讓進程能重複利用。瀏覽器