自從計算機軟件開發進入網絡時代就開始涉及到通訊問題在客戶/服務器(也叫C/S應用)時期每個軟件都有自己的客戶端和服務器端軟件並且客戶端和服務器端之間的通訊協議差別也很大後來隨著互聯網的發展基於浏覽器/服務器的應用逐漸成為主流通訊協議也統一到HTTP協議但是在HTTP協議之上如何處理來自客戶端的請求信息以及如何對請求進行回應則經歷了很長時間也沒有統一下來目前對於這個問題的解決方案主要有兩種一個是CGI另一個是Servlet
CGI(Common Gateway Interface)通用網關接口
通用網關接口簡稱CGI是一種根據請求信息動態產生回應內容的技術通過CGIWeb 服務器可以將根據請求不同啟動不同的外部程序並將請求內容轉發給該程序在程序執行結束後將執行結果作為回應返回給客戶端也就是說對於每個請求都要產生一個新的進程進行處理因為每個進程都會占有很多服務器的資源和時間這就導致服務器無法同時處理很多的並發請求另外CGI程序都是與操作系統平台相關的雖然在互聯網爆發的初期CGI為開發互聯網應用做出了很大的貢獻但是隨著技術的發展開始逐漸衰落
Servlet
Servlet最初是在年由James Gosling 提出的因為使用該技術需要復雜的Web服務器支持所以當時並沒有得到重視也就放棄了後來隨著Web應用復雜度的提升並要求提供更高的並發處理能力Servlet被重新撿起並在Java平台上得到實現現在提起Servlet指的都是Java ServletJava Servlet要求必須運行在Web服務器當中與Web服務器之間屬於分工和互補關系確切的說在實際運行的時候Java Servlet與Web服務器會融為一體如同一個程序一樣運行在同一個Java虛擬機(JVM)當中與CGI不同的是Servlet對每個請求都是單獨啟動一個線程而不是進程這種處理方式大幅度地降低了系統裡的進程數量提高了系統的並發處理能力另外因為Java Servlet是運行在虛擬機之上的也就解決了跨平台問題如果沒有Servlet的出現也就沒有互聯網的今天
在Servlet出現之後隨著使用范圍的擴大人們發現了它的一個很大的一個弊端那就是為了能夠輸出HTML格式內容需要編寫大量重復代碼造成不必要的重復勞動為了解決這個問題基於Servlet技術產生了JavaServet Pages技術也就是JSPServlet和JSP兩者分工協作Servlet側重於解決運算和業務邏輯問題JSP則側重於解決展示問題Servlet與JSP一起為Web應用開發帶來了巨大的貢獻後來出現的眾多Java Web應用開發框架都是基於這兩種技術的更確切的說都是基於Servlet技術的
Java Servlet與Web容器之間的關系
Java是一種動態加載和運行的語言也就是說當應用程序持有一個類的地址(CLASSPATH)和名稱(包名和類名)的情況下可以在程序運行期間任何時候加載這個類並創建和使用該類的對象Servlet就是基於這個機制與Web容器融合在一起的目前已知的所有支持Java Servlet的Web容器都是采用Java開發的當Web容器接收到來自客戶端的請求信息之後會根據URL中的Web元件地址信息到Servlet隊列中查找對應的Servlet對象如果找到則直接使用如果沒有找到則加載對應的類並創建對象也就是說Servlet對象是在第一次被使用的時候才創建的並且一旦創建就會被反復使用不再創建新的對象所有創建出的Servlet對象會在Web服務器停止運行的時候統一進行垃圾回收
為了解決客戶端請求地址與Java Servlet之間對應關系問題Web容器需要一個用來描述這種對應關系的文件一般是webxml文件如果一個Web應用程序中存在很多個Servlet那麼webxml會變得非常龐大在Servlet 規范推出之後允許在Servlet代碼中使用聲明式語法來代替webxml中的描述信息這才讓webxml瘦身下來下圖是這個過程的一個示意圖
在這個圖中我們僅僅是概要的采用以比較容易理解的方式描述了Web容器與Servlet之間的關系以及當接受到請求之後的處理流程在實際的Web容器中會比這要復雜很多
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26848.html