《Java Web程序設(shè)計(jì)任務(wù)教程》Servlet技術(shù) 課件_第1頁(yè)
《Java Web程序設(shè)計(jì)任務(wù)教程》Servlet技術(shù) 課件_第2頁(yè)
《Java Web程序設(shè)計(jì)任務(wù)教程》Servlet技術(shù) 課件_第3頁(yè)
《Java Web程序設(shè)計(jì)任務(wù)教程》Servlet技術(shù) 課件_第4頁(yè)
《Java Web程序設(shè)計(jì)任務(wù)教程》Servlet技術(shù) 課件_第5頁(yè)
已閱讀5頁(yè),還剩150頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章Servlet技術(shù)《Java

Web程序設(shè)計(jì)任務(wù)教程(第2版)》學(xué)習(xí)目標(biāo)/Target

掌握Servlet的基本概念

掌握Servlet的特點(diǎn)及其接口

熟悉使用IDEA工具開(kāi)發(fā)Servlet

掌握Servlet的配置以及Servlet的生命周期學(xué)習(xí)目標(biāo)/Target掌握ServletConfig和ServletContext接口的使用

掌握HttpServletRequest對(duì)象的使用

掌握HttpServletResponse對(duì)象的使用章節(jié)概述/

Summary

隨著Web應(yīng)用業(yè)務(wù)需求的增多,動(dòng)態(tài)Web資源的開(kāi)發(fā)變得越來(lái)越重要。目前,很多公司都提供了開(kāi)發(fā)動(dòng)態(tài)Web資源的相關(guān)技術(shù),其中比較常見(jiàn)的有ASP、PHP、JSP和Servlet等?;贘ava的動(dòng)態(tài)Web資源開(kāi)發(fā),SUN公司提供了Servlet和JSP兩種技術(shù)。本章將針對(duì)Servlet技術(shù)的相關(guān)知識(shí)進(jìn)行詳細(xì)講解。目錄/Contents010203Servlet基礎(chǔ)Servlet開(kāi)發(fā)入門(mén)ServletConfig和ServletContext目錄/Contents040506HttpServletResponse對(duì)象HttpServletResponse應(yīng)用HttpServletRequest對(duì)象Servlet基礎(chǔ)4.14.1Servlet基礎(chǔ)先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握Servlet的概念、特點(diǎn)和接口4.1.1Servlet概述Servlet是運(yùn)行在Web服務(wù)器端的Java應(yīng)用程序,它使用Java語(yǔ)言編寫(xiě)。與Java程序的區(qū)別是,Servlet對(duì)象主要封裝了對(duì)HTTP請(qǐng)求的處理,并且它的運(yùn)行需要Servlet容器的支持。在JavaWeb應(yīng)用方面,Servlet的應(yīng)用占有十分重要的地位,它在Web請(qǐng)求的處理功能方面也非常強(qiáng)大。Servlet是什么4.1.1Servlet概述Servlet由Servlet容器提供,Servlet容器是指提供了Servlet功能的服務(wù)器(本書(shū)中指Tomcat)。Servlet容器將Servlet動(dòng)態(tài)地加載到服務(wù)器上。與HTTP協(xié)議相關(guān)的Servlet使用HTTP請(qǐng)求和HTTP響應(yīng)與客戶(hù)端進(jìn)行交互。因此,Servlet容器支持所有HTTP協(xié)議的請(qǐng)求和響應(yīng)。Servlet容器4.1.1Servlet概述Servlet的請(qǐng)求首先會(huì)被HTTP服務(wù)器(如Apache)接收,HTTP服務(wù)器只負(fù)責(zé)靜態(tài)HTML頁(yè)面的解析,對(duì)于Servlet的請(qǐng)求轉(zhuǎn)交給Servlet容器,Servlet容器會(huì)根據(jù)web.xml文件中的映射關(guān)系,調(diào)用相應(yīng)的Servlet,Servlet將處理的結(jié)果返回給Servlet容器,并通過(guò)HTTP服務(wù)器將響應(yīng)傳輸給客戶(hù)端。Servlet應(yīng)用程序的體系結(jié)構(gòu)4.1.2Servlet的特點(diǎn)Servlet使用Java語(yǔ)言編寫(xiě),它不僅具有Java語(yǔ)言的優(yōu)點(diǎn),而且還對(duì)Web的相關(guān)應(yīng)用進(jìn)行了封裝,同時(shí)Servlet容器還提供了對(duì)應(yīng)用的相關(guān)擴(kuò)展,無(wú)論是在功能、性能、安全等方面都十分優(yōu)秀。Servlet的特點(diǎn)4.1.2Servlet的特點(diǎn)Servlet采用Java語(yǔ)言編寫(xiě),它可以調(diào)用JavaAPI中的對(duì)象及方法,此外,Servlet對(duì)象對(duì)Web應(yīng)用進(jìn)行了封裝,提供了Servlet對(duì)Web應(yīng)用的編程接口,還可以對(duì)HTTP請(qǐng)求進(jìn)行相應(yīng)的處理,如處理提交數(shù)據(jù)、會(huì)話(huà)跟蹤、讀取和設(shè)置HTTP頭信息等。由于Servlet既擁有Java提供的API,而且還可以調(diào)用Servlet封裝的ServletAPI編程接口,所以,它在業(yè)務(wù)功能方面十分強(qiáng)大。Servlet的特點(diǎn)—功能強(qiáng)大4.1.2Servlet的特點(diǎn)Java語(yǔ)言是跨越平臺(tái)的,所謂跨越平臺(tái)是指程序的運(yùn)行不依賴(lài)于操作系統(tǒng)平臺(tái),它可以運(yùn)行到多個(gè)系統(tǒng)平臺(tái)中,如目前常用的操作系統(tǒng)Windows、Linux和UNIX等。Servlet的特點(diǎn)—可移植4.1.2Servlet的特點(diǎn)Servlet對(duì)象在Servlet容器啟動(dòng)時(shí)被初始化,當(dāng)Servlet對(duì)象第一次被請(qǐng)求時(shí),Servlet容器將Servlet對(duì)象實(shí)例化,此時(shí)Servlet對(duì)象駐存于內(nèi)存中。如果存在多個(gè)請(qǐng)求,Servlet不會(huì)再被實(shí)例化,仍然由第一次被實(shí)例化的Servlet對(duì)象處理其他請(qǐng)求。每一個(gè)請(qǐng)求是一個(gè)線(xiàn)程,而不是一個(gè)進(jìn)程。Servlet的特點(diǎn)—性能高效4.1.2Servlet的特點(diǎn)Servlet使用了Java的安全框架,同時(shí)Servlet容器還可以為Servlet提供額外的安全功能,它的安全性是非常高的。Servlet的特點(diǎn)—安全性高4.1.2Servlet的特點(diǎn)Java語(yǔ)言是面向?qū)ο蟮木幊陶Z(yǔ)言,Servlet由Java語(yǔ)言編寫(xiě),所以它具有面向?qū)ο蟮膬?yōu)點(diǎn)。在業(yè)務(wù)邏輯處理中,可以通過(guò)封裝、繼承等特性擴(kuò)展實(shí)際的業(yè)務(wù)需要。Servlet的特點(diǎn)—可擴(kuò)展4.1.3Servlet接口Servlet接口針對(duì)Servlet技術(shù)的開(kāi)發(fā),SUN公司提供了一系列接口和類(lèi),其中最重要的是javax.servlet.Servlet接口。Servlet就是一種實(shí)現(xiàn)了Servlet接口的類(lèi),它由Web容器負(fù)責(zé)創(chuàng)建并調(diào)用,用于接收和響應(yīng)用戶(hù)的請(qǐng)求。4.1.3Servlet接口Servlet接口的方法方法聲明功能描述voidinit(ServletConfigconfig)Servlet實(shí)例化后,Servlet容器調(diào)用該方法完成初始化工作ServletConfiggetServletConfig()用于獲取Servlet對(duì)象的配置信息,返回Servlet的ServletConfig對(duì)象StringgetServletInfo()返回一個(gè)字符串,其中包含關(guān)于Servlet的信息,例如,作者、版本和版權(quán)等信息voidservice(ServletRequestrequest,ServletResponseresponse)負(fù)責(zé)響應(yīng)用戶(hù)的請(qǐng)求,當(dāng)容器接收到客戶(hù)端訪(fǎng)問(wèn)Servlet對(duì)象的請(qǐng)求時(shí),就會(huì)調(diào)用此方法。容器會(huì)構(gòu)造一個(gè)表示客戶(hù)端請(qǐng)求信息的ServletRequest對(duì)象和一個(gè)用于響應(yīng)客戶(hù)端的ServletResponse對(duì)象作為參數(shù)傳遞給service()方法。在service()方法中,可以通過(guò)ServletRequest對(duì)象得到客戶(hù)端的相關(guān)信息和請(qǐng)求信息,在對(duì)請(qǐng)求進(jìn)行處理后,調(diào)用ServletResponse對(duì)象的方法設(shè)置響應(yīng)信息voiddestroy()負(fù)責(zé)釋放Servlet對(duì)象占用的資源。當(dāng)服務(wù)器關(guān)閉或者Servlet對(duì)象被移除時(shí),Servlet對(duì)象會(huì)被銷(xiāo)毀,容器會(huì)調(diào)用此方法4.1.3Servlet接口Servlet接口中的生命周期的方法在Servlet接口中的5個(gè)方法中,其中init()、service()和destroy()這三個(gè)方法可以表現(xiàn)Servlet的生命周期,它們會(huì)在某個(gè)特定的時(shí)刻被調(diào)用。需要注意的是,Servlet容器指的就是Web服務(wù)器。4.1.3Servlet接口Servlet接口的實(shí)現(xiàn)類(lèi)針對(duì)Servlet接口,SUN公司提供了兩個(gè)默認(rèn)的接口實(shí)現(xiàn)類(lèi):GenericServlet和HttpServlet。GenericServlet是一個(gè)抽象類(lèi),該類(lèi)為Servlet接口提供了部分實(shí)現(xiàn),它并沒(méi)有實(shí)現(xiàn)HTTP請(qǐng)求處理。HttpServlet是GenericServlet的子類(lèi),它繼承了GenericServlet的所有方法,并且為HTTP請(qǐng)求中的POST、GET等類(lèi)型提供了具體的操作方法。4.1.3Servlet接口HttpServlet類(lèi)的常用方法及功能方法聲明功能描述protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)用于處理GET類(lèi)型的Http請(qǐng)求的方法protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)用于處理POST類(lèi)型的Http請(qǐng)求的方法protectedvoiddoPut(HttpServletRequestreq,HttpServletResponseresp)用于處理PUT類(lèi)型的Http請(qǐng)求的方法Servlet開(kāi)發(fā)入門(mén)4.24.2.1實(shí)現(xiàn)第一個(gè)Servlet程序先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握如何使用IDEA工具開(kāi)發(fā)Servlet程序4.2.1實(shí)現(xiàn)第一個(gè)Servlet程序使用IDEA完成Servlet的開(kāi)發(fā)在實(shí)際開(kāi)發(fā)中,通常都會(huì)使用IDEA(或Eclipse等)工具完成Servlet的開(kāi)發(fā),本書(shū)中是使用IDEA完成Servlet的開(kāi)發(fā),因?yàn)镮DEA不僅會(huì)自動(dòng)編譯Servlet,還會(huì)自動(dòng)創(chuàng)建web.xml文件信息,完成Servlet虛擬路徑的映射。STEP01新建Web項(xiàng)目4.2.1實(shí)現(xiàn)第一個(gè)Servlet程序步驟1步驟2步驟3選擇IDEA主頁(yè)的“CreateNewProject”選項(xiàng),進(jìn)入新建項(xiàng)目的界面。STEP01新建Web項(xiàng)目4.2.1實(shí)現(xiàn)第一個(gè)Servlet程序在NewProjec界面中,選擇左側(cè)欄的“Java”選項(xiàng),然后勾選”WebApplication”選項(xiàng)。選擇完畢之后,單擊”Next”按鈕進(jìn)入填寫(xiě)項(xiàng)目信息的界面。步驟2步驟1步驟3STEP01新建Web項(xiàng)目4.2.1實(shí)現(xiàn)第一個(gè)Servlet程序在NewProjec界面中,”P(pán)rojectname”選項(xiàng)用于指項(xiàng)目的名稱(chēng),”P(pán)rojectlocaltion”選項(xiàng)用于指定Web項(xiàng)目的根目錄。這里采用默認(rèn)設(shè)置的目錄,將chapter04作為Web項(xiàng)目的名稱(chēng)。設(shè)置完成之后,單擊“Finish”按鈕,進(jìn)入開(kāi)發(fā)界面。步驟1步驟3步驟2STEP02添加Tomcat的Servlet-api.jar包4.2.1實(shí)現(xiàn)第一個(gè)Servlet程序步驟1創(chuàng)建好Web項(xiàng)目后,接下來(lái),需要在項(xiàng)目中添加Tomcat的Servlet-api.jar包,單擊IDEA開(kāi)發(fā)工具右上角的“

”按鈕,進(jìn)入ProjectStructure界面。STEP02添加Tomcat的Servlet-api.jar包4.2.1實(shí)現(xiàn)第一個(gè)Servlet程序步驟2在ProjectStructure界面中,單擊【Libraries】→【

】→【Java】,彈出SelectLibraryFiles界面。STEP02添加Tomcat的Servlet-api.jar包4.2.1實(shí)現(xiàn)第一個(gè)Servlet程序步驟3在SelectLibraryFiles界面,選擇項(xiàng)目所在的目錄后單擊”O(jiān)K”按鈕,彈出選擇項(xiàng)目類(lèi)型界面。STEP02添加Tomcat的Servlet-api.jar包4.2.1實(shí)現(xiàn)第一個(gè)Servlet程序步驟4在選擇項(xiàng)目類(lèi)型界面,選中Classes選項(xiàng),單擊“OK”按鈕,會(huì)顯示項(xiàng)目名稱(chēng)界面“ChooseModules”,在“ChooseModules”界面直接單擊”O(jiān)K”按鈕,此時(shí)項(xiàng)目chapter04就加載到IDEA開(kāi)發(fā)工具中了。STEP02添加Tomcat的Servlet-api.jar包4.2.1實(shí)現(xiàn)第一個(gè)Servlet程序步驟5單擊標(biāo)記的“+”按鈕,查找Tomcat包下lib包的Servlet-api.jar,將其導(dǎo)入到chapter04項(xiàng)目中。STEP02添加Tomcat的Servlet-api.jar包4.2.1實(shí)現(xiàn)第一個(gè)Servlet程序步驟6在單擊”O(jiān)K”按鈕后,就可以將Servlet-api.jar添加到chapter04的項(xiàng)目中。STEP03創(chuàng)建Servlet類(lèi)4.2.1實(shí)現(xiàn)第一個(gè)Servlet程序步驟1右擊chapter04項(xiàng)目的src文件,選擇【new】→【CreateNewServlet】選項(xiàng),進(jìn)入創(chuàng)建Servlet類(lèi)的界面。用于指定Servlet類(lèi)的名稱(chēng)用于指定Servlet所在包的名稱(chēng)【Class】是根據(jù)【Name】自動(dòng)生成的Servlet類(lèi)的名稱(chēng)STEP03創(chuàng)建Servlet類(lèi)4.2.1實(shí)現(xiàn)第一個(gè)Servlet程序步驟2此時(shí)IDEA工具會(huì)自動(dòng)生成Servlet代碼,@WebServlet(name="TestServlet01")publicclassTestServlet01extendsHttpServlet{protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{}protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{}}STEP03創(chuàng)建Servlet類(lèi)4.2.1實(shí)現(xiàn)第一個(gè)Servlet程序步驟3為了更好的演示Servlet的運(yùn)行效果,接下來(lái)在TestServlet01的doGet()和doPost()方法中添加一些代碼。@WebServlet(name="TestServlet01",urlPatterns="/TestServlet01")publicclassTestServlet01extendsHttpServlet{protectedvoiddoPost(HttpServletRequestrequest, HttpServletResponseresponse)throwsServletException,IOException{ PrintWriterout=response.getWriter(); out.print("HelloServlet");}protectedvoiddoGet(HttpServletRequestrequest, HttpServletResponseresponse)throwsServletException,IOException{ this.doPost(request,response);}STEP04啟動(dòng)Servlet4.2.1實(shí)現(xiàn)第一個(gè)Servlet程序步驟1在IDEA開(kāi)發(fā)工具中單擊啟動(dòng)按鈕選擇使用Tomcat,啟動(dòng)成功后,在頁(yè)面中訪(fǎng)問(wèn)chapter04項(xiàng)目的地址“l(fā)ocalhost:8080/chapter04”。STEP04啟動(dòng)Servlet4.2.1實(shí)現(xiàn)第一個(gè)Servlet程序步驟2在頁(yè)面訪(fǎng)問(wèn)TestServlet01類(lèi)的地址“l(fā)ocalhost:8080/chapter04/TestServlet01”,此處訪(fǎng)問(wèn)地址中的項(xiàng)目名是根據(jù)第2章操作方式修改了Tomcat打包后的項(xiàng)目名。4.2.2Servlet的配置先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握完成Servlet的配置的兩種方式:通過(guò)Web應(yīng)用的配置文件web.xml來(lái),通過(guò)@WebServlet注解來(lái)完成Servlet的配置若想讓Servlet正確地運(yùn)行在服務(wù)器中并處理請(qǐng)求信息,必須進(jìn)行適當(dāng)?shù)呐渲茫P(guān)于Servlet的配置主要有兩種方式,分別是通過(guò)Web應(yīng)用的配置文件web.xml來(lái)完成配置和使用@WebServlet注解的方式完成。4.2.2Servlet的配置使用web.xml配置Servlet在web.xml文件中,通過(guò)<servlet>標(biāo)簽進(jìn)行注冊(cè),在<servlet>標(biāo)簽下包含若干個(gè)子元素。4.2.2Servlet的配置屬性名類(lèi)型描述<servlet-name>String指定該Servlet的名稱(chēng),一般與Servlet類(lèi)名相同,要求唯一<servlet-class>String指定該Servlet類(lèi)的位置,包括包名與類(lèi)名<description>String指定該Servlet的描述信息<display-name>String指定該Servlet的顯示名使用web.xml配置Servlet把Servlet映射到URL地址,使用<servlet-mapping>標(biāo)簽進(jìn)行映射,使用<servlet-name>子標(biāo)簽指定要映射的Servlet名稱(chēng),名稱(chēng)要和之前在<servlet>標(biāo)簽下注冊(cè)的相同;使用<url-pattern>子標(biāo)簽映射URL地址,地址前必須加“/”,否則訪(fǎng)問(wèn)不到。4.2.2Servlet的配置<servlet><servlet-name>HelloServlet</servlet-name><servlet-class>web.controller.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/servlet/HelloServlet</url-pattern></servlet-mapping>@WebServlet注解屬性@WebServlet注解用于代替web.xml文件中的<servlet>等標(biāo)簽,該注解將會(huì)在項(xiàng)目部署時(shí)被容器處理,容器將根據(jù)具體的屬性配置將相應(yīng)的類(lèi)部署為Servlet。為此,@WebServlet注解提供了一些屬性。4.2.2Servlet的配置

屬性聲明功能描述Stringname指定Servlet的name屬性,等價(jià)于<servlet-name>。如果沒(méi)有顯式指定,則該Servlet的取值即為類(lèi)的全限定名。String[]value該屬性等價(jià)于urlPatterns屬性。urlPatterns和value屬性不能同時(shí)使用。String[]urlPatterns指定一組Servlet的URL匹配模式。等價(jià)于<url-pattern>標(biāo)簽。intloadOnStartup指定Servlet的加載順序,等價(jià)于<load-on-startup>標(biāo)簽。WebInitParam[]指定一組Servlet初始化參數(shù),等價(jià)于<init-param>標(biāo)簽。boolean

asyncSupported聲明Servlet是否支持異步操作模式,等價(jià)于<async-supported>

標(biāo)簽。StringdescriptionServlet的描述信息,等價(jià)于<description>標(biāo)簽。StringdisplayNameServlet的顯示名,通常配合工具使用,等價(jià)于

<display-name>標(biāo)簽。使用注解方式配置Servlet@WebServlet注解可以標(biāo)注在任意一個(gè)繼承了HttpServlet類(lèi)的類(lèi)之上,屬于類(lèi)級(jí)別的注解。下面使用@WebServlet注解標(biāo)注ActionServlet類(lèi)。4.2.2Servlet的配置@WebServlet(name="HelloServlet",urlPatterns="/HelloServlet") publicclassHelloServletextendsHttpServlet{

//處理GET方法請(qǐng)求的方法

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponse response)throwsServletException,IOException{}

//處理POST方法請(qǐng)求的方法

protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponse response)throwsServletException,IOException{}}使用注解方式配置Servlet4.2.2Servlet的配置使用@WebServlet注解將HelloServlet類(lèi)標(biāo)注為一個(gè)Servlet。@WebServlet注解中的name屬性值用于指定servlet的name屬性,等價(jià)于<Servlet-name>,如果沒(méi)有設(shè)置@WebServlet的name屬性,其默認(rèn)值是Servlet的類(lèi)完整名稱(chēng)。urlPatterns屬性值用于指定一組servlet的url的匹配模式,等價(jià)于<url-pattern>標(biāo)簽。如果需要在@WebServlet注解中設(shè)置多個(gè)屬性,屬性之間用逗號(hào)隔開(kāi)。通過(guò)@WebServlet注解能極大地簡(jiǎn)化了Servlet的配置步驟,降低了開(kāi)發(fā)人員的開(kāi)發(fā)難度。4.2.3Servlet的生命周期先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握Servlet的三個(gè)生命周期,初始化階段、運(yùn)行階段和銷(xiāo)毀階段4.2.3Servlet的生命周期Servlet的生命周期4.2.3Servlet的生命周期Servlet的生命周期—初始化階段當(dāng)客戶(hù)端向Servlet容器發(fā)出HTTP請(qǐng)求訪(fǎng)問(wèn)Servlet時(shí),Servlet容器首先會(huì)解析請(qǐng)求,檢查內(nèi)存中是否已經(jīng)有了該Servlet對(duì)象,如果有,直接使用該Servlet對(duì)象;如果沒(méi)有,就創(chuàng)建Servlet實(shí)例對(duì)象,然后通過(guò)調(diào)用init()方法完成Servlet的初始化。需要注意的是,在Servlet的整個(gè)生命周期內(nèi),它的init()方法只被調(diào)用一次。4.2.3Servlet的生命周期Servlet的生命周期—運(yùn)行階段這是Servlet生命周期中最重要的階段,在這個(gè)階段,Servlet容器會(huì)為客戶(hù)端請(qǐng)求創(chuàng)建代表HTTP請(qǐng)求的ServletRequest對(duì)象和代表HTTP響應(yīng)的ServletResponse對(duì)象,然后將它們作為參數(shù)傳遞給Servlet的service()方法。service()方法從ServletRequest對(duì)象中獲得客戶(hù)端請(qǐng)求信息并處理該請(qǐng)求,通過(guò)ServletResponse對(duì)象生成響應(yīng)結(jié)果。在Servlet的整個(gè)生命周期內(nèi),對(duì)于Servlet的每一次訪(fǎng)問(wèn)請(qǐng)求,Servlet容器都會(huì)調(diào)用一次Servlet的service()方法,并且創(chuàng)建新的ServletRequest和ServletResponse對(duì)象,也就是說(shuō),service()方法在Servlet的整個(gè)生命周期中會(huì)被調(diào)用多次。4.2.3Servlet的生命周期Servlet的生命周期—銷(xiāo)毀階段當(dāng)服務(wù)器關(guān)閉或web應(yīng)用被移除出容器時(shí),Servlet隨著web應(yīng)用的銷(xiāo)毀而銷(xiāo)毀。在銷(xiāo)毀Servlet之前,Servlet容器會(huì)調(diào)用Servlet的destroy()方法,以便讓Servlet對(duì)象釋放它所占用的資源。在Servlet的整個(gè)生命周期中,destroy()方法也只被調(diào)用一次。需要注意的是,Servlet對(duì)象一旦創(chuàng)建就會(huì)駐留在內(nèi)存中等待客戶(hù)端的訪(fǎng)問(wèn),直到服務(wù)器關(guān)閉,或web應(yīng)用被移除出容器時(shí)Servlet對(duì)象才會(huì)銷(xiāo)毀。STEP01在chapter04項(xiàng)目中創(chuàng)建TestServlet02類(lèi),在TestServlet02類(lèi)中編寫(xiě)init()方法和destroy()方法并重寫(xiě)service()方法,用來(lái)案例演示Servlet生命周期方法的執(zhí)行效果。4.2.3Servlet的生命周期importjavax.servlet.annotation.WebServlet;importjavax.servlet.*;@WebServlet(name="TestServlet02",urlPatterns="/TestServlet02")publicclassTestServlet02extendsGenericServlet{ publicvoidinit(ServletConfigconfig)throwsServletException{ System.out.println("initmethediscalled"); } publicvoidservice(ServletRequestrequest,ServletResponseresponse) throwsServletException{ System.out.println("HelloWorld"); } publicvoiddestroy(){ System.out.println("destroymethodiscalled"); }}STEP02在IDEA中使用Tomcat啟動(dòng)charter01項(xiàng)目,在瀏覽器的地址欄輸入地址“http://localhost:8080/chapter04/TestServlet02”訪(fǎng)問(wèn)TestServlet02。4.2.3Servlet的生命周期STEP03刷新瀏覽器,多次訪(fǎng)問(wèn)TestServlet02,Tomcat控制臺(tái)的打印結(jié)果如下圖所示。4.2.3Servlet的生命周期init()方法只在第一次訪(fǎng)問(wèn)時(shí)執(zhí)行,service()方法則在每次訪(fǎng)問(wèn)時(shí)都被執(zhí)行。STEP04如果想將TestServlet02移除,可以在IDEA中停止chapter04項(xiàng)目,此時(shí),Servlet容器會(huì)調(diào)用TestServlet02的destroy()方法,在IDEA控制臺(tái)打印出“destroymethodiscalled”語(yǔ)句。4.2.3Servlet的生命周期ServletConfig和ServletContext4.34.3.1ServletConfig接口先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握如何使用ServletConfig獲取配置信息的方法4.3.1ServletConfig接口ServletConfig接口在Servlet運(yùn)行期間,經(jīng)常需要一些配置信息,例如,文件使用的編碼等,這些信息都可以在@WebServlet注解的屬性中配置。當(dāng)Tomcat初始化一個(gè)Servlet時(shí),會(huì)將該Servlet的配置信息封裝到一個(gè)ServletConfig對(duì)象中,通過(guò)調(diào)用init(ServletConfigconfig)方法將ServletConfig對(duì)象傳遞給Servlet。ServletConfig定義了一系列獲取配置信息的方法。方法說(shuō)明功能描述StringgetInitParameter(Stringname)根據(jù)初始化參數(shù)名返回對(duì)應(yīng)的初始化參數(shù)值EnumerationgetInitParameterNames()返回一個(gè)Enumeration對(duì)象,其中包含了所有的初始化參數(shù)名ServletContextgetServletContext()返回一個(gè)代表當(dāng)前Web應(yīng)用的ServletContext對(duì)象StringgetServletName()返回Servlet的名字STEP01接下來(lái)以getInitParameter()方法為例,分步驟講解ServletConfig方法的調(diào)用。在chapter04項(xiàng)目的src目錄中編寫(xiě)TestServlet03類(lèi)。4.3.1ServletConfig接口@WebServlet(name="TestServlet03",urlPatterns="/TestServlet03",initParams={@WebInitParam(name="encoding",value="UFT-8"),})publicclassTestServlet03extendsHttpServlet{protectedvoiddoGet(HttpServletRequestrequest, HttpServletResponseresponse)throwsServletException,IOException{ PrintWriterout=response.getWriter(); ServletConfigconfig=this.getServletConfig();

Stringparam=config.getInitParameter("encoding");

out.println("encoding="+param); }protectedvoiddoPost(HttpServletRequestrequest, HttpServletResponseresponse)throwsServletException,IOException{ this.doGet(request,response); }}STEP02在IDEA中啟動(dòng)Tomcat服務(wù)器,在瀏覽器的地址欄中輸入地址“http://localhost:8080/chapter04/TestServlet03”訪(fǎng)問(wèn)TestServlet03。4.3.1ServletConfig接口先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握ServletContext接口的使用方法4.3.2ServletContext接口4.3.2ServletContext接口當(dāng)Servlet容器啟動(dòng)時(shí),會(huì)為每個(gè)Web應(yīng)用創(chuàng)建一個(gè)唯一的ServletContext對(duì)象代表當(dāng)前Web應(yīng)用。ServletContext對(duì)象不僅封裝了當(dāng)前Web應(yīng)用的所有信息,而且實(shí)現(xiàn)了多個(gè)Servlet之間數(shù)據(jù)的共享。獲取Web應(yīng)用程序的初始化參數(shù)4.3.2ServletContext接口獲取Web應(yīng)用程序的初始化參數(shù)在web.xml文件中,可以配置Servlet的初始化信息,還可以配置整個(gè)Web應(yīng)用的初始化信息。Web應(yīng)用初始化參數(shù)的配置方式具體如下所示。<context-param><param-name>參數(shù)名</param-name><param-value>參數(shù)值</param-value></context-param><context-param><param-name>參數(shù)名</param-name><param-value>參數(shù)值</param-value></context-param>4.3.2ServletContext接口獲取Web應(yīng)用程序的初始化參數(shù)<context-param>元素位于根元素<web-app>中,它的子元素<param-name>和<param-value>分別用來(lái)指定參數(shù)的名字和參數(shù)值??梢酝ㄟ^(guò)調(diào)用ServletContext接口中定義的getInitParameterNames()和getInitParameter(Stringname)方法,分別獲取參數(shù)名和參數(shù)值。STEP01通過(guò)一個(gè)案例演示如何使用ServletContext接口獲取Web應(yīng)用程序的初始化參數(shù)。在chapter04項(xiàng)目的web.xml文件中,配置初始化參數(shù)信息和Servlet信息,其代碼如下所示。<context-param><param-name>companyName</param-name><param-value>itcast</param-value></context-param><context-param><param-name>address</param-name><param-value>beijing</param-value></context-param>4.3.2ServletContext接口STEP02在chapter04項(xiàng)目的src包中創(chuàng)建一個(gè)名稱(chēng)為T(mén)estServlet04的類(lèi),該類(lèi)中使用ServletContext接口來(lái)獲取web.xml中的配置信息。

TestServlet04類(lèi)的主要代碼如下。@WebServlet(name="TestServlet04",urlPatterns=”/TestServlet04”)publicclassTestServlet04extendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,IOException{

response.setContentType("text/html;charset=utf-8");

PrintWriterout=response.getWriter();

ServletContextcontext=this.getServletContext();

Enumeration<String>paramNames=context.getInitParameterNames(); out.println("alltheparamNameandparamValuearefollowing:"); while(paramNames.hasMoreElements()){ Stringname=paramNames.nextElement(); Stringvalue=context.getInitParameter(name); out.println(name+":"+value);

out.println("<br/>");}

}4.3.2ServletContext接口獲取ServletContext對(duì)象得到包含所有初始化參數(shù)名的Enumeration對(duì)象STEP03在IDEA中啟動(dòng)Tomcat服務(wù)器,在瀏覽器的地址欄中輸入地址“http://localhost:8080/chapter04/TestServlet04”訪(fǎng)問(wèn)TestServlet04。4.3.2ServletContext接口4.3.2ServletContext接口實(shí)現(xiàn)多個(gè)Servlet對(duì)象共享數(shù)據(jù)由于一個(gè)Web應(yīng)用中的所有Servlet共享同一個(gè)ServletContext對(duì)象,所以ServletContext對(duì)象的域?qū)傩钥梢员辉揥eb應(yīng)用中的所有Servlet訪(fǎng)問(wèn)。ServletContext接口中定義了用于增加、刪除、設(shè)置ServletContext域?qū)傩缘乃膫€(gè)方法。方法說(shuō)明功能描述EnumerationgetAttributeNames()返回一個(gè)Enumeration對(duì)象,該對(duì)象包含了所有存放在ServletContext中的所有域?qū)傩悦鸒bjectgetAttibute(Stringname)根據(jù)參數(shù)指定的屬性名返回一個(gè)與之匹配的域?qū)傩灾祐oidremoveAttribute(Stringname)根據(jù)參數(shù)指定的域?qū)傩悦?,從ServletContext中刪除匹配的域?qū)傩詖oidsetAttribute(Stringname,Objectobj)設(shè)置ServletContext的域?qū)傩裕渲衝ame是域?qū)傩悦?,obj是域?qū)傩灾礢TEP01使用IDEA在chapter04項(xiàng)目的src包中創(chuàng)建TestServlet05類(lèi),在該Servlet類(lèi)中調(diào)用了ServletContext接口中的方法設(shè)置屬性值。@WebServlet(name="TestServlet05",urlPatterns=

"/TestServlet05")publicclassTestServlet05extendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ ServletContextcontext=this.getServletContext();

//通過(guò)setAttribute()方法設(shè)置屬性值 context.setAttribute("data","thisservletsavedata"); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ this.doGet(request,response); }}4.3.2ServletContext接口STEP02使用IDEA在chapter04項(xiàng)目的src包中創(chuàng)建TestServlet06類(lèi),在該Servlet類(lèi)中調(diào)用了ServletContext接口中的方法獲取屬性值。@WebServlet(name="TestServlet06",urlPatterns=”/TestServlet06”)publicclassTestServlet06extendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{

PrintWriterout=response.getWriter(); ServletContextcontext=this.getServletContext();

//通過(guò)getAttribute()方法獲取屬性值 Stringdata=(String)context.getAttribute("data"); out.println(data); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ this.doGet(request,response); }}4.3.2ServletContext接口STEP03為了驗(yàn)證ServletContext對(duì)象是否可以實(shí)現(xiàn)多個(gè)Servlet數(shù)據(jù)的共享,在IDEA中啟動(dòng)Tomcat服務(wù)器,首先在瀏覽器的地址欄中輸入地址“http://localhost:8080/chapter04/TestServlet05”訪(fǎng)問(wèn)TestServlet05,將數(shù)據(jù)存入ServletContext對(duì)象,然后在瀏覽器的地址欄中輸入地址“http://localhost:8080/chapter04/TestServlet06”訪(fǎng)問(wèn)TestServlet06。4.3.2ServletContext接口4.3.2ServletContext接口讀取Web應(yīng)用下的資源文件ServletContext接口定義了一些讀取Web資源的方法,這些方法是依靠Servlet容器來(lái)實(shí)現(xiàn)的。Servlet容器根據(jù)資源文件相對(duì)于Web應(yīng)用的路徑,返回關(guān)聯(lián)資源文件的IO流、資源文件在文件系統(tǒng)的絕對(duì)路徑等。方法說(shuō)明功能描述SetgetResourcePaths(Stringpath)返回一個(gè)Set集合,集合中包含資源目錄中子目錄和文件的路徑名稱(chēng)。參數(shù)path必須以正斜線(xiàn)(/)開(kāi)始,指定匹配資源的部分路徑StringgetRealPath(Stringpath)返回資源文件在服務(wù)器文件系統(tǒng)上的真實(shí)路徑(文件的絕對(duì)路徑)。參數(shù)path代表資源文件的虛擬路徑,它應(yīng)該以正斜線(xiàn)(/)開(kāi)始,“/”表示當(dāng)前Web應(yīng)用的根目錄,如果Servlet容器不能將虛擬路徑轉(zhuǎn)換為文件系統(tǒng)的真實(shí)路徑,則返回nullURLgetResource(Stringpath)返回映射到某個(gè)資源文件的URL對(duì)象。參數(shù)path必須以正斜線(xiàn)(/)開(kāi)始,“/”表示當(dāng)前Web應(yīng)用的根目錄InputStreamgetResourceAsStream(Stringpath)返回映射到某個(gè)資源文件的InputStream輸入流對(duì)象。參數(shù)path傳遞規(guī)則和getResource()方法完全一致STEP01接下來(lái)通過(guò)一個(gè)案例,分步驟演示如何使用ServletContext對(duì)象讀取資源文件。創(chuàng)建一個(gè)資源文件。在chapter04項(xiàng)目中右擊src目錄,選擇【New】→【File】選項(xiàng),新建一個(gè)名稱(chēng)為perties的資源文件。在創(chuàng)建好的perties文件中,輸入如下所示的配置信息。Company=itcastAddress=Beijing4.3.2ServletContext接口STEP02編寫(xiě)讀取perties資源文件的Servlet。在src包中創(chuàng)建一個(gè)名稱(chēng)為T(mén)estServlet07的Servlet類(lèi)。

TestServlet07類(lèi)的主要代碼如下。@WebServlet(name="TestServlet07",urlPatterns="/TestServlet07")publicclassTestServlet07extendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ response.setContentType("text/html;charset=utf-8");

ServletContextcontext=this.getServletContext(); PrintWriterout=response.getWriter();

InputStreamin=context .getResourceAsStream("/WEB-INF/classes/perties"); Propertiespros=newProperties(); pros.load(in); out.println("Company="+pros.getProperty("Company")+"<br/>"); out.println("Address="+pros.getProperty("Address")+"<br/>");}}4.3.2ServletContext接口STEP03IDEA中啟動(dòng)Tomcat服務(wù)器,在瀏覽器的地址欄中輸入地址“http://localhost:8080/chapter04/TestServlet07”訪(fǎng)問(wèn)TestServlet07。4.3.2ServletContext接口STEP04在Web項(xiàng)目開(kāi)發(fā)中開(kāi)發(fā)者可能需要獲取的是資源的絕對(duì)路徑。在chapter04項(xiàng)目的src目錄中新建TestServlet08類(lèi),通過(guò)調(diào)用getRealPath(Stringpath)方法獲取資源文件的絕對(duì)路徑。TestServlet08類(lèi)的主要代碼如下。4.3.2ServletContext接口@WebServlet(name="TestServlet08",urlPatterns="/TestServlet08")publicclassTestServlet08extendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ PrintWriterout=response.getWriter();

ServletContextcontext=this.getServletContext();

Stringpath=context.getRealPath("/WEB-INF/classes/perties"); FileInputStreamin=newFileInputStream(path); Propertiespros=newProperties(); pros.load(in); out.println("Company="+pros.getProperty("Company")+); out.println("Address="+pros.getProperty("Address")+); }}STEP05在IDEA中啟動(dòng)Tomcat服務(wù)器,在瀏覽器的地址欄中再次輸入地址“http://localhost:8080/chapter04/TestServlet08”訪(fǎng)問(wèn)TestServlet08。4.3.2ServletContext接口HttpServletResponse對(duì)象4.44.4.1發(fā)送狀態(tài)碼相關(guān)的方法先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握HttpServletResponse接口定義的3個(gè)發(fā)送狀態(tài)碼的方法4.4.1發(fā)送狀態(tài)碼相關(guān)的方法HttpServletResponse接口定義的狀態(tài)碼方法當(dāng)Servlet向客戶(hù)端回送響應(yīng)消息時(shí),需要在響應(yīng)消息中設(shè)置狀態(tài)碼,狀態(tài)碼代表著客戶(hù)端請(qǐng)求服務(wù)器的結(jié)果。為此,HttpServletResponse接口定義了3個(gè)發(fā)送狀態(tài)碼的方法。4.4.1發(fā)送狀態(tài)碼相關(guān)的方法HttpServletResponse接口—setStatus(intstatus)方法setStatus(intstatus)方法用于設(shè)置HTTP響應(yīng)消息的狀態(tài)碼,并生成響應(yīng)狀態(tài)行。由于響應(yīng)狀態(tài)行中的狀態(tài)描述信息直接與狀態(tài)碼相關(guān),而HTTP版本由服務(wù)器確定,所以,只要通過(guò)setStatus(intstatus)方法設(shè)置了狀態(tài)碼,即可實(shí)現(xiàn)狀態(tài)行的發(fā)送。例如,正常情況下,Web服務(wù)器會(huì)默認(rèn)產(chǎn)生一個(gè)狀態(tài)碼為200的狀態(tài)行。4.4.1發(fā)送狀態(tài)碼相關(guān)的方法HttpServletResponse接口—sendError(intsc)方法sendError(intsc)方法用于發(fā)送表示錯(cuò)誤信息的狀態(tài)碼,例如,404狀態(tài)碼表示找不到客戶(hù)端請(qǐng)求的資源。4.4.1發(fā)送狀態(tài)碼相關(guān)的方法HttpServletResponse接口—sendError(intcode,Stringmessage)方法sendError(intcode,Stringmessage)方法除了設(shè)置狀態(tài)碼,還會(huì)向客戶(hù)端發(fā)出一條錯(cuò)誤信息。服務(wù)器默認(rèn)會(huì)創(chuàng)建一個(gè)HTML格式的錯(cuò)誤服務(wù)頁(yè)面作為響應(yīng)結(jié)果,其中包含參數(shù)message指定的文本信息,這個(gè)HTML頁(yè)面的內(nèi)容類(lèi)型為“text/html”,保留cookies和其他未修改的響應(yīng)頭信息。如果一個(gè)對(duì)應(yīng)于傳入的錯(cuò)誤碼的錯(cuò)誤頁(yè)面已經(jīng)在web.xml中聲明,那么這個(gè)聲明的錯(cuò)誤頁(yè)面會(huì)將優(yōu)先建議的message參數(shù)服務(wù)于客戶(hù)端。4.4.2發(fā)送響應(yīng)頭相關(guān)的方法先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握HttpServletResponse接口設(shè)置HTTP響應(yīng)頭字段的方法HttpServletResponse接口設(shè)置HTTP響應(yīng)頭字段的方法方法說(shuō)明功能描述voidaddHeader(String

name,String

value)這兩個(gè)方法都是用來(lái)設(shè)置HTTP協(xié)議的響應(yīng)頭字段,其中,參數(shù)name用于指定響應(yīng)頭字段的名稱(chēng),參數(shù)value用于指定響應(yīng)頭字段的值。不同的是,addHeader()方法可以增加同名的響應(yīng)頭字段,而setHeader()方法則會(huì)覆蓋同名的頭字段voidsetHeader(String

name,String

value)voidaddIntHeader(Stringname,intvalue)這兩個(gè)方法專(zhuān)門(mén)用于設(shè)置包含整數(shù)值的響應(yīng)頭。避免了調(diào)用addHeader()與setHeader()方法時(shí),需要將int類(lèi)型的設(shè)置值轉(zhuǎn)換為String類(lèi)型的麻煩voidsetIntHeader(String

name,int

value)voidsetContentLength(intlen)該方法用于設(shè)置響應(yīng)消息的實(shí)體內(nèi)容的大小,單位為字節(jié)。對(duì)于HTTP協(xié)議來(lái)說(shuō),這個(gè)方法就是設(shè)置Content-Length響應(yīng)頭字段的值4.4.2發(fā)送響應(yīng)消息頭相關(guān)的方法HttpServletResponse接口設(shè)置HTTP響應(yīng)頭字段的方法方法說(shuō)明功能描述voidsetContentType(Stringtype)該方法用于設(shè)置Servlet輸出內(nèi)容的MIME類(lèi)型,對(duì)于HTTP協(xié)議來(lái)說(shuō),就是設(shè)置Content-Type響應(yīng)頭字段的值。例如,如果發(fā)送到客戶(hù)端的內(nèi)容是jpeg格式的圖像數(shù)據(jù),就需要將響應(yīng)頭字段的類(lèi)型設(shè)置為“image/jpeg”。需要注意的是,如果響應(yīng)的內(nèi)容為文本,setContentType()方法的還可以設(shè)置字符編碼,如:text/html;charset=UTF-8voidsetLocale(Localeloc)該方法用于設(shè)置響應(yīng)消息的本地化信息。對(duì)HTTP來(lái)說(shuō),就是設(shè)置Content-Language響應(yīng)頭字段和Content-Type頭字段中的字符集編碼部分。需要注意的是,如果HTTP消息沒(méi)有設(shè)置Content-Type頭字段,setLocale()方法設(shè)置的字符集編碼不會(huì)出現(xiàn)在HTTP消息的響應(yīng)頭中,如果調(diào)用setCharacterEncoding()或setContentType()方法指定了響應(yīng)內(nèi)容的字符集編碼,setLocale()方法將不再具有指定字符集編碼的功能voidsetCharacterEncoding(Stringcharset)該方法用于設(shè)置輸出內(nèi)容使用的字符編碼,對(duì)HTTP協(xié)議來(lái)說(shuō),就是設(shè)置Content-Type頭字段中的字符集編碼部分。如果沒(méi)有設(shè)置Content-Type頭字段,setCharacterEncoding方法設(shè)置的字符集編碼不會(huì)出現(xiàn)在HTTP消息的響應(yīng)頭中。setCharacterEncoding()方法比setContentType()和setLocale()方法的優(yōu)先權(quán)高,setCharacterEncoding()方法的設(shè)置結(jié)果將覆蓋setContentType()和setLocale()方法所設(shè)置的字符碼表4.4.2發(fā)送響應(yīng)消息頭相關(guān)的方法需要注意的是,addHeader()、setHeader()、addIntHeader()、setIntHeader()方法都是用于設(shè)置各種頭字段的,而setContetType()、setLoacale()和setCharacterEncoding()方法用于設(shè)置字符編碼,這些設(shè)置字符編碼的方法可以有效解決中文字符亂碼問(wèn)題。HttpServletResponse接口設(shè)置HTTP響應(yīng)頭字段的方法4.4.2發(fā)送響應(yīng)消息頭相關(guān)的方法4.4.3發(fā)送響應(yīng)消息體相關(guān)的方法先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握發(fā)送響應(yīng)消息體相關(guān)的方法getOutputStream()和getWriter()由于在HTTP響應(yīng)消息中,大量的數(shù)據(jù)都是通過(guò)響應(yīng)消息體傳遞的,所以,ServletResponse遵循IO流傳遞大量數(shù)據(jù)的設(shè)計(jì)理念。在發(fā)送響應(yīng)消息體時(shí),定義了兩個(gè)與輸出流相關(guān)的方法。發(fā)送響應(yīng)消息體相關(guān)的方法4.4.3發(fā)送響應(yīng)消息體相關(guān)的方法getOutputStream()方法所獲取的字節(jié)輸出流對(duì)象為ServletOutputStream類(lèi)型。由于ServletOutputStream是OutputStream的子類(lèi),它可以直接輸出字節(jié)數(shù)組中的二進(jìn)制數(shù)據(jù)。所以,要想輸出二進(jìn)制格式的響應(yīng)正文,就需要調(diào)用getOutputStream()方法。getOutputStream()方法4.4.3發(fā)送響應(yīng)消息體相關(guān)的方法getWriter()方法所獲取的字符輸出流對(duì)象為PrintWriter類(lèi)型。由于PrintWriter類(lèi)型的對(duì)象可以直接輸出字符文本內(nèi)容,所以,要想輸出內(nèi)容為字符文本的網(wǎng)頁(yè)文檔,需要調(diào)用getWriter()方法。getWriter()方法4.4.3發(fā)送響應(yīng)消息體相關(guān)的方法STEP01下面通過(guò)一個(gè)案例學(xué)習(xí)response對(duì)象發(fā)送響應(yīng)消息體的兩個(gè)方法的使用。在項(xiàng)目chapter04的src目錄下,新建一個(gè)名稱(chēng)為cn.itcast.chapter04.response的包,在包中編寫(xiě)一個(gè)名為PrintServlet的Servlet類(lèi),在該類(lèi)中調(diào)用response對(duì)象的getOutPutStream()方法獲取輸出流對(duì)象。PrintServlet的Servlet類(lèi)的主要代碼如下。@WebServlet(name="PrintServlet",urlPatterns="/PrintServlet")publicclassPrintServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ Stringdata="itcast"; //獲取字節(jié)輸出流對(duì)象 OutputStreamout=response.getOutputStream(); out.write(data.getBytes());//輸出信息

}}4.4.3發(fā)送響應(yīng)消息體相關(guān)的方法STEP02在IDEA中啟動(dòng)Tomcat服務(wù)器,在瀏覽器的地址欄中輸入地址“http://localhost:8080/chapter04/PrintServlet”訪(fǎng)問(wèn)PrintServlet類(lèi)。4.4.3發(fā)送響應(yīng)消息體相關(guān)的方法STEP03下面對(duì)PrintServlet類(lèi)進(jìn)行修改,調(diào)用getWriter()方法發(fā)送消息體,修改后的主要代碼如文下所示。@WebServlet(name="PrintServlet",urlPatterns="/PrintServlet")publicclassPrintServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ Stringdata="itcast"; //獲取字符輸出流對(duì)象 PrintWriterprint=response.getWriter(); print.write(data);//輸出信息

}}4.4.3發(fā)送響應(yīng)消息體相關(guān)的方法STEP04在IDEA中重啟Tomcat服務(wù)器,在瀏覽器的地址欄中輸入地址“http://localhost:8080/chapter04/PrintServlet”再次訪(fǎng)問(wèn)PrintServlet。4.4.3發(fā)送響應(yīng)消息體相關(guān)的方法HttpServletResponse對(duì)象4.54.5.1實(shí)現(xiàn)請(qǐng)求重定向先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握HttpServletResponse接口的sendRedirect()方法,實(shí)現(xiàn)請(qǐng)求重定向在某些情況下,針對(duì)客戶(hù)端的請(qǐng)求,一個(gè)Servlet類(lèi)可能無(wú)法完成全部工作。這時(shí),可以使用請(qǐng)求重定向來(lái)完成。所謂請(qǐng)求重定向,指的是Web服務(wù)器接收到客戶(hù)端的請(qǐng)求后,可能由于某些條件限制,不能訪(fǎng)問(wèn)當(dāng)前請(qǐng)求URL所指向的Web資源,而是指定了一個(gè)新的資源路徑,讓客戶(hù)端重新發(fā)送請(qǐng)求。請(qǐng)求重定向4.5.1實(shí)現(xiàn)請(qǐng)求重定向?yàn)榱藢?shí)現(xiàn)請(qǐng)求重定向,HttpServletResponse接口定義了一個(gè)sendRedirect()方法,該方法用于生成302響應(yīng)碼和Location響應(yīng)頭,從而通知客戶(hù)端重新訪(fǎng)問(wèn)Location響應(yīng)頭中指定的URL。sendRedirect()方法的完整聲明如下所示:HttpServletResponse接口—sendRedirect()方法4.5.1實(shí)現(xiàn)請(qǐng)求重定向publicvoidsendRedirect(java.lang.Stringlocation) throwsjava.io.IOException需要注意的是,參數(shù)location可以使用相對(duì)URL,Web服務(wù)器會(huì)自動(dòng)將相對(duì)URL翻譯成絕對(duì)URL,再生成Location頭字段。sendRedirect()方法的工作原理4.5.1實(shí)現(xiàn)請(qǐng)求重定向STEP01通過(guò)一個(gè)用戶(hù)登錄的案例,分步驟講解sendRedirect()方法的使用。在chapter04項(xiàng)目的web目錄下編寫(xiě)用戶(hù)登錄的頁(yè)面login.html。<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"><title>Inserttitlehere</title></head><body> <!--把表單內(nèi)容提交到chapter04工程下的LoginServlet--> <formacti

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論