Java編程中Servlet簡(jiǎn)介與常用方法 - Java中文網(wǎng)編輯整理(http://www.javaweb.cc/)
一、概述
Servlet是一種獨立于平臺和協(xié)議的服務(wù)器端的Java應用程序,可以生成動(dòng)態(tài)的Web頁(yè)面。
Servlet是位于Web 服務(wù)器內部的服務(wù)器端的Java應用程序,與傳統的從命令行啟動(dòng)的Java應用程序不同,Servlet由Web服務(wù)器進(jìn)行加載,該Web服務(wù)器必須包含支持Servlet的Java虛擬機。
Java Servlet 與Applet 的比較:
相似之處:
* 它們不是獨立的應用程序,沒(méi)有main()方法。
* 它們不是由用戶(hù)或程序員調用,而是由另外一個(gè)應用程序(容器)調用。
* 它們都有一個(gè)生存周期,包含init()和destroy()方法。
不同之處:
* Applet具有很好的圖形界面(AWT),與瀏覽器一起,在客戶(hù)端運行。
* Servlet 則沒(méi)有圖形界面,運行在服務(wù)器端。
Java Servlet 與 CGI(Common Gateway Interface) 的比較:
與傳統的CGI和許多其他類(lèi)似CGI的技術(shù)相比,Java Servlet具有更高的效率,更容易使用,功能更強大,具有更好的可移植性,更節省投資。在未來(lái)的技術(shù)發(fā)展過(guò)程中,Servlet有可能徹底取代 CGI。
* 高效
在傳統的CGI中,每個(gè)請求都要啟動(dòng)一個(gè)新的進(jìn)程,如果CGI程序本身的執行時(shí)間較短,啟動(dòng)進(jìn)程所需要的開(kāi)銷(xiāo)很可能反而超過(guò)實(shí)際執行時(shí)間。而在 Servlet中,每個(gè)請求由一個(gè)輕量級的Java線(xiàn)程處理(而不是重量級的操作系統進(jìn)程)。
在傳統CGI中,如果有N個(gè)并發(fā)的對同一CGI程序的請求,則該CGI程序的代碼在內存中重復裝載了N次;而對于Servlet,處理請求的是N個(gè)線(xiàn) 程,只需要一份Servlet類(lèi)代碼。在性能優(yōu)化方面,Servlet也比CGI有著(zhù)更多的選擇。
* 方便
Servlet提供了大量的實(shí)用工具例程,例如自動(dòng)地解析和解碼HTML表單數據、讀取和設置HTTP頭、處理Cookie、跟蹤會(huì )話(huà)狀態(tài)等。
* 功能強大
在Servlet中,許多使用傳統CGI程序很難完成的任務(wù)都可以輕松地完成。例如,Servlet能夠直接和Web服務(wù)器交互,而普通的CGI程序 不能。Servlet還能夠在各個(gè)程序之間共享數據,使得數據庫連接池之類(lèi)的功能很容易實(shí)現。
* 可移植性好
Servlet用Java編寫(xiě),Servlet API具有完善的標準。因此,為IPlanet EnterpriseServer寫(xiě)的Servlet無(wú)需任何實(shí)質(zhì)上的改動(dòng)即可移植到Apache、MicrosoftIIS或者WebStar。幾乎所有的主流服務(wù)器都直接或通過(guò)插件支持Servlet。
* 節省投資
不僅有許多廉價(jià)甚至免費的Web服務(wù)器可供個(gè)人或小規模網(wǎng)站使用,而且對于現有的服務(wù)器,如果它不支持Servlet的話(huà),要加上這部分功能也往往是免費的(或只需要極少的投資)。
Java Servlet 與JSP(JavaServer Pages) 的比較:
JavaServerPages(JSP)是一種實(shí)現普通靜態(tài)HTML和動(dòng)態(tài)HTML混合編碼的技術(shù),JSP并沒(méi)有增加任何本質(zhì)上不能用Servlet實(shí)現的功能。但是,在JSP中編寫(xiě)靜態(tài)HTML更加方便,不必再用println語(yǔ)句來(lái)輸出每一行HTML代碼。更重要的是,借助內容和外觀(guān)的分離,頁(yè)面制作中不同性質(zhì)的任務(wù)可以方便地分開(kāi):比如,由頁(yè)面設計者進(jìn)行HTML設計,同時(shí)留出供Servlet程序員插入動(dòng)態(tài)內容的空間。
二、javax.servlet.http提供的HTTP Servlet應用編程接口
HTTP Servlet 使用一個(gè) HTML 表格來(lái)發(fā)送和接收數據。要創(chuàng )建一個(gè) HTTP Servlet,請擴展 HttpServlet 類(lèi),該類(lèi)是用專(zhuān)門(mén)的方法來(lái)處理 HTML 表格的 GenericServlet 的一個(gè)子類(lèi)。 HTML 表單是由 <FORM> 和</FORM>標記定義的。表單中典型地包含輸入字段(如文本輸入字段、復選框、單選按鈕和選擇列表)和用于提交數據的按鈕。當提交信息時(shí),它們還指定服務(wù)器應執行哪一個(gè)Servlet(或其它的程序)。 HttpServlet 類(lèi)包含 init()、destroy()、service() 等方法。其中init() 和 destroy() 方法是繼承的。
(1) init() 方法
在 Servlet 的生命期中,僅執行一次 init() 方法。它是在服務(wù)器裝入 Servlet 時(shí)執行的??梢耘渲梅?wù)器,以在啟動(dòng)服務(wù)器或客戶(hù)機首次訪(fǎng)問(wèn) Servlet 時(shí)裝入 Servlet。 無(wú)論有多少客戶(hù)機訪(fǎng)問(wèn) Servlet,都不會(huì )重復執行init() 。
缺省的 init() 方法通常是符合要求的,但也可以用定制 init() 方法來(lái)覆蓋它,典型的是管理服務(wù)器端資源。 例如,可能編寫(xiě)一個(gè)定制init() 來(lái)只用于一次裝入 GIF 圖像,改進(jìn) Servlet 返回 GIF圖像和含有多個(gè)客戶(hù)機請求的性能。另一個(gè)示例是初始化數據庫連接。缺省的 init() 方法設置了 Servlet 的初始化參數,并用它的ServletConfig 對象參數來(lái)啟動(dòng)配置, 因此所有覆蓋 init() 方法的 Servlet 應調用 super.init()以確保仍然執行這些任務(wù)。在調用 service() 方法之前,應確保已完成了 init() 方法。
(2) service() 方法
service() 方法是 Servlet 的核心。每當一個(gè)客戶(hù)請求一個(gè)HttpServlet 對象,該對象的service()方法就要被調用,而且傳遞給這個(gè)方法一個(gè)"請求"(ServletRequest)對象和一個(gè)"響應"(ServletResponse)對象作為參數。在 HttpServlet 中已存在 service() 方法。缺省的服務(wù)功能是調用與 HTTP 請求的方法相應的 do 功能。例如, 如果HTTP 請求方法為 GET,則缺省情況下就調用 doGet() 。Servlet 應該為 Servlet 支持的 HTTP 方法覆蓋 do功能。因為 HttpServlet.service() 方法會(huì )檢查請求方法是否調用了適當的處理方法,不必要覆蓋 service()方法。只需覆蓋相應的 do 方法就可以了。
當一個(gè)客戶(hù)通過(guò)HTML 表單發(fā)出一個(gè)HTTP POST請求時(shí),doPost()方法被調用。與POST請求相關(guān)的參數作為一個(gè)單獨的HTTP 請求從瀏覽器發(fā)送到服務(wù)器。當需要修改服務(wù)器端的數據時(shí),應該使用doPost()方法。
當一個(gè)客戶(hù)通過(guò)HTML 表單發(fā)出一個(gè)HTTP GET請求或直接請求一個(gè)URL時(shí),doGet()方法被調用。與GET請求相關(guān)的參數添加到URL的后面,并與這個(gè)請求一起發(fā)送。當不會(huì )修改服務(wù)器端的數據時(shí),應該使用doGet()方法。
Servlet的響應可以是下列幾種類(lèi)型:
一個(gè)輸出流,瀏覽器根據它的內容類(lèi)型(如text/HTML)進(jìn)行解釋。
一個(gè)HTTP錯誤響應, 重定向到另一個(gè)URL、servlet、JSP。
(3) destroy() 方法
destroy() 方法僅執行一次,即在服務(wù)器停止且卸裝Servlet 時(shí)執行該方法。典型的,將 Servlet作為服務(wù)器進(jìn)程的一部分來(lái)關(guān)閉。缺省的 destroy() 方法通常是符合要求的,但也可以覆蓋它,典型的是管理服務(wù)器端資源。例如,如果Servlet 在運行時(shí)會(huì )累計統計數據,則可以編寫(xiě)一個(gè) destroy() 方法,該方法用于在未裝入 Servlet時(shí)將統計數字保存在文件中。另一個(gè)示例是關(guān)閉數據庫連接。
當服務(wù)器卸裝 Servlet 時(shí),將在所有 service() 方法調用完成后,或在指定的時(shí)間間隔過(guò)后調用 destroy()方法。一個(gè)Servlet 在運行service() 方法時(shí)可能會(huì )產(chǎn)生其它的線(xiàn)程,因此請確認在調用 destroy()方法時(shí),這些線(xiàn)程已終止或完成。
(4) GetServletConfig()方法
GetServletConfig()方法返回一個(gè) ServletConfig 對象,該對象用來(lái)返回初始化參數和ServletContext。ServletContext 接口提供有關(guān)servlet 的環(huán)境信息。
(5) GetServletInfo()方法
GetServletInfo()方法是一個(gè)可選的方法,它提供有關(guān)servlet 的信息,如作者、版本、版權。
當服務(wù)器調用sevlet 的Service()、doGet()和doPost()這三個(gè)方法時(shí),均需要 "請求"和"響應"對象作為參數。"請求"對象提供有關(guān)請求的信息,而"響應"對象提供了一個(gè)將響應信息返回給瀏覽器的一個(gè)通信途徑。
javax.servlet 軟件包中的相關(guān)類(lèi)為ServletResponse和ServletRequest,而javax.servlet.http 軟件包中的相關(guān)類(lèi)為HttpServletRequest 和 HttpServletResponse。
Servlet 通過(guò)這些對象與服務(wù)器通信并最終與客戶(hù)機通信。Servlet 能通過(guò)調用"請求"對象的方法獲知客戶(hù)機環(huán)境,服務(wù)器環(huán)境的信息和所有由客戶(hù)機提供的信息。Servlet 可以調用"響應"對象的方法發(fā)送響應,該響應是準備發(fā)回客戶(hù)機的。
轉載請注明出自JAVA中文網(wǎng),權威開(kāi)發(fā)資料。

