




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
任務(wù)5.1實(shí)現(xiàn)新聞發(fā)布系統(tǒng)用戶注冊(cè)功能主講:
新聞發(fā)布系統(tǒng)—Servlet技術(shù)實(shí)現(xiàn)任務(wù)描述知識(shí)準(zhǔn)備總結(jié)與練習(xí)目錄CONTENTS任務(wù)描述01Servlet實(shí)現(xiàn)用戶注冊(cè)新聞發(fā)布系統(tǒng)中,管理員用戶登錄后方可對(duì)新聞后臺(tái)系統(tǒng)進(jìn)行管理。如果用戶沒有賬戶信息,則需要先進(jìn)行注冊(cè),注冊(cè)成功后方可進(jìn)行登錄。本任務(wù)使用Servlet技術(shù)實(shí)現(xiàn)用戶注冊(cè)功能。知識(shí)準(zhǔn)備02Servlet體系結(jié)構(gòu)及生命周期Servlet編寫及配置ServletConfigServletContextServlet是由服務(wù)器端調(diào)用和執(zhí)行、按照Servlet自身規(guī)范用Java語言編寫的運(yùn)行在服務(wù)器端的應(yīng)用程序;Servlet能夠接收客戶端的請(qǐng)求,并能對(duì)客戶端進(jìn)行響應(yīng);Servlet通常是通過HTTP協(xié)議進(jìn)行工作的;Servlet的運(yùn)行需要有Servlet容器的支持,Servlet容器為Servlet提供了運(yùn)行時(shí)的環(huán)境,并負(fù)責(zé)在適當(dāng)?shù)臅r(shí)刻加載和調(diào)用Servlet。什么是ServletServlet優(yōu)點(diǎn)持久的快速的與平臺(tái)無關(guān)的可擴(kuò)展的安全的為什么使用ServletServlet運(yùn)行流程Servlet體系結(jié)構(gòu)Servlet是一個(gè)Java類,該Java類必須實(shí)現(xiàn)Javax.servlet.Servlet接口或其子接口;若實(shí)現(xiàn)和協(xié)議無關(guān)的通用Servlet,可以直接繼承GenericServlet,GenericServlet是Servlet接口的實(shí)現(xiàn)類;若實(shí)現(xiàn)一個(gè)基于HTTP協(xié)議工作的Servlet,可以直接繼承Javax.servlet.http.HttpServlet類,HttpServlet是一個(gè)抽象類,繼承自GenericServlet類,提供了處理HTTP請(qǐng)求和響應(yīng)的方法,并且擴(kuò)展了服務(wù)的方法。Servlet體系結(jié)構(gòu)(1)實(shí)現(xiàn)Servlet接口如果自定義Servlet類實(shí)現(xiàn)了Servlet接口,則必須實(shí)現(xiàn)該接口中的所有方法,即需要實(shí)現(xiàn)下面5個(gè)方法init(ServletConfigconfig)service(ServletRequestreq,ServletResponseres)destroy()getServletConfig()getServletInfo()Servlet體系結(jié)構(gòu)(2)擴(kuò)展GenericServlet類如果自定義Servlet類擴(kuò)展了GenericServlet類,則必須實(shí)現(xiàn)service()方法。這個(gè)方法有兩個(gè)參數(shù):ServletRequest和ServletResponse。Servlet容器將用戶的請(qǐng)求信息封裝在ServletRequest對(duì)象中,然后傳遞給service()方法;service()方法將響應(yīng)客戶端的結(jié)果通過ServletResponse對(duì)象傳給客戶端。service()方法的聲明如下。publicabstractvoidservice(ServletRequestrequest,ServletResponseresponse)throwsServletException,IOExceptionServlet體系結(jié)構(gòu)(3)擴(kuò)展HttpServlet類如果自定義Servlet類擴(kuò)展了HttpServlet類,通常不必去實(shí)現(xiàn)service()方法,因?yàn)镠ttpServlet已經(jīng)實(shí)現(xiàn)了這個(gè)方法。HttpServlet的service()方法首先從HttpServletRequest對(duì)象中獲取HTTP的請(qǐng)求方式,然后再根據(jù)請(qǐng)求方式調(diào)用相應(yīng)的方法。HTTP的請(qǐng)求方式包括DELETE、GET、OPTIONS、POST、PUT和TRACE,在HttpServlet類中分別提供了相應(yīng)的方法,它們是doDelete()、doGet()、doOptions()、doPost()、doPut()和doTrace()。Servlet體系結(jié)構(gòu)Servlet體系結(jié)構(gòu)如圖所示JSP技術(shù)主要用來表現(xiàn)頁(yè)面,Servlet技術(shù)主要是用來完成大量的邏輯處理JSP本身沒有任何的業(yè)務(wù)處理邏輯,它只是簡(jiǎn)單地檢索Servlet創(chuàng)建的JavaBean或者對(duì)象,再將動(dòng)態(tài)的內(nèi)容插入到預(yù)定義的模塊中Servlet創(chuàng)建JSP需要的JavaBean和對(duì)象,再根據(jù)用戶的行為,決定處理哪個(gè)JSP頁(yè)面并發(fā)送給用戶Servlet與JSP的關(guān)系
生命周期有廣義與狹義之分。
狹義為生命科學(xué)術(shù)語,指包括人類在內(nèi)的一切動(dòng)物由出生到死亡經(jīng)歷的生命全程。廣義的生命周期泛指自然界與人類社會(huì)各種客觀事物的階段性變化及規(guī)律,如家庭生命周期、產(chǎn)品生命周期等。Servlet的生命周期Servlet的生命周期就是Servlet從創(chuàng)建到銷毀的過程。Servlet的生命周期由Servlet容器管理,主要分為3個(gè)階段,分別是初始化階段、運(yùn)行時(shí)(服務(wù)/請(qǐng)求處理)階段和銷毀階段。Servlet運(yùn)行在Servlet容器中,其生命周期由容器來管理。Servlet的生命周期通過javax.servlet.Servlet接口中相關(guān)方法表示:init()service()destroy()
Servlet的生命周期1.初始化--加載和實(shí)例化階段當(dāng)客戶端向Servlet容器發(fā)出HTTP請(qǐng)求,要求訪問Servlet時(shí),Servlet容器首先會(huì)解析請(qǐng)求,檢查內(nèi)存中是否已經(jīng)有了該Servlet對(duì)象,如果存在直接使用該Servlet對(duì)象,如果不存在,則需要加載Servlet類,創(chuàng)建Servlet對(duì)象,然后調(diào)用init()方法實(shí)現(xiàn)Servlet的初始化工作。Servlet的生命周期2.運(yùn)行時(shí)-請(qǐng)求處理階段這是Servlet生命周期中最重要的階段,在這個(gè)階段,Servlet容器會(huì)針對(duì)本次客戶端請(qǐng)求創(chuàng)建代表HTTP請(qǐng)求的ServletRequest對(duì)象和代表HTTP響應(yīng)的ServletResponse對(duì)象,然后將它們作為參數(shù)傳遞給Servlet的service()方法。service()方法從ServletRequest對(duì)象中獲得客戶請(qǐng)求信息并根據(jù)客戶端的請(qǐng)求方式調(diào)用doGet()或者doPost()方法,service()方法運(yùn)行結(jié)束后生成響應(yīng)結(jié)果,Servlet容器將響應(yīng)結(jié)果發(fā)回客戶端。Servlet的生命周期3.銷毀階段當(dāng)服務(wù)器關(guān)閉或web應(yīng)用被移除出容器時(shí),Servlet隨著web應(yīng)用的銷毀而銷毀。在銷毀Servlet之前,Servlet容器會(huì)調(diào)用Servlet的destroy()方法,以便讓Servlet對(duì)象釋放它所占用的資源。Servlet的生命周期Servlet的生命周期Servlet的生命周期如圖所示Servlet生命周期方法被服務(wù)器自動(dòng)調(diào)用。init()方法:用于初始化destroy()方法:用于釋放資源service()方法:服務(wù)類方法,對(duì)用戶的請(qǐng)求進(jìn)行處理,并對(duì)用戶進(jìn)行響應(yīng),幾乎所有的功能都在這里完成。在Servlet的整個(gè)生命周期內(nèi),對(duì)于Servlet的每一次訪問請(qǐng)求,Servlet容器都會(huì)調(diào)用一次Servlet的service()方法,并且創(chuàng)建新的ServletRequest和ServletResponse對(duì)象。Servlet的生命周期在Servlet的整個(gè)生命周期中,只被調(diào)用一次在Servlet的整個(gè)生命周期中,會(huì)被調(diào)用多次軟件工程師的生命周期當(dāng)用戶編寫自己的Servlet時(shí),可以編寫一個(gè)類,使其實(shí)現(xiàn)Servlet接口或擴(kuò)展GenericServlet類或擴(kuò)展HttpServlet類,官方推薦使用擴(kuò)展HttpServlet類的方式。方法一:實(shí)現(xiàn)javax.servlet包中的Servlet接口方法二:繼承javax.servlet.GenericServlet類方法三:繼承javax.servlet.http包下的HttpServletServlet編寫及配置
Servlet編寫Servlet編寫首先要保證已創(chuàng)建好JavaWeb項(xiàng)目,在該項(xiàng)目下創(chuàng)建一個(gè)類,使其繼承自HttpServlet,重寫其doGet()、doPost()方法。
Servlet編寫【例5-1】創(chuàng)建一個(gè)名為HelloServlet的Servlet類,將其放置在cn.sdcet.servlet包中,使HelloServlet類繼承自HttpServlet類,然后重寫doGet()、doPost()方法,在方法體內(nèi)輸出部分信息。案例技能點(diǎn):doGet()、doPost()方法。實(shí)現(xiàn)步驟如下。①
在IDEA中新建一個(gè)JavaWeb項(xiàng)目,命名為ServletProj。②
在項(xiàng)目結(jié)構(gòu)的src目錄下新建cn.sdcet.servlet包。③
在cn.sdcet.servlet包中新建一個(gè)Servlet類,命名為HelloServlet。④
重寫doGet()、doPost()方法。
Servlet編寫具體實(shí)現(xiàn)示例代碼:packagecn.sdcet.servlet;importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassHelloServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doPost(request,response);}@OverrideprotectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//獲取輸出流對(duì)象PrintWriterout=response.getWriter();//通過輸出流對(duì)象將數(shù)據(jù)輸出到客戶端瀏覽器out.print("WelcomeHelloServlet!");//關(guān)閉PrintWriter類型的對(duì)象outout.close();}}配置ServletServlet編寫完成后,如果用戶要訪問該Servlet,則必須對(duì)該Servlet進(jìn)行配置,對(duì)Servlet進(jìn)行配置主要有兩種方式:一是通過web.xml文件進(jìn)行配置;二是通過@WebServlet注解進(jìn)行配置;Servlet的配置主要包括Servlet的名字、Servlet類、初始化參數(shù)、啟動(dòng)裝入的優(yōu)先級(jí)和Servlet映射等內(nèi)容。配置ServletServlet編寫完成后,如果用戶要訪問該Servlet,則必須對(duì)該Servlet進(jìn)行配置,對(duì)Servlet進(jìn)行配置主要有兩種方式:一是通過web.xml文件進(jìn)行配置;二是通過@WebServlet注解進(jìn)行配置;Servlet的配置主要包括Servlet的名字、Servlet類、初始化參數(shù)、啟動(dòng)裝入的優(yōu)先級(jí)和Servlet映射等內(nèi)容。配置Servlet(1)在web.xml文件中進(jìn)行配置Servlet是在web.xml文件的<servlet>和<servlet-mapping>元素中進(jìn)行配置的。這兩個(gè)元素的約束規(guī)則及具體說明如下。<!ELEMENTservlet(icon?,servlet-name,display-name?,description?,(servlet-class|jsp-file),init-param*,load-on-startup?,run-as?,security-role-ref*)><!ELEMENTservlet-mapping(servlet-name,url-pattern)>配置Servlet①<servlet>:用于注冊(cè)Servlet,即給Servlet起一個(gè)獨(dú)一無二的名字。<servlet>包含兩個(gè)主要的子元素<servlet-name>和<servlet-class>,分別用于指定Servlet的名稱和Servlet的完整限定名(包名+類名)。在web.xml中配置Servlet時(shí),必須指定這個(gè)Servlet的名稱和Servlet類。配置Servlet①<servlet>:除此之外,還可以在配置時(shí)為Servlet添加描述信息及在發(fā)布時(shí)顯示的名稱。<description>元素的內(nèi)容是Servlet的描述信息,<display-name>元素用于為Servlet指定一個(gè)簡(jiǎn)短的名稱,這個(gè)名稱可以被一些工具所顯示。初始化參數(shù)在<init-param>元素中定義,它包含<param-name>和<param-value>兩個(gè)必需的子元素。配置Servlet①<servlet>:Servlet的創(chuàng)建和銷毀是由Web容器控制的。默認(rèn)情況下,Web容器在客戶端請(qǐng)求Servlet時(shí)才創(chuàng)建它的實(shí)例。如果需要Web應(yīng)用程序啟動(dòng)時(shí)就加載Servlet,可以使用load-on-starup元素。load-on-starup元素的內(nèi)容必須是一個(gè)整型值。如果這個(gè)元素的值是一個(gè)負(fù)數(shù)或者沒有設(shè)置這個(gè)元素,Servlet容器就在客戶端首次請(qǐng)求Servlet時(shí)加載它;如果這個(gè)值是正數(shù)或0,容器將在Web應(yīng)用程序啟動(dòng)時(shí)加載和初始化Servlet。這個(gè)整型值越小,Servlet就越先初始化。配置Servlet②<servlet-mapping>:用于定義Servlet與URL之間的映射。<servlet-mapping>包含兩個(gè)子元素<servlet-name>和<url-pattern>,分別用于指定Servlet的名稱和提供給客戶端訪問的虛擬路徑,虛擬路徑必須以/開頭(特殊情況除外,如通過擴(kuò)展名匹配等情況)。<servlet-name>中指定的名稱必須是<servlet>中已設(shè)置的<servlet-name>。<url-pattern>子元素可以配置多個(gè),這使得客戶端可以通過多個(gè)路徑實(shí)現(xiàn)對(duì)同一個(gè)Servlet的訪問。虛擬路徑<url-pattern>的配置可以使用通配符*,如配置為<url-pattern>*.do</url-pattern>則匹配所有以.do結(jié)尾的請(qǐng)求。配置Servlet在web.xml文件中對(duì)例5-1中的HelloServlet進(jìn)行配置,具體配置如下。<?xmlversion="1.0"encoding="UTF-8"?><Web-appxmlns:xsi="/2001/XMLSchema-instance"xmlns="/xml/ns/javaee"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/Web-app_3_1.xsd"id="WebApp_ID"version="3.1"><welcome-file-list><welcome-file>index.jsp</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list><servlet><description>ThisisaHelloServlet</description><display-name>MyHelloWorldServlet</display-name><servlet-name>HelloServlet</servlet-name><servlet-class>cn.sdcet.servlet.HelloServlet</servlet-class>etProj_war_exploded/HelloServlet。配置Servlet<init-param><param-name>username</param-name><param-value>javaWeb</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/HelloServlet</url-pattern></servlet-mapping></Web-app>將項(xiàng)目部署到Tomcat并啟動(dòng)Tomcat之后,用戶可以通過瀏覽器對(duì)HelloServlet進(jìn)行訪問,訪問地址為http://localhost:8080/ServletProj_war_exploded/HelloServlet。默認(rèn)情況下,服務(wù)器啟動(dòng)后web.xml文件是只讀的,一般每次修改完web.xml文件要重新啟動(dòng)服務(wù)器。部署描述文件的讀?。?)通過@WebServlet注解進(jìn)行配置Servlet3.0中增加了注解支持,如:@WebServlet、@WebInitParm、@WebFilter和@WebLitener。與XML不同,注解不需要依賴于配置文件,它可以直接在類中使用,其配置只對(duì)當(dāng)前類有效,避免了集中管理造成的配置冗長(zhǎng)問題。@WebServlet用于將一個(gè)類聲明為Servlet,該注解會(huì)在部署時(shí)被容器處理,容器根據(jù)其具體的屬性配置將相應(yīng)的類部署為Servlet。@WebServlet屬于類級(jí)別的注解,標(biāo)注位置在繼承了HttpServlet的類之上。@WebServlet
注解的常用屬性如表5-1所示。配置Servlet常用的寫法是將Servlet的相對(duì)請(qǐng)求路徑(即value)直接寫在注解內(nèi)。配置Servlet表5-1
@WebServlet注解常用屬性屬性名類型對(duì)應(yīng)web.xml標(biāo)簽描述是否必需nameString<servlet-name>指定Servlet的name屬性。如果沒有顯式指定,則取值為該Servlet的完全限定名,即包名+類名否valueString[]<url-pattern>該屬性等價(jià)于urlPatterns屬性,兩者不能同時(shí)指定。如果同時(shí)指定,通常忽略value的取值是urlPatternsString[]<url-pattern>指定一組Servlet的URL匹配模式是loadOnStartupint<load-on-startup>指定Servlet的加載順序否initParamsWebInitParam[]<init-param>指定一組Servlet初始化參數(shù)否【例5-2】使用注解對(duì)例5-1中的HelloServlet進(jìn)行配置。案例技能點(diǎn):@WebServlet注解。實(shí)現(xiàn)步驟如下。①
使用注解配置HelloServlet,代碼示例如下。配置Servlet@WebServlet("/HelloServlet")publicclassHelloServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{doPost(req,resp);}@OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{PrintWriterout=response.getWriter();out.print("WelcomeHelloServlet!");out.close();}}②
為項(xiàng)目配置Tomcat服務(wù)器,并將項(xiàng)目部署到Tomcat服務(wù)器。③
啟動(dòng)Tomcat服務(wù)器,在瀏覽器地址欄輸入http://localhost:8080/ServletProj_war_exploded/HelloServlet后按Enter鍵。輸出結(jié)果如圖5-3所示。配置Servlet如果@WebServlet中需要設(shè)置多個(gè)屬性,則屬性之間必須用逗號(hào)隔開,如下所示。@WebServlet(name="HelloServlet",loadOnStartup=1,urlPatterns={"/HelloServlet","*.action"},initParams={@WebInitParam(name="uname",value="admin"),@WebInitParam(name="charset",value="utf-8")})publicclassHelloServletextendsHttpServlet{}配置ServletServletConfig位于javax.servlet包中,ServletConfig接口類型的對(duì)象是Servlet的配置對(duì)象,封裝了<servlet>標(biāo)簽中的配置信息。它是一個(gè)接口,在Servlet的生命周期中,由服務(wù)器(如Tomcat)負(fù)責(zé)創(chuàng)建和初始化。當(dāng)Servlet容器初始化Servlet時(shí),會(huì)為這個(gè)Servlet創(chuàng)建一個(gè)ServletConfig對(duì)象,并將ServletConfig對(duì)象作為參數(shù)傳遞給Servlet。通過ServletConfig對(duì)象即可獲得當(dāng)前Servlet的初始化參數(shù)信息,即在web.xml中配置的<init-param>信息。ServletConfig接口的常用方法如表5-2所示。ServletConfig接口ServletConfig接口表5-2
ServletConfig接口的常用方法返回值類型方法功能描述StringgetInitParameter(Stringname)返回名稱為name的初始化參數(shù)的值,初始化參數(shù)在web.xml配置文件中進(jìn)行配置。如果參數(shù)不存在,返回nullEnumerationgetInitParameterNames()返回Servlet所有初始化參數(shù)的名稱的枚舉集合ServletContextgetServletContext()返回Servlet上下文對(duì)象的引用StringgetServletName()返回Servlet實(shí)例的名稱,這個(gè)名稱在Web應(yīng)用程序的部署描述符中指定。如果是一個(gè)沒有登記的Servlet實(shí)例,該方法返回的將是Servlet的類名可以通過以下兩種方式獲取ServletConfig對(duì)象。①Servlet接口中存在一個(gè)帶參數(shù)ServletConfig的init(ServletConfigconfig)方法,可以直接從該方法中獲取ServletConfig對(duì)象。②
通過GenericServlet類的getServletConfig()方法獲取ServletConfig對(duì)象。一個(gè)Web應(yīng)用程序中可以存在多個(gè)ServletConfig對(duì)象。每個(gè)Servlet對(duì)象對(duì)應(yīng)一個(gè)ServletConfig對(duì)象,且這個(gè)ServletConfig對(duì)象不能被其他Servlet對(duì)象共享。ServletConfig接口【例5-3】使用ServletConfig對(duì)象獲取配置信息中的初始化參數(shù)。案例技能點(diǎn):ServletConfig對(duì)象、getServletConfig()方法、getInitParameter()方法。實(shí)現(xiàn)步驟如下。①
在項(xiàng)目ServletProj的src目錄的cn.sdcet.servlet包中新建一個(gè)Servlet類,命名為TestServlet01。②
使用注解配置TestServlet01,配置名稱為uname和charset的初始化參數(shù)和值。③
在TestServlet01類中重寫doGet()、doPost()方法,調(diào)用getServletConfig()方法獲取ServletConfig對(duì)象,調(diào)用getInitParameter()方法獲取配置信息中參數(shù)uname和charset對(duì)應(yīng)的值。具體實(shí)現(xiàn)示例代碼如下。ServletConfig接口@WebServlet(name="TestServlet01",loadOnStartup=1,urlPatterns={"/TestServlet01","*.action"},initParams={@WebInitParam(name="uname",value="admin"),@WebInitParam(name="charset",value="utf-8")})publicclassTestServlet01extendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{PrintWriterout=response.getWriter();//獲取ServletConfig對(duì)象ServletConfigconfig=this.getServletConfig();//獲取配置信息中的初始化參數(shù)Stringuname=config.getInitParameter("uname");Stringcharset=config.getInitParameter("charset");out.println("uname="+uname);out.println("charset="+charset);out.close();}@OverrideprotectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doGet(request,response);}}ServletConfig接口④
啟動(dòng)Tomcat服務(wù)器,在瀏覽器地址欄中輸入http://localhost:8080/ServletProj_war_exploded/TestServlet01后按Enter鍵。輸出結(jié)果如圖5-4所示。ServletConfig接口一個(gè)ServletContext對(duì)象代表一個(gè)Web應(yīng)用程序的上下文,為整個(gè)Web應(yīng)用程序提供一個(gè)全局的共享區(qū)域。當(dāng)Web容器(如Tomcat)啟動(dòng)時(shí),它會(huì)為每個(gè)Web應(yīng)用程序創(chuàng)建一個(gè)對(duì)應(yīng)的ServletContext對(duì)象。這個(gè)對(duì)象在Web應(yīng)用程序的生命周期內(nèi)全局唯一,且所有Servlet和JSP頁(yè)面都可以訪問它。當(dāng)Web應(yīng)用程序被卸載或服務(wù)器關(guān)閉時(shí),ServletContext對(duì)象會(huì)被銷毀。ServletContext接口中的常用方法如表5-3所示,Servlet容器提供了這個(gè)接口所有方法的具體實(shí)現(xiàn)。ServletContext接口ServletContext接口返回值類型方法功能描述ObjectgetAttribute(Stringname)根據(jù)給定的屬性名返回設(shè)定的值EnumerationgetAttributeNames()返回一個(gè)Enumeration對(duì)象,它包含了存儲(chǔ)在ServletContext對(duì)象中的所有屬性名voidsetAttribute(Stringname,Objectobject)把一個(gè)對(duì)象和一個(gè)屬性名綁定,將這個(gè)對(duì)象存儲(chǔ)在ServletContext中voidremoveAttribute(Stringname)根據(jù)給定的屬性名從ServletContext中刪除相應(yīng)的屬性ServletContext接口返回值類型方法功能描述StringgetInitParameter(Stringname)根據(jù)給定的參數(shù)名獲取初始化參數(shù)的值??梢栽趙eb.xml中使用<context-param>元素定義上下文的初始化參數(shù),這些參數(shù)被整個(gè)Web應(yīng)用程序所使用RequestDispatchergetRequestDispatcher(Stringpath)返回一個(gè)RequestDispatcher對(duì)象,作為給定路徑下源的封裝??梢允褂肦equestDispatcher對(duì)象將一個(gè)請(qǐng)求轉(zhuǎn)發(fā)給其他資源進(jìn)行處理,或在響應(yīng)中包含資源URLgetResource(Stringpath)返回被映射到指定路徑的資源的URLInputStreamgetResourceAsStream(Stringpath)與getResource()方法類似,不同之處在于該方法返回資源的輸入流對(duì)象voidlog(Stringmsg)將指定消息寫入日志文件,在不指定日志文件時(shí)輸出到Console控制臺(tái)可以通過setAttribute(Stringname,Objectobj)方法向ServletContext中添加數(shù)據(jù),并通過getAttribute(Stringname)方法獲取數(shù)據(jù)??梢酝ㄟ^以下兩種方式獲取ServletContext對(duì)象。①Servlet容器在Servlet初始化期間向其傳遞一個(gè)ServletConfig對(duì)象,可以通過這個(gè)ServletConfig對(duì)象的getServletContext()方法來獲取ServletContext對(duì)象。②
通過GenericServlet類的getServletContext()方法來獲取ServletContext對(duì)象。Web應(yīng)用程序中的所有Servlet共享同一個(gè)ServletContext對(duì)象,不同Servlet之間可以通過ServletContext對(duì)象實(shí)現(xiàn)數(shù)據(jù)通信,因此ServletContext對(duì)象也稱為Context域?qū)ο?。JSP技術(shù)中講到的隱式對(duì)象application即ServletContext類型的對(duì)象。ServletContext接口【例5-4】使用ServletContext對(duì)象獲取Web應(yīng)用程序中的初始化參數(shù)。案例技能點(diǎn):ServletContext對(duì)象、getServletContext()方法、getInitParameter()方法實(shí)現(xiàn)步驟如下。①
在項(xiàng)目ServletProj的src目錄的cn.sdcet.servlet包中新建一個(gè)Servlet類,命名為TestServlet02。②
在web.xml配置文件中配置初始化信息,將<context-param>元素置于根元素<web-app>中,使用子元素<param-name>和<param-value>分別指定參數(shù)名和參數(shù)值。ServletContext接口<web-appxmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><context-param><param-name>weburl</param-name><param-value></param-value></context-param></web-app>【注】該配置信息屬于整個(gè)Web應(yīng)用程序的初始化信息,不屬于某個(gè)Servlet的初始化信息。ServletContext接口③
使用注解配置TestServlet02,重寫doGet()和doPost()方法,使用ServletContext接口獲取Web應(yīng)用程序的初始化參數(shù)。@WebServlet("/TestServlet02")publicclassTestServlet02extendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//獲取ServletContext對(duì)象ServletContextcontext=getServletContext();PrintWriterout=response.getWriter();//根據(jù)給定的參數(shù)名,返回Web應(yīng)用范圍內(nèi)匹配的初始化參數(shù)值out.println("URL:"+context.getInitParameter("weburl"));out.close();}@OverrideprotectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doGet(request,response);}}ServletContext接口④
啟動(dòng)Tomcat服務(wù)器,在瀏覽器地址欄輸入http://localhost:8080/ServletProj_war_exploded/TestServlet02后按Enter鍵。輸出結(jié)果如圖5-5所示。ServletContext接口在Web服務(wù)器運(yùn)行階段,Servlet容器收到HTTP瀏覽器或者其他HTTP客戶端發(fā)出的請(qǐng)求后,會(huì)創(chuàng)建一個(gè)HttpServletRequest請(qǐng)求對(duì)象和HttpServletResponse響應(yīng)對(duì)象,專門用于封裝HTTP請(qǐng)求消息和HTTP響應(yīng)消息。請(qǐng)求與響應(yīng)1.請(qǐng)求:HttpServletRequest接口客戶端通過瀏覽器發(fā)送HTTP請(qǐng)求來訪問服務(wù)器的資源,Servlet主要用來處理HTTP請(qǐng)求并做出響應(yīng)。ServletAPI中提供了一個(gè)HttpServletRequest接口,它繼承自ServletRequest接口,ServletRequest中定義了一系列獲取請(qǐng)求參數(shù)的方法。HttpServletRequest對(duì)象專門用于封裝HTTP請(qǐng)求消息(又稱request對(duì)象)。HTTP請(qǐng)求消息分為請(qǐng)求行、請(qǐng)求消息頭和請(qǐng)求消息體3部分,所以HttpServletRequest接口中定義了獲取請(qǐng)求行、請(qǐng)求頭和請(qǐng)求消息體的相關(guān)方法,并從父類ServletRequest中繼承了請(qǐng)求相關(guān)方法。ServletRequest及HttpServletRequest中的常用方法如表5-4所示。請(qǐng)求與響應(yīng)(1)獲取請(qǐng)求行信息訪問Servlet時(shí),請(qǐng)求消息的請(qǐng)求行中包含請(qǐng)求方法、請(qǐng)求資源名、請(qǐng)求路徑等信息,通過HttpServletRequest對(duì)象可以方便地獲取到請(qǐng)求行的相關(guān)信息。請(qǐng)求與響應(yīng)【例5-5】通過HttpServletRequest對(duì)象獲取請(qǐng)求行的相關(guān)信息。案例技能點(diǎn):HttpServletRequest獲取請(qǐng)求行信息的常用方法實(shí)現(xiàn)步驟如下。①
在項(xiàng)目ServletProj的src目錄的cn.sdcet.servlet包中新建一個(gè)Servlet類,命名為TestServlet03。②
使用注解配置TestServlet03,重寫doGet()和doPost()方法,獲取請(qǐng)求行信息,代碼示例如下。請(qǐng)求與響應(yīng)請(qǐng)求與響應(yīng)@WebServlet("/TestServlet03")publicclassTestServlet03extendsHttpServlet{
@Override
protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
response.setContentType("text/html;charset=utf-8");
PrintWriterout=response.getWriter();
//獲取HTTP請(qǐng)求消息中的請(qǐng)求方式(如GET、POST)
out.println("請(qǐng)求方式:"+request.getMethod()+"<br>");
//獲取請(qǐng)求行中的資源名部分
out.println("資源名部分:"+request.getRequestURI()+"<br>");
//獲取請(qǐng)求行中的參數(shù)部分
out.println("參數(shù)部分:"+request.getQueryString()+"<br>");
//獲取請(qǐng)求行中的協(xié)議名和版本
out.println("協(xié)議名和版本:"+request.getProtocol()+"<br>");
//獲取請(qǐng)求URL所屬Web應(yīng)用程序的路徑
out.println("Web應(yīng)用程序的路徑:"+request.getContextPath()+"<br>");
//獲取Servlet所映射的路徑
out.println("Servlet所映射的路徑:"+request.getServletPath()+"<br>");
out.close();
}
@Override
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
doGet(request,response);
}}③
啟動(dòng)Tomcat服務(wù)器,在瀏覽器地址欄輸入http://localhost:8080/ServletProj_war_exploded/TestServlet03?name=admin后按Enter鍵。輸出結(jié)果如圖5-6所示。請(qǐng)求與響應(yīng)(2)獲取請(qǐng)求頭信息訪問Servlet時(shí),需要通過請(qǐng)求頭向服務(wù)器傳遞附加信息,通過HttpServletRequest對(duì)象可以方便地獲取到請(qǐng)求頭的相關(guān)信息。請(qǐng)求與響應(yīng)【例5-6】通過HttpServletRequest對(duì)象獲取請(qǐng)求頭的相關(guān)信息。案例技能點(diǎn):HttpServletRequest獲取請(qǐng)求頭信息的常用方法實(shí)現(xiàn)步驟如下。①
在項(xiàng)目ServletProj的src目錄的cn.sdcet.servlet包中新建一個(gè)Servlet類,命名為TestServlet04。②
使用注解配置TestServlet04,重寫doGet()和doPost()方法,獲取請(qǐng)求頭信息,代碼示例如下。請(qǐng)求與響應(yīng)請(qǐng)求與響應(yīng)@WebServlet("/TestServlet04")publicclassTestServlet04extendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/html;charset=utf-8");PrintWriterout=response.getWriter();EnumerationheaderNames=request.getHeaderNames();while(headerNames.hasMoreElements()){StringheaderName=(String)headerNames.nextElement();Stringvalue=request.getHeader(headerName);out.println(headerName+":"+value+"<br>");}out.close();}@OverrideprotectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doGet(request,response);}}③
啟動(dòng)Tomcat服務(wù)器,在瀏覽器地址欄輸入http://localhost:8080/ServletProj_war_exploded/TestServlet04后按Enter鍵。輸出結(jié)果如圖5-7所示。請(qǐng)求與響應(yīng)(3)獲取請(qǐng)求參數(shù)在實(shí)際項(xiàng)目開發(fā)過程中,經(jīng)常需要獲取用戶提交的表單數(shù)據(jù),例如用戶名、密碼、個(gè)人愛好、電子郵箱地址等信息,使用HttpServletRequest接口的父類ServletRequest中定義的一系列方法可以獲取請(qǐng)求參數(shù)。請(qǐng)求與響應(yīng)(4)請(qǐng)求轉(zhuǎn)發(fā)在JavaWeb開發(fā)中,請(qǐng)求轉(zhuǎn)發(fā)是Servlet規(guī)范中定義的一種機(jī)制,請(qǐng)求轉(zhuǎn)發(fā)是一種在服務(wù)器內(nèi)部將請(qǐng)求從一個(gè)資源(如Servlet1)轉(zhuǎn)發(fā)到另一個(gè)資源(如Servlet2、JSP頁(yè)面或HTML文件)的過程,而客戶端(如瀏覽器)對(duì)此過程并不知情。這種機(jī)制允許開發(fā)者在服務(wù)器端對(duì)請(qǐng)求進(jìn)行預(yù)處理、后處理或重定向到不同的處理邏輯,而不需要客戶端重新發(fā)起請(qǐng)求。請(qǐng)求轉(zhuǎn)發(fā)屬于服務(wù)器行為。Servlet容器接收請(qǐng)求后,會(huì)先對(duì)請(qǐng)求做一些預(yù)處理,然后將請(qǐng)求傳遞給其他Web資源來完成包括生成響應(yīng)在內(nèi)的后續(xù)工作。請(qǐng)求轉(zhuǎn)發(fā)的工作流程如圖5-8所示。請(qǐng)求與響應(yīng)請(qǐng)求轉(zhuǎn)發(fā)的相關(guān)特性如下。①
地址欄中的URL不變。由于請(qǐng)求轉(zhuǎn)發(fā)是在服務(wù)器端進(jìn)行的,所以瀏覽器的地址欄中顯示的URL不會(huì)改變。這與重定向不同,重定向會(huì)向客戶端發(fā)送一個(gè)狀態(tài)碼(通常是302),并告訴客戶端去請(qǐng)求一個(gè)新的URL,此時(shí)瀏覽器地址欄中的URL會(huì)改變。請(qǐng)求與響應(yīng)②
共享請(qǐng)求和響應(yīng)對(duì)象。在請(qǐng)求轉(zhuǎn)發(fā)的過程中,原始的請(qǐng)求(HttpServletRequest)和響應(yīng)(HttpServletResponse)對(duì)象會(huì)被共享。這意味著轉(zhuǎn)發(fā)鏈中的各個(gè)組件可以訪問和修改請(qǐng)求和響應(yīng)對(duì)象的屬性,從而實(shí)現(xiàn)數(shù)據(jù)的傳遞和共享。③
可以被轉(zhuǎn)發(fā)到當(dāng)前Web應(yīng)用程序中的任何資源,但不能被轉(zhuǎn)發(fā)到其他Web應(yīng)用程序。請(qǐng)求可以被轉(zhuǎn)發(fā)到同一個(gè)Web應(yīng)用程序中的任何資源,如Servlet、JSP頁(yè)面、HTML文件等。但是,它不能被轉(zhuǎn)發(fā)到另一個(gè)Web應(yīng)用程序的資源,除非使用分布式請(qǐng)求轉(zhuǎn)發(fā)技術(shù)(如遠(yuǎn)程調(diào)用)。請(qǐng)求與響應(yīng)(5)傳遞數(shù)據(jù)HttpServletRequest對(duì)象不僅可以獲取請(qǐng)求行信息、請(qǐng)求頭信息及請(qǐng)求參數(shù)等一系列數(shù)據(jù),還可以通過屬性傳遞數(shù)據(jù)。請(qǐng)求與響應(yīng)【例5-7】獲取用戶提交的用戶名及密碼,經(jīng)RegisterServlet和ResultServlet處理后將用戶名輸出到頁(yè)面中。案例技能點(diǎn):獲取請(qǐng)求參數(shù)方法,請(qǐng)求轉(zhuǎn)發(fā)方法,傳遞數(shù)據(jù)方法。實(shí)現(xiàn)步驟如下。請(qǐng)求與響應(yīng)①
在項(xiàng)目ServletProj的web目錄下新建register.jsp,代碼示例如下。<html><head><title>用戶注冊(cè)</title><metahttp-equiv="content-type"content="text/html;charset=utf-8"></head><body><formmethod="post"action="RegisterServlet">
用戶名:<inputtype="text"name="username"><br>
密碼:<inputtype="password"name="userpwd"><br><inputtype="submit"value="注冊(cè)"><inputtype="reset"value="重置"></form></body></html>請(qǐng)求與響應(yīng)②
在項(xiàng)目ServletProj的cn.sdcet.servlet包中新建RegisterServlet,編寫代碼,并添加注解進(jìn)行配置,示例代碼如下。@WebServlet("/RegisterServlet")publicclassRegisterServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//設(shè)置請(qǐng)求字符編碼格式request.setCharacterEncoding("utf-8");//用于設(shè)置Servlet輸出內(nèi)容的MIME類型response.setContentType("text/html;charset=utf-8");//獲取請(qǐng)求參數(shù)StringuserName=request.getParameter("username");StringuserPwd=request.getParameter("userpwd");//通過setAttribute()方法設(shè)置屬性值request.setAttribute("username",userName);//請(qǐng)求轉(zhuǎn)發(fā)至ResultServletrequest.getRequestDispatcher("/ResultServlet").forward(request,response);}@OverrideprotectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doGet(request,response);}}請(qǐng)求與響應(yīng)③
在項(xiàng)目ServletProj的cn.sdcet.servlet包中新建ResultServlet,編寫代碼,并添加注解進(jìn)行配置,示例代碼如下。@WebServlet("/ResultServlet")publicclassResultServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/html;charset=utf-8");PrintWriterout=response.getWriter();//通過getAttribute()方法獲取屬性值StringuserName=(String)request.getAttribute("username");if(userName!=null){out.println("注冊(cè)成功!歡迎"+userName+"<br>");out.close();}}@OverrideprotectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doGet(request,response);}}請(qǐng)求與響應(yīng)請(qǐng)求與響應(yīng)④
重新啟動(dòng)Tomcat服務(wù)器,在瀏覽器地址欄輸入http://localhost:8080/ServletProj_war_exploded/register.jsp后按Enter鍵。⑤
在用戶名文本框中輸入“王小康”,在密碼文本框中輸入“123”,如圖5-9所示。單擊“注冊(cè)”按鈕,顯示結(jié)果如圖5-10所示。請(qǐng)求與響應(yīng)2.響應(yīng):HttpServletResponse接口ServletAPI中提供了一個(gè)HttpServletResponse接口,它繼承自ServletResponse接口。HttpServletResponse對(duì)象專門用來封裝HTTP響應(yīng)消息(又稱response對(duì)象)。ServletResponse接口為Servlet提供了返回響應(yīng)結(jié)果的方法,它允許Servlet設(shè)置返回?cái)?shù)據(jù)的長(zhǎng)度和MIME類型,并且提供了輸出流。ServletResponse子類HttpServletResponse可以提供更多和HTTP相關(guān)的方法,如提供設(shè)定HTTPHEAD信息的方法。ServletResponse及HttpServletResponse中的常用方法如表5-5所示。請(qǐng)求與響應(yīng)表5-5
ServletResponse及HttpServletResponse中的常用方法返回值類型方法描述voidaddHead
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 沙土買賣合同范本
- 醫(yī)療美容勞務(wù)合同范本
- 保健按摩復(fù)習(xí)題與參考答案
- 業(yè)績(jī)差檢討書
- 世界糧食日宣傳的活動(dòng)總結(jié)
- 各類商標(biāo)授權(quán)轉(zhuǎn)讓合同范本
- 上半年保安個(gè)人工作總結(jié)
- 三年級(jí)體育教學(xué)工作總結(jié)
- 水利工程師水力學(xué)試題與答案
- 廠房過戶合同范本
- 數(shù)據(jù)分析與可視化實(shí)踐第三版全套教學(xué)課件
- 甲狀旁腺疾病學(xué)習(xí)課件
- 消防隊(duì)消防產(chǎn)品培訓(xùn)課件
- 石油天然氣行業(yè)安全生產(chǎn)標(biāo)準(zhǔn)化建設(shè)
- 手術(shù)講解模板:分段診刮術(shù)課件
- 高中生學(xué)籍卡
- 2018年版電工-國(guó)家職業(yè)技能標(biāo)準(zhǔn)
- 反強(qiáng)迫勞動(dòng)反歧視反騷擾培訓(xùn)課件
- 軟件工程導(dǎo)論課件(全)
- EBS-發(fā)運(yùn)管理操作實(shí)例
- 中職生心理特征和常見心理問題
評(píng)論
0/150
提交評(píng)論