程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> 深入理解Java Servlet與Web容器之間的關系

深入理解Java Servlet與Web容器之間的關系

編輯:J2EE

【51CTO特稿】自從計算機軟件開發進入網絡時代,就開始涉及到通訊問題。在客戶/服務器(也叫C/S應用)時期,每個軟件都有自己的客戶端和服務器端軟件。並且客戶端和服務器端之間的通訊協議差別也很大。後來隨著互聯網的發展,基於浏覽器/服務器的應用逐漸成為主流,通訊協議也統一到HTTP協議。但是,在HTTP協議之上,如何處理來自客戶端的請求信息,以及如何對請求進行回應,則經歷了很長時間也沒有統一下來。目前,對於這個問題的解決方案主要有兩種,一個是CGI,另一個是Servlet。

CGI(Common Gateway Interface),通用網關接口

通用網關接口,簡稱CGI,是一種根據請求信息動態產生回應內容的技術。通過CGI,Web 服務器可以將根據請求不同啟動不同的外部程序,並將請求內容轉發給該程序,在程序執行結束後,將執行結果作為回應返回給客戶端。也就是說,對於每個請求,都要產生一個新的進程進行處理。因為每個進程都會占有很多服務器的資源和時間,這就導致服務器無法同時處理很多的並發請求。另外CGI程序都是與操作系統平台相關的,雖然在互聯網爆發的初期,CGI為開發互聯網應用做出了很大的貢獻,但是隨著技術的發展,開始逐漸衰落。

Servlet

Servlet最初是在1995年由James Gosling 提出的,因為使用該技術需要復雜的Web服務器支持,所以當時並沒有得到重視,也就放棄了。後來隨著Web應用復雜度的提升,並要求提供更高的並發處理能力,Servlet被重新撿起,並在Java平台上得到實現,現在提起Servlet,指的都是Java Servlet。Java Servlet要求必須運行在Web服務器當中,與Web服務器之間屬於分工和互補關系。確切的說,在實際運行的時候Java Servlet與Web服務器會融為一體,如同一個程序一樣運行在同一個Java虛擬機(JVM)當中。與CGI不同的是,Servlet對每個請求都是單獨啟動一個線程,而不是進程。這種處理方式大幅度地降低了系統裡的進程數量,提高了系統的並發處理能力。另外因為Java Servlet是運行在虛擬機之上的,也就解決了跨平台問題。如果沒有Servlet的出現,也就沒有互聯網的今天。
在Servlet出現之後,隨著使用范圍的擴大,人們發現了它的一個很大的一個弊端。那就是為了能夠輸出Html格式內容,需要編寫大量重復代碼,造成不必要的重復勞動。為了解決這個問題,基於Servlet技術產生了JavaServet Pages技術,也就是JSP。Servlet和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容器需要一個用來描述這種對應關系的文件,一般是web.xml文件。如果一個Web應用程序中存在很多個Servlet,那麼web.xml會變得非常龐大。在Servlet 3.0規范推出之後,允許在Servlet代碼中使用聲明式語法來代替web.xml中的描述信息,這才讓web.XML瘦身下來。下圖是這個過程的一個示意圖。

在這個圖中,我們僅僅是概要的,采用以比較容易理解的方式描述了Web容器與Servlet之間的關系,以及當接

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved