Servlet 為創(chuàng)建基于 web 的應(yīng)用程序提供了基于組件、獨(dú)立于平臺(tái)的方法,可以不受 CGI 程序的性能限制。Servlet 有權(quán)限訪問所有的 Java API,包括訪問企業(yè)級(jí)數(shù)據(jù)庫(kù)的 JDBC API。
本教程將講解如何使用 Java Servlet 來(lái)開發(fā)基于 web 的應(yīng)用程序。
Servlet是什么?
Java Servlet 是運(yùn)行在 Web 服務(wù)器或應(yīng)用服務(wù)器上的程序,它是作為來(lái)自 Web 瀏覽器或其他 HTTP 客戶端的請(qǐng)求和 HTTP 服務(wù)器上的數(shù)據(jù)庫(kù)或應(yīng)用程序之間的中間層。
使用 Servlet,您可以收集來(lái)自網(wǎng)頁(yè)表單的用戶輸入,呈現(xiàn)來(lái)自數(shù)據(jù)庫(kù)或者其他源的記錄,還可以動(dòng)態(tài)創(chuàng)建網(wǎng)頁(yè)。
Java Servlet 通常情況下與使用 CGI(Common Gateway Interface,公共網(wǎng)關(guān)接口)實(shí)現(xiàn)的程序可以達(dá)到異曲同工的效果。但是相比于 CGI,Servlet 有以下幾點(diǎn)優(yōu)勢(shì):
• 性能明顯更好。
• Servlet 在 Web 服務(wù)器的地址空間內(nèi)執(zhí)行。這樣它就沒有必要再創(chuàng)建一個(gè)單獨(dú)的進(jìn)程來(lái)處理每個(gè)客戶端請(qǐng)求。
• Servlet 是獨(dú)立于平臺(tái)的,因?yàn)樗鼈兪怯?Java 編寫的。
• 服務(wù)器上的 Java 安全管理器執(zhí)行了一系列限制,以保護(hù)服務(wù)器計(jì)算機(jī)上的資源。因此,Servlet 是可信的。
• Java 類庫(kù)的全部功能對(duì) Servlet 來(lái)說都是可用的。它可以通過 sockets 和 RMI 機(jī)制與 applets、數(shù)據(jù)庫(kù)或其他軟件進(jìn)行交互。
Servlet 架構(gòu)
下圖顯示了 Servlet 在 Web 應(yīng)用程序中的位置。
Servlet 任務(wù)
Servlet 執(zhí)行以下主要任務(wù):
• 讀取客戶端(瀏覽器)發(fā)送的顯式的數(shù)據(jù)。這包括網(wǎng)頁(yè)上的 HTML 表單,或者也可以是來(lái)自 applet 或自定義的 HTTP 客戶端程序的表單。
• 讀取客戶端(瀏覽器)發(fā)送的隱式的 HTTP 請(qǐng)求數(shù)據(jù)。這包括 cookies、媒體類型和瀏覽器能理解的壓縮格式等等。
• 處理數(shù)據(jù)并生成結(jié)果。這個(gè)過程可能需要訪問數(shù)據(jù)庫(kù),執(zhí)行 RMI 或 CORBA 調(diào)用,調(diào)用 Web 服務(wù),或者直接計(jì)算得出對(duì)應(yīng)的響應(yīng)。
• 發(fā)送顯式的數(shù)據(jù)(即文檔)到客戶端(瀏覽器)。該文檔的格式可以是多種多樣的,包括文本文件(HTML 或 XML)、二進(jìn)制文件(GIF 圖像)、Excel 等。
• 發(fā)送隱式的 HTTP 響應(yīng)到客戶端(瀏覽器)。這包括告訴瀏覽器或其他客戶端被返回的文檔類型(例如 HTML),設(shè)置 cookies 和緩存參數(shù),以及其他類似的任務(wù)。
Servlet 包
Java Servlet 是運(yùn)行在帶有支持 Java Servlet 規(guī)范的解釋器的 web 服務(wù)器上的 Java 類。
Servlet 可以使用 javax.servlet 和 javax.servlet.http 包創(chuàng)建,它是 Java 企業(yè)版的標(biāo)準(zhǔn)組成部分,Java 企業(yè)版是支持大型開發(fā)項(xiàng)目的 Java 類庫(kù)的擴(kuò)展版本。
這些類實(shí)現(xiàn) Java Servlet 和 JSP 規(guī)范。在寫本教程的時(shí)候,二者相應(yīng)的版本分別是 Java Servlet 2.5 和 JSP 2.1。
Java Servlet 就像任何其他的 Java 類一樣已經(jīng)被創(chuàng)建和編譯。在您安裝 Servlet 包并把它們添加到您的計(jì)算機(jī)上的 Classpath 類路徑中之后,您就可以通過 JDK 的 Java 編譯器或任何其他編譯器來(lái)編譯 Servlet。