Servlet定義的概述
Servlet是使用Java Servlet應(yīng)用程序設(shè)計接口及相關(guān)類和方法的Java程序。它在Web服務(wù)器上或應(yīng)用服務(wù)器上運(yùn)行并擴(kuò)展了該服務(wù)器的能力。Java Servlet對于Web服務(wù)器就好像Java Applet對于Web瀏覽器。Applet裝入Web瀏覽器并在Web瀏覽器內(nèi)執(zhí)行,而Servlet則是裝入Web服務(wù)器并在Web服務(wù)器內(nèi)執(zhí)行。 Java Servlet API 定義了Servlet和服務(wù)器之間的一個標(biāo)準(zhǔn)接口,這使得Servlet具有跨服務(wù)器平臺的特性。
Servlet通過創(chuàng)建一個框架擴(kuò)展服務(wù)器的能力,采用請求-響應(yīng)模式提供Web服務(wù)。當(dāng)客戶機(jī)發(fā)送請求至服務(wù)器時,服務(wù)器將請求信息發(fā)送給Servlet,Servlet生成響應(yīng)內(nèi)容并將其傳給Server,然后再由Server將響應(yīng)返回給客戶端。
Servlet的功能
Servlet的功能涉及范圍很廣。例如,Servlet可完成如下功能:
創(chuàng)建并返回一個包含基于客戶請求性質(zhì)的動態(tài)內(nèi)容的完整的 HTML頁面。
創(chuàng)建可嵌入到現(xiàn)有 HTML 頁面中的一部分 HTML 頁面(HTML 片段)。與其他服務(wù)器資源(文件、數(shù)據(jù)庫、Applet、Java應(yīng)用程序等)進(jìn)行通信。
用多個客戶機(jī)處理連接,接受多個客戶機(jī)的輸入,并將結(jié)果廣播到多個客戶機(jī)上。例如,Servlet 可以是多參與者的游戲服務(wù)器。
允許在單連接方式下傳送數(shù)據(jù)的情況下,在瀏覽器上打開服務(wù)器至Applet的新連接,并將該連接保持在打開狀態(tài)。允許客戶機(jī)和服務(wù)器簡單、高效地執(zhí)行會話的情況下,Applet也可以啟動客戶瀏覽器和服務(wù)器之間的連接??梢酝ㄟ^定制協(xié)議或標(biāo)準(zhǔn)(如 IIOP)進(jìn)行通信。
對特殊的處理采用 MIME 類型過濾數(shù)據(jù),例如圖像轉(zhuǎn)換和服務(wù)器端(包括SSI)。
將定制的處理提供給所有服務(wù)器的標(biāo)準(zhǔn)例行程序。例如,Servlet 可以修改如何認(rèn)證用戶。
Java Servlet與現(xiàn)有網(wǎng)絡(luò)技術(shù)的差別
那么Java Servlet與一些現(xiàn)有的網(wǎng)絡(luò)技術(shù)有什么具體的差別呢?
Java Servlet與Applet之間的差別 從基本上來說,Servlet與 Applet 是截然相反的。Servlet可以被視為服務(wù)器方面的 Applet。Servlet在網(wǎng)絡(luò)服務(wù)器內(nèi)運(yùn)行而Applet在網(wǎng)絡(luò)瀏覽器內(nèi)運(yùn)行。瀏覽器提交一個請求執(zhí)行Servlet的命令;而由于瀏覽器可直接命令A(yù)pplet,所以它可以在運(yùn)行時單機(jī)運(yùn)行。
Java Servlet與CGI之間的差別 與傳統(tǒng)的CGI和許多其他類似CGI的技術(shù)相比,Java Servlet具有更高的效率,更容易使用,功能更強(qiáng)大,具有更好的可移植性,更節(jié)省投資。其中最大的區(qū)別是在性能方面。
在傳統(tǒng)的CGI中,每個請求都要啟動一個新的進(jìn)程,如果CGI程序本身的執(zhí)行時間較短,啟動進(jìn)程所需要的開銷很可能反而超過實際執(zhí)行時間。而使用 Servlet時,服務(wù)器上僅有一個Java虛擬機(jī)在運(yùn)行,只有當(dāng)Servlet被調(diào)用時,它才被加載,且直到Servlet更改時,它才會被再次加載。在傳統(tǒng)CGI中,如果有N個并發(fā)的對同一CGI程序的請求,則該CGI程序的代碼在內(nèi)存中重復(fù)裝載了N次;而對于Servlet,處理請求的是N個線程,只需要一份Servlet類代碼。在性能優(yōu)化方面,Servlet也比CGI有著更多的選擇,比如緩沖以前的計算結(jié)果,保持?jǐn)?shù)據(jù)庫連接的活動,等等。
通過使用Servlet API,開發(fā)人員不必?fù)?dān)心服務(wù)器的內(nèi)部運(yùn)作方式。表格資料、服務(wù)器頭、cookies等皆可通過Servlet處理。另外,因為Servlet是用 Java寫的,能將其從一個服務(wù)器移到另一個服務(wù)器以供發(fā)布,同時不必?fù)?dān)心操作系統(tǒng)或服務(wù)器的類型。這一優(yōu)點(diǎn)充分體現(xiàn)了Java"一次編寫,隨處運(yùn)行"的優(yōu)越特性。
Servlet定義的生命周期
Servlet定義的生命周期講述了一個Servlet如何被加載、初始化,以及它怎樣接收請求、響應(yīng)請求、提供服務(wù)。
在代碼中,Servlet生命周期由接口javax.servlet.Servlet定義。所有的Java Servlet 必須直接或間接地實現(xiàn)javax.servlet.Servlet接口,這樣才能在Servlet Engine上運(yùn)行。
Servlet Engine提供network Service,響應(yīng)MIME request,運(yùn)行Servlet Container。 javax.servlet.Servlet接口定義了一些方法,在Servlet 的生命周期中,這些方法會在特定時間按照一定的順序被調(diào)用。
Servlet定義之如何被加載(Load)、被實例化(Instantiated)
Servlet Engine 負(fù)責(zé)實例化和加載Servlet,這個過程可以在Servlet Engine 加載時執(zhí)行,可以在Servlet 響應(yīng)請求時執(zhí)行,也可以在兩者之間的任何時候執(zhí)行。
Servlet如何被初始化(Initialized)
Servlet Engine 加載好Servlet 后,必須要初始化它。初始化時Servlet 可以從數(shù)據(jù)庫里讀取初始數(shù)據(jù),建立JDBC Connection,或者建立對其他有價值的資源的引用。
在初始化階段,Init( )方法被調(diào)用。這個方法在javax.servlet.Serlet接口中定義。Init( )方法以一個Servlet 配置文件(ServletConfig 型)為參數(shù)。Servlet configuration 對象由Servlet Engine 實現(xiàn),可以讓Servlet 從中讀取一些name-value對的參數(shù)值。ServletConfig對象還可以讓Servlet接受一個Servlet Context對象。
Servlet 如何處理請求
Servlet 被初始化以后,就處于能響應(yīng)請求的就緒狀態(tài)。每個對Servlet 的請求由一個Servlet Request 對象代表。Servlet 給客戶端的響應(yīng)由一個Servlet Response對象代表。當(dāng)客戶端有一個請求時,Servlet Engine 將ServletRequest 和ServletResponse對象都轉(zhuǎn)發(fā)給Servlet,這兩個對象以參數(shù)的形式傳給Service方法。這個方法由 javax.servlet.Servlet定義并由具體的Servlet 實現(xiàn)。
Servlet還可以實現(xiàn) ServletRequest 和ServletResponse接口。ServletRequest接口可以讓Servlet 獲取客戶端請求中的參數(shù),如form data、request信息、協(xié)議類型,等等。Servlet 可以從ServletInputStream流中讀取request 數(shù)據(jù)。ServletResponse接口允許Servlet設(shè)置response headers和status codes。實現(xiàn)這個接口可以使Servlet能訪問ServletOutputStream流用來向客戶端返回數(shù)據(jù)。
Servlet如何被釋放
Servlet Engine 沒有必要在Servlet定義的生命周期的每一段時間內(nèi)都保持Servlet的狀態(tài)。Servlet Engine可以隨時隨意使用或釋放Servlet。因此,你不能依賴Servlet class或其成員存儲信息。當(dāng)Servlet Engine判斷一個Servlet應(yīng)當(dāng)被釋放時(比如說Engine準(zhǔn)備Shut down 或需要回收資源),Engine必須讓Servlet 能釋放其正在使用的任何資源,并保存持續(xù)性的狀態(tài)信息。這些可以通過調(diào)用Servlet的destroy方法實現(xiàn)。 在Servlet Engine 釋放一個Servlet 以前,必須讓其完成當(dāng)前實例的service方法或是等到timeout(如果Engine定義了timeout)。當(dāng)Engine釋放一個 Servlet以后,Engine將不能再將請求轉(zhuǎn)發(fā)給它,Engine必須徹底釋放該Servlet并將其標(biāo)明為可回收的(給garbage collection)。
在Servlet API中最重要的是Servlet interface。所有的Servlets執(zhí)行這個interface的方式有很多種:或者是直接的,或者通過extending這個class執(zhí)行它,如 HttpServlet。這個Servlet interface 提供并安排Servlet與客戶端聯(lián)系的方法。Servlet 編寫者可以在他們開發(fā)Servlet程序時提供更多一些或所有這樣的方法。
當(dāng)一個Servlet接收來自客戶端的調(diào)用請求時,它接收兩個對象:一個是ServletRequest,另外一個是ServletResponse。這個ServletRequest class 概括從客戶端到服務(wù)器之間的聯(lián)系,而 ServletResponse class 概括從Servlet返回客戶端的聯(lián)系。
ServletRequest interface 可以獲取到這樣一些信息,如由客戶端傳送的參數(shù)名稱,客戶端正在使用的協(xié)議,產(chǎn)生請求并且接收請求的服務(wù)器遠(yuǎn)端主機(jī)名。它也提供獲取數(shù)據(jù)流的 Servlet、ServletInputStream,這些數(shù)據(jù)是客戶端引用中使用HTTP POST和PUT方法遞交的。一個ServletRequest的子類可以讓Servlet獲取更多的協(xié)議特性數(shù)據(jù)。
例如,HttpServletRequest 包含獲取HTTP-specific頭部信息的方法。ServletResponse interface 給出相應(yīng)客戶端的Servlet方法。它允許Servlet設(shè)置內(nèi)容長度和回應(yīng)的MIME類型,并且提供輸出流ServletOutputStream,通過編寫者可以發(fā)回相應(yīng)數(shù)據(jù)。ServletResponse子類可以給出更多protocol-specific容量的信息。例如,HttpServletResponse 包含允許Servlet操作HTTP-specific頭部信息的方法。
上面有關(guān)classes 和 interfaces的描述構(gòu)成了一個基本的Servlet框架。HTTP Servlets有一些附加的可以提供session-tracking capabilities的方法。Servlet編寫者可以用這些API在有他人操作時維護(hù)Servlet與客戶端之間的狀態(tài)。
以上就是Servlet定義相關(guān)的一些簡介,希望對你有所幫助。
【編輯推薦】
- 什么是Servlet以及常用Servlet API有哪些
- JSP Servlet實例之自動跳轉(zhuǎn)到出錯頁
- 優(yōu)化JSP Servlet應(yīng)用程序八點(diǎn)雜談
- JSP開發(fā)中Servlet之導(dǎo)入事件驅(qū)動技術(shù)
- 什么是JSP以及和Servlet的比較