




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