servlet、servlet容器和web容器

Java Servlet(Java服務器小程序)是一個基於Java技術的Web組件,運行在服務器端,它由Servlet容器所管理,用於生成動態的內容。 Servlet是平臺獨立的Java類,編寫一個Servlet,實際上就是按照Servlet規範編寫一個Java類。Servlet被編譯爲平臺獨立 的字節碼,可以被動態地加載到支持Java技術的Web服務器中運行。
Servlet容器也叫做Servlet引擎,是Web服務器或應用程序服務器的一部分,用於在發送的請求和響應之上提供網絡服務,解碼基於 MIME的請求,格式化基於MIME的響應。Servlet沒有main方法,不能獨立運行,它必須被部署到Servlet容器中,由容器來實例化和調用 Servlet的方法(如doGet()和doPost()),Servlet容器在Servlet的生命週期內包容和管理Servlet。在JSP技術 推出後,管理和運行Servlet/JSP的容器也稱爲Web容器。

自從計算機軟件開發進入網絡時代,就開始涉及到通訊問題。在客戶/服務器(也叫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服務器與Web應用層屬於不容兩個範疇,爲了讓他們兩寫作,首先應用中介方當制定Web應用與Web服務器進行協作的標準接口,Servlet就是其中一個主要的協議、接口。

Web應用與Web服務器進行協作的一系列標準Java接口,統稱Java Servlet API。另外還有一些Servlet規範。Servlet規範把能夠與發佈和運行Java Web應用容器的Web服務器稱爲Servlet容器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章