WEB應(yīng)用與開發(fā)-07JAVA服務(wù)器小程序(ServLet)之定義、方法及編程_第1頁(yè)
WEB應(yīng)用與開發(fā)-07JAVA服務(wù)器小程序(ServLet)之定義、方法及編程_第2頁(yè)
WEB應(yīng)用與開發(fā)-07JAVA服務(wù)器小程序(ServLet)之定義、方法及編程_第3頁(yè)
WEB應(yīng)用與開發(fā)-07JAVA服務(wù)器小程序(ServLet)之定義、方法及編程_第4頁(yè)
WEB應(yīng)用與開發(fā)-07JAVA服務(wù)器小程序(ServLet)之定義、方法及編程_第5頁(yè)
已閱讀5頁(yè),還剩47頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第七講課題JAVA服務(wù)器小程序(ServLet)之定義、方法及編程目的要求掌握ServLet的定義、方法及編程教學(xué)重點(diǎn)ServLet的含義、步曙、方法與編程教學(xué)難點(diǎn)ServLet編程教學(xué)課時(shí)4(含2課時(shí)上機(jī))教學(xué)方法講解、示例與啟發(fā)式教學(xué)相結(jié)合教學(xué)內(nèi)容和步驟7.1ServLet概述

Servlet是一種獨(dú)立于平臺(tái)和協(xié)議的服務(wù)器端的Java應(yīng)用程序,可以生成動(dòng)態(tài)的Web頁(yè)面。Servlet是位于Web服務(wù)器內(nèi)部的服務(wù)器端的Java應(yīng)用程序,與傳統(tǒng)的從命令行啟動(dòng)的Java應(yīng)用程序不同,Servlet由Web服務(wù)器進(jìn)行加載,該Web服務(wù)器必須包含支持Servlet的Java虛擬機(jī)。7.1.1JavaServlet與Applet的比較:相似之處:(1)它們不是獨(dú)立的應(yīng)用程序,沒(méi)有main()方法。(2)它們不是由用戶或程序員調(diào)用,而是由另外一個(gè)應(yīng)用程序(容器)調(diào)用。(3)它們都有一個(gè)生存周期,包含init()和destroy()方法。不同之處:(4)Applet具有很好的圖形界面(AWT),與瀏覽器一起,在客戶端運(yùn)行。(5)Servlet則沒(méi)有圖形界面,運(yùn)行在服務(wù)器端。(6)JavaServlet與CGI(CommonGatewayInterface)的比較:

(7)

與傳統(tǒng)的CGI和許多其他類似CGI的技術(shù)相比,JavaServlet具有更高的效率,更容易使用,功能更強(qiáng)大,具有更好的可移植性,更節(jié)省投資。在未來(lái)的技術(shù)發(fā)展過(guò)程中,Servlet有可能徹底取代CGI。

①高效在傳統(tǒng)的CGI中,每個(gè)請(qǐng)求都要啟動(dòng)一個(gè)新的進(jìn)程,如果CGI程序本身的執(zhí)行時(shí)間較短,啟動(dòng)進(jìn)程所需要的開銷很可能反而超過(guò)實(shí)際執(zhí)行時(shí)間。而在Servlet中,每個(gè)請(qǐng)求由一個(gè)輕量級(jí)的Java線程處理(而不是重量級(jí)的操作系統(tǒng)進(jìn)程)。②在傳統(tǒng)CGI中,如果有N個(gè)并發(fā)的對(duì)同一CGI程序的請(qǐng)求,則該CGI程序的代碼在內(nèi)存中重復(fù)裝載了N次;而對(duì)于Servlet,處理請(qǐng)求的是N個(gè)線程,只需要一份Servlet類代碼。在性能優(yōu)化方面,Servlet也比CGI有著更多的選擇。

③方便Servlet提供了大量的實(shí)用工具例程,例如自動(dòng)地解析和解碼HTML表單數(shù)據(jù)、讀取和設(shè)置HTTP頭、處理Cookie、跟蹤會(huì)話狀態(tài)等。(8)功能強(qiáng)大在Servlet中,許多使用傳統(tǒng)CGI程序很難完成的任務(wù)都可以輕松地完成。例如,Servlet能夠直接和Web服務(wù)器交互,而普通的CGI程序不能。Servlet還能夠在各個(gè)程序之間共享數(shù)據(jù),使得數(shù)據(jù)庫(kù)連接池之類的功能很容易實(shí)現(xiàn)。

(9)可移植性好

Servlet用Java編寫,ServletAPI具有完善的標(biāo)準(zhǔn)。因此,為IPlanetEnterpriseServer寫的Servlet無(wú)需任何實(shí)質(zhì)上的改動(dòng)即可移植到Apache、MicrosoftIIS或者WebStar。幾乎所有的主流服務(wù)器都直接或通過(guò)插件支持Servlet。(10)節(jié)省投資不僅有許多廉價(jià)甚至免費(fèi)的Web服務(wù)器可供個(gè)人或小規(guī)模網(wǎng)站使用,而且對(duì)于現(xiàn)有的服務(wù)器,如果它不支持Servlet的話,要加上這部分功能也往往是免費(fèi)的(或只需要極少的投資)。7.1.2

JavaServlet與JSP(JavaServerPages)的比較:

JavaServerPages(JSP)是一種實(shí)現(xiàn)普通靜態(tài)HTML和動(dòng)態(tài)HTML混合編碼的技術(shù),JSP并沒(méi)有增加任何本質(zhì)上不能用Servlet實(shí)現(xiàn)的功能。但是,在JSP中編寫靜態(tài)HTML更加方便,不必再用println語(yǔ)句來(lái)輸出每一行HTML代碼。更重要的是,借助內(nèi)容和外觀的分離,頁(yè)面制作中不同性質(zhì)的任務(wù)可以方便地分開:比如,由頁(yè)面設(shè)計(jì)者進(jìn)行HTML設(shè)計(jì),同時(shí)留出供Servlet程序員插入動(dòng)態(tài)內(nèi)容的空間。從網(wǎng)絡(luò)三層結(jié)構(gòu)的角度看,一個(gè)網(wǎng)絡(luò)項(xiàng)目最少分三層:數(shù)據(jù)層、應(yīng)用層和表示層。Servlet用來(lái)寫應(yīng)用層是很強(qiáng)大的,但是對(duì)于寫表示層就很不方便。JSP則主要是為了方便寫表示層而設(shè)計(jì)的,當(dāng)然也可以寫應(yīng)用層。寫慣了ASP、PHP、CGI的朋友,經(jīng)常會(huì)不自覺(jué)地把表示層和應(yīng)用層混在一起。比如把數(shù)據(jù)庫(kù)處理信息放到JSP中,其實(shí),它應(yīng)該放在應(yīng)用層中。JSP中應(yīng)該僅僅存放與表示層有關(guān)的部分,也就是說(shuō),只放輸出HTML網(wǎng)頁(yè)的部分。而所有的數(shù)據(jù)計(jì)算、數(shù)據(jù)分析、數(shù)據(jù)庫(kù)連接處理,統(tǒng)統(tǒng)是屬于應(yīng)用層,應(yīng)該放在JavaBeans中。通過(guò)JSP調(diào)用JavaBeans,實(shí)現(xiàn)兩層的整合。綜上所述,Servlet是一個(gè)不完善的產(chǎn)品,寫應(yīng)用層很好,寫表示層就遜色許多了,并且兩層混雜。7.2JavaServletAPI2.2簡(jiǎn)介JavaServletAPI2.2的類和接口組成兩個(gè)Java包,即:javax.servlet和javax.servlet.http(還包括javax.servlet.jsp包,不在本篇文章討論范圍之內(nèi))。javax.servlet包提供了控制Servlet生命周期所必需的Servlet接口,是編寫Servlet時(shí)必須要實(shí)現(xiàn)的。javax.servlet.http包提供了從Servlet接口派生出的專門用于處理HTTP請(qǐng)求的抽象類和一般的工具類。所有的Servlet對(duì)象都要實(shí)現(xiàn)Servlet接口,大多數(shù)情況下是作為已經(jīng)實(shí)現(xiàn)了Servlet接口的javax.servlet.GenericServlet和javax.servlet.http.HttpServlet這兩個(gè)抽象類的子類來(lái)間接實(shí)現(xiàn)Servlet接口。7.2.1javax.servlet包定義的類和接口:⑴interfaceRequestDispatcher

//定義一種對(duì)象,用于從客戶接受請(qǐng)求,并將請(qǐng)求發(fā)送到服務(wù)器上任何指定的資源,如一個(gè)Servlet、JSP或HTML文件。⑵interfaceServlet

//定義了所有Servlet必須實(shí)現(xiàn)的方法。⑶interfaceServletConfig

//定義Servletconfig對(duì)象,由Servlet引擎用在Servlet初始化時(shí),向Servlet傳遞信息。⑷interfaceServletContext

//定義了一系列方法,以便Servlet與其運(yùn)行的環(huán)境通信。⑸interfaceServletRequest

//定義了用于向Servlet傳遞客戶請(qǐng)求信息的對(duì)象。⑹interfaceServletResponse

//定義了一個(gè)對(duì)象,由Servlet用于向客戶發(fā)送響應(yīng)。⑺interfaceSingleThreadModel

//用于保證Servlet在任一時(shí)刻,只處理一個(gè)請(qǐng)求。⑻classGenericServlet

//繼承Servlet接口,定義了一個(gè)通用的,與協(xié)議無(wú)關(guān)的Servlet。

⑼classServletInputStream

//定義了一個(gè)輸入流,用于由Servlet從中讀取客戶請(qǐng)求的二進(jìn)制數(shù)據(jù)。⑽classServletOutputStream

//定義了一個(gè)輸出流,用于由Servlet向客戶發(fā)送二進(jìn)制數(shù)據(jù)。⑾classServletException

//定義了一個(gè)當(dāng)Servlet遇到問(wèn)題時(shí)可以拋出的異常。⑿classUnavailableException

//定義了一種異常,用于由Servlet指明它永遠(yuǎn)或暫時(shí)不可用

7.2.2javax.servlet.http包定義的類和接口:⑴interfaceHttpServletRequest

//繼承了ServletRequest接口,為HTTPServlet提供請(qǐng)求信息。⑵interfaceHttpServletResponse

//繼承了ServletResponse接口,為HTTPServlet輸出響應(yīng)信息提供支持。⑶interfaceHttpSession

//為維護(hù)HTTP用戶的會(huì)話狀態(tài)提供支持。⑷interfaceHttpSessionBindingListener

//使得某對(duì)象在加入一個(gè)會(huì)話或從會(huì)話中刪除時(shí)能夠得到通知。⑸interfaceHttpSessionContext

//由Servlet2.1定義,該對(duì)象在新版本已不被支持。⑹classCookie

//用在Servlet中使用Cookie技術(shù)⑺classHttpServlet

//定義了一個(gè)抽象類,繼承GenericServlet抽象類,應(yīng)被HTTPServlet繼承。⑻classHttpSessionBindingEvent

//定義了一種對(duì)象,當(dāng)某一個(gè)實(shí)現(xiàn)了HttpSessionBindingListener接口的對(duì)象被加入會(huì)話或從會(huì)//話中刪除時(shí),會(huì)收到該類對(duì)象的一個(gè)句柄⑼classHttpUtils

//提供了一系列便于編寫HTTPServlet的方法。7.3Servlet的主要方法HTTPServlet使用一個(gè)HTML表格來(lái)發(fā)送和接收數(shù)據(jù)。要?jiǎng)?chuàng)建一個(gè)HTTPServlet,請(qǐng)擴(kuò)展HttpServlet類,該類是用專門的方法來(lái)處理HTML表格的GenericServlet的一個(gè)子類。HTML表單是由<FORM>和</FORM>標(biāo)記定義的。表單中典型地包含輸入字段(如文本輸入字段、復(fù)選框、單選按鈕和選擇列表)和用于提交數(shù)據(jù)的按鈕。當(dāng)提交信息時(shí),它們還指定服務(wù)器應(yīng)執(zhí)行哪一個(gè)Servlet(或其它的程序)。HttpServlet類包含init()、destroy()、service()等方法。其中init()和destroy()方法是繼承的。(1)init()方法在Servlet的生命期中,僅執(zhí)行一次init()方法。它是在服務(wù)器裝入Servlet時(shí)執(zhí)行的??梢耘渲梅?wù)器,以在啟動(dòng)服務(wù)器或客戶機(jī)首次訪問(wèn)Servlet時(shí)裝入Servlet。無(wú)論有多少客戶機(jī)訪問(wèn)Servlet,都不會(huì)重復(fù)執(zhí)行init()。缺省的init()方法通常是符合要求的,但也可以用定制init()方法來(lái)覆蓋它,典型的是管理服務(wù)器端資源。例如,可能編寫一個(gè)定制init()來(lái)只用于一次裝入GIF圖像,改進(jìn)Servlet返回GIF圖像和含有多個(gè)客戶機(jī)請(qǐng)求的性能。另一個(gè)示例是初始化數(shù)據(jù)庫(kù)連接。缺省的init()方法設(shè)置了Servlet的初始化參數(shù),并用它的ServletConfig對(duì)象參數(shù)來(lái)啟動(dòng)配置,因此所有覆蓋init()方法的Servlet應(yīng)調(diào)用super.init()以確保仍然執(zhí)行這些任務(wù)。在調(diào)用service()方法之前,應(yīng)確保已完成了init()方法。(2)service()方法語(yǔ)法格式:publicvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsservletException,IOException

例1serviceDemo.javaimportjavax.servlet.*;importjavax.servlet.http.*;importjava.io.*;importjava.util.*;publicclassserviceDemoextendsHttpServlet{staticfinalprivateStringCONTENT_TYPE="text/html;charset=GBK";publicvoidinit()throwsServletException{}publicvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletException{response.setContentType(CONTENT_TYPE);request.setCharacterEncoding("GBK");PrintWriterout=response.getWriter();Stringname=request.getParameter("name");Stringgender=request.getParameter("gender");Stringage=request.getParameter("age");Stringmethod=request.getMethod();out.println("<h3>"+"service方法演示"+"</h3>");out.println("<h3>"+"上傳方法的參數(shù)是"+method+"</h3>");out.println(("<p>名字="+name+"<p>"));out.println(("<p>性別="+gender+"<p>"));out.println(("<p>年齡="+age+"<p>"));}publicvoiddestroy(){System.out.println("servlet的生命結(jié)束");}}service()方法是Servlet的核心。每當(dāng)一個(gè)客戶請(qǐng)求一個(gè)HttpServlet對(duì)象,該對(duì)象的service()方法就要被調(diào)用,而且傳遞給這個(gè)方法一個(gè)"請(qǐng)求"(ServletRequest)對(duì)象和一個(gè)"響應(yīng)"(ServletResponse)對(duì)象作為參數(shù)。在HttpServlet中已存在service()方法。缺省的服務(wù)功能是調(diào)用與HTTP請(qǐng)求的方法相應(yīng)的do功能。例如,如果HTTP請(qǐng)求方法為GET,則缺省情況下就調(diào)用doGet()。Servlet應(yīng)該為Servlet支持的HTTP方法覆蓋do功能。因?yàn)镠ttpServlet.service()方法會(huì)檢查請(qǐng)求方法是否調(diào)用了適當(dāng)?shù)奶幚矸椒?,不必要覆蓋service()方法。只需覆蓋相應(yīng)的do方法就可以了。當(dāng)一個(gè)客戶通過(guò)HTML表單發(fā)出一個(gè)HTTPPOST請(qǐng)求時(shí),doPost()方法被調(diào)用。與POST請(qǐng)求相關(guān)的參數(shù)作為一個(gè)單獨(dú)的HTTP請(qǐng)求從瀏覽器發(fā)送到服務(wù)器。當(dāng)需要修改服務(wù)器端的數(shù)據(jù)時(shí),應(yīng)該使用doPost()方法。一個(gè)客戶通過(guò)HTML表單發(fā)出一個(gè)HTTPGET請(qǐng)求或直接請(qǐng)求一個(gè)URL時(shí),doGet()方法被調(diào)用。與GET請(qǐng)求相關(guān)的參數(shù)添加到URL的后面,并與這個(gè)請(qǐng)求一起發(fā)送。當(dāng)不會(huì)修改服務(wù)器端的數(shù)據(jù)時(shí),應(yīng)該使用doGet()方法。

Servlet的響應(yīng)可以是下列幾種類型:①一個(gè)輸出流,瀏覽器根據(jù)它的內(nèi)容類型(如text/HTML)進(jìn)行解釋。②一個(gè)HTTP錯(cuò)誤響應(yīng),重定向到另一個(gè)URL、servlet、JSP。⑶destroy()方法destroy()方法僅執(zhí)行一次,即在服務(wù)器停止且卸裝Servlet時(shí)執(zhí)行該方法。典型的,將Servlet作為服務(wù)器進(jìn)程的一部分來(lái)關(guān)閉。缺省的destroy()方法通常是符合要求的,但也可以覆蓋它,典型的是管理服務(wù)器端資源。例如,如果Servlet在運(yùn)行時(shí)會(huì)累計(jì)統(tǒng)計(jì)數(shù)據(jù),則可以編寫一個(gè)destroy()方法,該方法用于在未裝入Servlet時(shí)將統(tǒng)計(jì)數(shù)字保存在文件中。另一個(gè)示例是關(guān)閉數(shù)據(jù)庫(kù)連接。當(dāng)服務(wù)器卸裝Servlet時(shí),將在所有service()方法調(diào)用完成后,或在指定的時(shí)間間隔過(guò)后調(diào)用destroy()方法。一個(gè)Servlet在運(yùn)行service()方法時(shí)可能會(huì)產(chǎn)生其它的線程,因此請(qǐng)確認(rèn)在調(diào)用destroy()方法時(shí),這些線程已終止或完成。⑷GetServletConfig()方法⑸GetServletConfig()方法返回一個(gè)ServletConfig對(duì)象,該對(duì)象用來(lái)返回初始化參數(shù)和ServletContext。ServletContext接口提供有關(guān)servlet的環(huán)境信息。⑹GetServletInfo()方法⑺GetServletInfo()方法是一個(gè)可選的方法,它提供有關(guān)servlet的信息,如作者、版本、版權(quán)。⑻doPost方法doPost()只可以接受瀏覽器和Form表單的post方法訪問(wèn),格式:publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsservletException,IOException通過(guò)HTML表單提交了HTTPPOST請(qǐng)求時(shí),將調(diào)用該方法。與POST請(qǐng)求相關(guān)聯(lián)的參數(shù)獨(dú)立傳遞給Web服務(wù)器。當(dāng)在server端需對(duì)發(fā)來(lái)的數(shù)據(jù)作修改時(shí)采用doPost方法。⑼doGet方法doGet()方法可以接受瀏覽器直接訪問(wèn)和Form表單的get方法訪問(wèn),格式:publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsservletException,IOException當(dāng)在游覽器中指定了一個(gè)URL時(shí),HTTPGET是客戶端采用的缺省方法。doGet是Webserver對(duì)用戶端請(qǐng)求的響應(yīng)方法。與doPost不同的是,當(dāng)在server端不需要對(duì)發(fā)來(lái)的數(shù)據(jù)修改時(shí)或是發(fā)來(lái)的參數(shù)非敏感數(shù)據(jù)時(shí)采用doGet方法。參數(shù)數(shù)據(jù)被附加在URL之后通過(guò)一個(gè)HTTP請(qǐng)求發(fā)送給Webserver。⑽doDelete()方法publicvoiddoDelete(HttpServletRequestrequest,HttpServletResponseresponse)throwsservletException,IOException該方法刪除服務(wù)器端的文件。servlet的輸出響應(yīng)可以是以下幾種情況之一,HTML頁(yè)面、HTTP錯(cuò)誤代碼、重定向到別外的URL、servlet或JSP。當(dāng)服務(wù)器調(diào)用sevlet的Service()、doGet()和doPost()這三個(gè)方法時(shí),均需要"請(qǐng)求"和"響應(yīng)"對(duì)象作為參數(shù)。"請(qǐng)求"對(duì)象提供有關(guān)請(qǐng)求的信息,而"響應(yīng)"對(duì)象提供了一個(gè)將響應(yīng)信息返回給瀏覽器的一個(gè)通信途徑。javax.servlet軟件包中的相關(guān)類為ServletResponse和ServletRequest,而javax.servlet.http軟件包中的相關(guān)類為HttpServletRequest和HttpServletResponse。Servlet通過(guò)這些對(duì)象與服務(wù)器通信并最終與客戶機(jī)通信。Servlet能通過(guò)調(diào)用"請(qǐng)求"對(duì)象的方法獲知客戶機(jī)環(huán)境,服務(wù)器環(huán)境的信息和所有由客戶機(jī)提供的信息。Servlet可以調(diào)用"響應(yīng)"對(duì)象的方法發(fā)送響應(yīng),該響應(yīng)是準(zhǔn)備發(fā)回客戶機(jī)的。7.4Servlets編程Servlets是生成動(dòng)態(tài)頁(yè)面的Java解決方案。它有如下特點(diǎn):⑴移植性好:Servlets以Java寫成,在服務(wù)器端執(zhí)行,擁有良好的跨平臺(tái)特性,適應(yīng)于各種Web服務(wù)器。ServletAPI在Servlet和Web服務(wù)器之間定義了標(biāo)準(zhǔn)接口。⑵良好的一致性和性能:Servlet代碼被Web服務(wù)器一次裝入,為每一個(gè)客戶端的請(qǐng)求而激活。不同的請(qǐng)求間可以共享系統(tǒng)資源(如數(shù)據(jù)庫(kù)連接)因此不存在為每一個(gè)請(qǐng)求初使化新的Servlet程序的額外開銷。Servlet可以動(dòng)態(tài)裝入可以在Web服務(wù)器啟動(dòng)時(shí)裝入。⑶基于Java語(yǔ)言:Servlet采用Java書寫,它繼承了Java語(yǔ)言的所有優(yōu)點(diǎn)。通過(guò)垃圾內(nèi)存清理機(jī)制而且不使用指針,使得Servlet避免了內(nèi)存管理的大多數(shù)問(wèn)題。⑷servlet是運(yùn)行于Web服務(wù)器或應(yīng)用服務(wù)器的服務(wù)器端Java程序(注意,這里的應(yīng)用服務(wù)器的是指應(yīng)用的部署和運(yùn)行平臺(tái)軟件:ApplicationServer)。servlet和Web服務(wù)器的關(guān)系就象applet與瀏覽器的關(guān)系一樣。Applet在游覽器中裝入和執(zhí)行,而servlet是在Web服務(wù)器中裝入和執(zhí)行。servletAPI定義了servlet與Web服務(wù)器間的標(biāo)準(zhǔn)接口,這使得servlet的開發(fā)獨(dú)立于Web服務(wù)器。7.4.1servlet的訪問(wèn)方式通過(guò)瀏覽器可以有幾種途徑訪問(wèn)servlet:⑴

HTML表單:通常servlet由HTML表單中的Sumbit按鈕驅(qū)動(dòng),用戶的輸入數(shù)據(jù)通過(guò)POST或GET方法傳遞給servlet。⑵

超鏈接:servlet也可以超鏈接的形式指定,通過(guò)超鏈接激活服務(wù)或servlet的doGet方法。⑶

SERVLET標(biāo)記:一些Web服務(wù)器支持HTML文檔的SERVLET標(biāo)記或者<!—include-->標(biāo)記。執(zhí)行時(shí)servlet的doGet方法被激活,輸出結(jié)果代替SERVLET標(biāo)記出現(xiàn)在HTML文檔中。在JSP0.92和1.0規(guī)范中,支持的include語(yǔ)法是:<%@includefile=”相對(duì)URL路徑”>⑷通過(guò)servlet訪問(wèn):通過(guò)getServletContext().getServlet(servletname)可訪問(wèn)其它的servlet。值得注意的是,JavaservletAPI2.1建議不采用這種方法,它提供了RequestDispatcher接口,它可以轉(zhuǎn)發(fā)請(qǐng)求調(diào)用另外的servlet。7.4.2Servlet生命周期管理基于servlet的網(wǎng)絡(luò)應(yīng)用的用戶端程序并非直接與servlet交互,而是發(fā)請(qǐng)求給Webserver,由Webserver通過(guò)servletAPI激活servlet。Webserver的主要任務(wù)包括為servlet初使化、活servlet的doGet或doPost方法、銷毀servlet進(jìn)程等。在Webserver中,每個(gè)servlet只有一個(gè)進(jìn)程,為每個(gè)客戶端請(qǐng)求創(chuàng)建一個(gè)線程(每個(gè)線程處理一個(gè)客戶端請(qǐng)求,如圖1,servlet的這一特性使其運(yùn)行效率非常高效。

圖1Servlet生命周期裝載Servlet。這項(xiàng)操作一般是動(dòng)態(tài)執(zhí)行的。然而,Server通常會(huì)提供一個(gè)管理的選項(xiàng),用于在Server啟動(dòng)時(shí)強(qiáng)制裝載和初始化特定的Servlet。

Server創(chuàng)建一個(gè)Servlet的實(shí)例

Server調(diào)用Servlet的init()方法一個(gè)客戶端的請(qǐng)求到達(dá)Server

Server創(chuàng)建一個(gè)請(qǐng)求對(duì)象

Server創(chuàng)建一個(gè)響應(yīng)對(duì)象

Server激活Servlet的service()方法,傳遞請(qǐng)求和響應(yīng)對(duì)象作為參數(shù)

service()方法獲得關(guān)于請(qǐng)求對(duì)象的信息,處理請(qǐng)求,訪問(wèn)其他資源,獲得需要的信息

service()方法使用響應(yīng)對(duì)象的方法,將響應(yīng)傳回Server,最終到達(dá)客戶端。service()方法可能激活其它方法以處理請(qǐng)求,如doGet()或doPost()或程序員自己開發(fā)的新的方法對(duì)于更多的客戶端請(qǐng)求,Server創(chuàng)建新的請(qǐng)求和響應(yīng)對(duì)象,仍然激活此Servlet的service()方法,將這兩個(gè)對(duì)象作為參數(shù)傳遞給它。如此重復(fù)以上的循環(huán),但無(wú)需再次調(diào)用init()方法。一般Servlet只初始化一次,當(dāng)Server不再需要Servlet時(shí)(一般當(dāng)Server關(guān)閉時(shí)),Server調(diào)用Servlet的Destroy()方法。例2Servlet生命周期importjavax.servlet.*;importjavax.servlet.http.*;importjava.io.*;publicclassservletLifeDemoextendsHttpServlet{staticfinalprivateStringCONTENT_TYPE="text/html;charset=GBK";publicvoidinit()throwsServletException{System.out.println("servlet的生命開始");}publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsIOException,ServletException{response.setContentType(CONTENT_TYPE);PrintWriterout=response.getWriter();out.println("<html>");out.println("<body>");out.println("<head>");Stringtitle=rb.getString("requestinfo.title");out.println("<title>"+title+"</title>");out.println("</head>");out.println("<bodybgcolor=\"white\">");

//imgstuffnotreq'dforsourcecodehtmlshowing //alllinksrelative! out.println("<ahref=\"../servlets/reqinfo.html\">");out.println("<imgsrc=\"../images/code.gif\"height=24"+"width=24align=rightborder=0alt=\"viewcode\"></a>");out.println("<ahref=\"../servlets/index.html\">");out.println("<imgsrc=\"../images/return.gif\"height=24"+"width=24align=rightborder=0alt=\"return\"></a>");out.println("<h3>"+title+"</h3>");out.println("<tableborder=0><tr><td>");

out.println(rb.getString("requestinfo.label.method"));out.println("</td><td>");out.println(request.getMethod());out.println("</td></tr><tr><td>");out.println(rb.getString("requestinfo.label.requesturi"));out.println("</td><td>");out.println(request.getRequestURI());out.println("</td></tr><tr><td>");out.println(rb.getString("tocol"));out.println("</td><td>");

out.println(request.getProtocol());out.println("</td></tr><tr><td>");out.println(rb.getString("requestinfo.label.pathinfo"));out.println("</td><td>");out.println(request.getPathInfo());out.println("</td></tr><tr><td>");out.println(rb.getString("requestinfo.label.remoteaddr"));out.println("</td><td>");out.println(request.getRemoteAddr());out.println("</table>");response.sendRedirect(":8080/examples/servlet/HelloWorldExample");}publicvoiddestroy(){System.out.println("servlet的生命結(jié)束");}}7.5servlet的步曙:(Tomcat5.0配置servlet)⑴先添加servlet的環(huán)境變量,我用的是win2000,所以只要在我的電腦->屬性->高級(jí)->環(huán)境變量,然后新建一個(gè)classpath,因?yàn)槲业腡omcat5.0目錄是在C:\Tomcat

5.0所以變量值為

C:\Tomcat

5.0\common\lib\servlet-api.jar與tomcat4不同的是tomvat4的jar文件是servlet.jar編輯好環(huán)境變量后重啟計(jì)算機(jī)⑵寫一個(gè)servlet文件import

java.io.IOException;import

java.io.PrintWriter;import

javax.servlet.ServletException;import

javax.servlet.http.HttpServlet;import

javax.servlet.http.HttpServletRequest;Import

javax.servlet.http.HttpServletResponse;public

class

Test

extends

HttpServlet

{protected

void

doGet(HttpServletRequest

request,

HttpServletResponse

response)throws

ServletException,

IOException

{PrintWriter

out=response.getWriter();out.println("<html><body><h1>This

is

a

servlet

test.</h1></body></html>");out.flush();}}可放在任一classes目錄,此處,我選擇虛擬目錄D:/jsp/webappserver.xml設(shè)置:<Context

path="/webapp"

docBase="d:/jsp/webapp"...path是虛擬目錄,docBase是虛擬目錄路徑虛擬目錄的設(shè)置網(wǎng)上有很多,這里不再介紹在D:/jsp/webapp/WEB-INF/classes/下編譯生成Test.class文件請(qǐng)將生成的類文件與LocalSperties、LocalStrings_perties、LocalStrings_perties、LocalStrings_perties全放在classes目錄下。⑶web.xml編輯在<web-app>與</web-app>中間編輯如下代碼:<servlet><servlet-name>Test</servlet-name><servlet-class>Test</servlet-class></servlet><servlet-mapping><servlet-name>Test</servlet-name><url-pattern>/Test</url-pattern></servlet-mapping>其中,<servlet-class>Test</servlet-class>說(shuō)明class文件為Test<url-pattern>/Test</url-pattern>說(shuō)明將聲明的servlet“映射”到地址/Test上,⑷運(yùn)行:啟動(dòng)Tomcat,啟動(dòng)瀏覽器,輸入http://localhos

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論