版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
項(xiàng)目六Servlet技術(shù)
項(xiàng)目要
求本項(xiàng)目以Tomcat為例介紹javaweb技術(shù)如何基于Servlet工作,并進(jìn)一步利用Servlet規(guī)范的三大高級(jí)特性(Filter、Listener、文件上傳與下載)實(shí)現(xiàn)request、response對(duì)象的攔截修改,完成context、session、request事件的監(jiān)聽處理,并結(jié)合Commons-FileUpload組件實(shí)現(xiàn)文件上傳與下載功能。
項(xiàng)目分
析要完成項(xiàng)目任務(wù),至少需要具備兩個(gè)基本條件:一是掌握Servlet及其工作原理,二是掌握Servlet規(guī)范的三大高級(jí)特性,該項(xiàng)目分3個(gè)任務(wù),分別是實(shí)現(xiàn)并配置Servlet程序、應(yīng)用HttpServletRequest和HttpServletResponse對(duì)象實(shí)現(xiàn)用戶登錄、應(yīng)用Commons-FileUpload和Filter實(shí)現(xiàn)文件上傳與下載。
項(xiàng)目目
標(biāo)【知識(shí)目標(biāo)】掌握Servlet的基本概念、特點(diǎn)和接口;掌握Servlet的配置和生命周期;掌握ServletConfig和ServletContext接口的使用;掌握HttpServletRequest對(duì)象,和HttpServletResponse對(duì)象;掌握Filter的映射與過濾器鏈、Listener的使用;掌握文件上傳和下載流程。
項(xiàng)目目
標(biāo)【能力目標(biāo)】能熟練使用eclipse工具開發(fā)Servlet、Filter、Listener程序;能夠熟練使用Filter對(duì)Request、response對(duì)象攔截,實(shí)現(xiàn)特定功能;能夠熟練使用Commons-FileUpload組件實(shí)現(xiàn)文件的上傳與下載;會(huì)使用Listener監(jiān)聽ServletContext、HttpSession、ServletRequest對(duì)象的相關(guān)事件?!舅刭|(zhì)目標(biāo)】培養(yǎng)學(xué)生的團(tuán)隊(duì)合作意識(shí),自主學(xué)習(xí)能力。
知識(shí)導(dǎo)
圖任務(wù)一實(shí)現(xiàn)并配置Servlet程序--任務(wù)演示在本次學(xué)習(xí)任務(wù)中,我們將創(chuàng)建一個(gè)Servlet程序,并對(duì)其進(jìn)行配置,從而使Servlet程序正確地運(yùn)行在服務(wù)器中并處理請(qǐng)求信息,最終動(dòng)態(tài)生成一個(gè)網(wǎng)頁(yè),在該網(wǎng)頁(yè)顯示“自主創(chuàng)新,中國(guó)軟件從追趕到超越”,如圖6-1所示。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–知識(shí)準(zhǔn)備了解Servlet特點(diǎn)理解Servlet生命周期熟悉Servlet接口認(rèn)識(shí)Servlet掌握HttpServlet類配置Servlet1.認(rèn)識(shí)ServletServlet是運(yùn)行在Web服務(wù)器端的Java應(yīng)用程序,用于處理客戶端的Servlet請(qǐng)求,具有動(dòng)態(tài)生成網(wǎng)頁(yè)、實(shí)現(xiàn)與其它服務(wù)器資源的通信(如數(shù)據(jù)庫(kù))等功能。Servlet程序必須運(yùn)行在Servlet容器中(如Tomcat、Jetty、Resin等),Servlet容器負(fù)責(zé)按照規(guī)則加載、運(yùn)行Servlet程序。用戶訪問Servlet的流程如圖6-2所示??蛻舳薙ervlet容器ServletHTTP請(qǐng)求HTTP請(qǐng)求調(diào)用servlet返回處理結(jié)果2.了解Servlet特點(diǎn)Servlet不僅具有Java語(yǔ)言的有點(diǎn),還對(duì)web相關(guān)應(yīng)用進(jìn)行了封裝。因此,在功能、性能、安全性等方面都十分優(yōu)秀。Servlet的技術(shù)特點(diǎn)表現(xiàn)在以下五個(gè)方面:(1)功能強(qiáng)大:Servlet不僅可以調(diào)用JavaAPI中的對(duì)象及方法,還可以調(diào)用Servlet封裝的ServletAPI編程接口。因此,Servlet在業(yè)務(wù)功能方面十分強(qiáng)大。(2)可移植:Servlet使用Java語(yǔ)言編寫,而Java語(yǔ)言是跨平臺(tái)的,因此Servlet可以運(yùn)行到多個(gè)系統(tǒng)平臺(tái)中。2.了解Servlet特點(diǎn)(3)性能高:Servlet只在第一次被請(qǐng)求時(shí)進(jìn)行實(shí)例化,然后便常駐內(nèi)存,以后的請(qǐng)求都由該實(shí)例進(jìn)行處理,即每一個(gè)請(qǐng)求對(duì)應(yīng)一個(gè)線程,而不是進(jìn)程。(4)安全性高:Servlet不僅使用了Java的安全框架,還有Servlet容器提供的安全功能,因此,安全性非常高。(5)可擴(kuò)展:由于Java語(yǔ)言是面向?qū)ο蟮木幊陶Z(yǔ)言,所以Servlet可以通過封裝、繼承等特性擴(kuò)展實(shí)際的業(yè)務(wù)需要。3.理解Servlet生命周期Servlet是Java語(yǔ)言編寫的應(yīng)用程序,而Java語(yǔ)言中,所有對(duì)象都有生命周期。Servlet的生命周期總體分為3個(gè)階段,按照先后順序排列,分別是初始化階段(只有1次)、運(yùn)行階段(重復(fù)執(zhí)行)、銷毀階段(只有1次)。(1)初始化階段當(dāng)客戶端向Servlet容器發(fā)出HTTP請(qǐng)求,指明要訪問某個(gè)Servlet時(shí),Servlet容器首先會(huì)解析請(qǐng)求,檢查內(nèi)存中是否已經(jīng)有了該Servlet對(duì)象,如果有,直接使用該Servlet對(duì)象;如果沒有,就創(chuàng)建Servlet實(shí)例對(duì)象,然后通過調(diào)用init()方法完成Servlet的初始化,如建立數(shù)據(jù)庫(kù)連接、獲取配置信息等。注意,在Servlet的整個(gè)生命周期內(nèi),它的init()方法只被調(diào)用一次。3.理解Servlet生命周期此外,Servlet對(duì)象一旦創(chuàng)建就會(huì)駐留在內(nèi)存中,等待客戶端的訪問,直到服務(wù)器關(guān)閉,或web應(yīng)用被移除出容器時(shí)Servlet對(duì)象才會(huì)銷毀。(2)運(yùn)行階段在運(yùn)行階段,Servlet容器會(huì)將客戶端的HTTP請(qǐng)求封裝成ServletRequest對(duì)象,并創(chuàng)建一個(gè)ServletResponse對(duì)象,該ServletResponse對(duì)象用于表示Servlet處理生成的響應(yīng)結(jié)果。然后,Servlet容器會(huì)將創(chuàng)建的ServletRequest對(duì)象和ServletResponse對(duì)象作為參數(shù),傳遞給Servlet程序的service()方法。由此,service()方法就可以從傳遞過來的ServletRequest對(duì)象參數(shù)中獲取客戶端的請(qǐng)求信息并進(jìn)行處理,并通過傳遞過來的ServletResponse對(duì)象生成返回給客戶端的響應(yīng)結(jié)果。3.理解Servlet生命周期注意,在Servlet的生命周期內(nèi),它的service()方法會(huì)被反復(fù)調(diào)用執(zhí)行,即每一次對(duì)于Servlet的訪問請(qǐng)求,Servlet容器都會(huì)創(chuàng)建新的ServletRequest對(duì)象和ServletResponse對(duì)象作為參數(shù),并調(diào)用執(zhí)行一次Servlet的service()方法。(3)銷毀階段當(dāng)Servlet所在的web應(yīng)用程序被移除或者是服務(wù)器被關(guān)閉時(shí),Servlet容器會(huì)調(diào)用Servlet的destroy()方法,以便讓Servlet對(duì)象釋放它所占用的資源。注意,在Servlet的整個(gè)生命周期中,destroy()方法也只被調(diào)用一次。4.熟悉Servlet接口SUN公司為開發(fā)人員提供了Servlet開發(fā)相關(guān)的一系列接口和類,其中最重要的是Javax.servlet.Servlet接口,所有Servlet類都必須實(shí)現(xiàn)這個(gè)接口,才能接收和響應(yīng)用戶的請(qǐng)求。在Servlet接口中定義了5個(gè)抽象方法,用于初始化、處理、銷毀servlet,具體如表6-1所示。4.熟悉Servlet接口4.熟悉Servlet接口注意,表6-1中的init()、service()、destroy()方法都由Servlet容器來調(diào)用,而且Servlet容器會(huì)在Servlet生命周期的不同階段分別調(diào)用上述3個(gè)方法,因此,我們可以通過上述3個(gè)方法表現(xiàn)Servlet的生命周期。5.掌握HttpServlet類SUN公司專門為Servlet接口提供了兩個(gè)默認(rèn)的接口實(shí)現(xiàn)類:GenericServlet和HttpServlet。GenericServlet是一個(gè)抽象類,該類為Servlet接口提供了部分實(shí)現(xiàn),它并沒有實(shí)現(xiàn)HTTP請(qǐng)求處理。而HttpServlet是GenericServlet的子類,它繼承了GenericServlet的所有方法,并且為HTTP請(qǐng)求中的POST、GET等類型提供了具體的操作方法。因此,開發(fā)人員編寫的Servlet類一般都繼承自HttpServlet類,即在實(shí)際開發(fā)中使用的具體的Servlet對(duì)象就是HttpServlet對(duì)象。使用HttpServlet類的實(shí)例對(duì)象處理客戶端的HTTP請(qǐng)求時(shí),根據(jù)HTTP請(qǐng)求類型的不同涉及到了如表6-2所示的兩個(gè)常用方法。5.掌握HttpServlet類6.配置Servlet對(duì)Servlet進(jìn)行適當(dāng)?shù)呐渲茫拍苷_運(yùn)行并處理請(qǐng)求信息。Servlet的配置可以通過配置文件web.xml和使用@WebServlet注解兩種方式實(shí)現(xiàn)。注意,如果多個(gè)Servlet都在web.xml文件中配置會(huì)非常繁瑣,因此建議使用Servlet3.0之后提供的@WebServlet注解,簡(jiǎn)化Servlet配置,本章將重點(diǎn)講解@WebServlet注解。項(xiàng)目部署時(shí),容器會(huì)根據(jù)@WebServlet注解的屬性配置將相應(yīng)的類部署為Servlet,@WebServlet注解的常用屬性如表6-3所示。6.配置Servlet6.配置Servlet注意,任何一個(gè)繼承了HttpServlet類的子類都可以使用@WebServlet注解進(jìn)行標(biāo)注。如【例6-1-1】所示,TestServlet類繼承了HttpServlet類,我們?cè)谠擃惖纳戏绞褂聾WebServlet注解將其標(biāo)注為一個(gè)Servlet,name屬性指定了該Servlet的名字為TestServlet,urlPatterns屬性指定了訪問該Servlet的URL地址。注意,如果需要在@WebServlet注解中設(shè)置多個(gè)屬性,屬性之間用逗號(hào)隔開,如該例中的name屬性和urlPatterns屬性之間使用逗號(hào)間隔開了。6.配置Servlet【例6-1-1】配置Servlet@WebServlet(name="TestServlet",urlPatterns="/TestServlet")
publicclassTestServletextendsHttpServlet{
//處理GET方法請(qǐng)求的方法
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponse response)throwsServletException,IOException{}
//處理POST方法請(qǐng)求的方法
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponse response)throwsServletException,IOException{}}。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)實(shí)施任務(wù)要求:(1)使用eclipse創(chuàng)建一個(gè)Servlet程序。(2)使用@WebServlet注解對(duì)該Servlet程序進(jìn)行配置。(3)請(qǐng)求訪問該Servlet程序,動(dòng)態(tài)生成一個(gè)網(wǎng)頁(yè),在該網(wǎng)頁(yè)顯示“自主創(chuàng)新,中國(guó)軟件從追趕到超越”。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)實(shí)施第一步:新建DynamicWebProject項(xiàng)目,項(xiàng)目名為chapter06任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)實(shí)施②點(diǎn)擊“next”按鈕,再單擊下一步,并選擇ApacheTomcatv8.0”,如圖6-4所示。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)實(shí)施第二步:新建Servlet程序①在chapter06項(xiàng)目中,打開JavaResource文件夾,然后右鍵點(diǎn)擊“src”文件夾,選擇“New”-“Servlet”,如圖6-5所示。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)實(shí)施②打開“CreateServlet”窗口,在窗口中輸入Classname的值為“TestServlet”,如圖6-6所示。③在圖6-6中,點(diǎn)擊“Finish”按鈕,便會(huì)自動(dòng)創(chuàng)建類名為“TestServlet”的Servlet類,它繼承了HttpServlet類,并自動(dòng)生成了名字為doGet()和doPost()的方法,分別用于處理GET請(qǐng)求和POST請(qǐng)求,如【例6-1-2】所示。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)實(shí)施【例6-1-2】TestServlet類importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***ServletimplementationclassTestServlet*/@WebServlet("/TestServlet")publicclassTestServletextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L;
/***@seeHttpServlet#HttpServlet()*/publicTestServlet(){super();//TODOAuto-generatedconstructorstub} /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub } /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub }}。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)實(shí)施第三步:配置Servlet程序在【例6-1-2】中,第10行代碼@WebServlet("/TestServlet")將TestServlet類標(biāo)注為Servlet程序,我們將該行代碼改為:@WebServlet(name="TestServlet",urlPatterns="/TestServlet")其中,name屬性設(shè)置了Servlet程序名為"TestServlet",urlPatterns屬性設(shè)置了匹配Servlet的URL(即訪問該Servlet的URL為/TestServlet),如【例6-1-3】所示。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)實(shí)施【例6-1-3】修改@WebServlet("/TestServlet")后的TestServlet類importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***ServletimplementationclassTestServlet*/@WebServlet(name="TestServlet",urlPatterns="/TestServlet")publicclassTestServletextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L;/***@seeHttpServlet#HttpServlet()*/publicTestServlet(){super();//TODOAuto-generatedconstructorstub} /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub } /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub }}任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)實(shí)施第四步:修改doGet()方法,實(shí)現(xiàn)網(wǎng)頁(yè)內(nèi)容的動(dòng)態(tài)生成。在【例6-1-3】中,修改doGet()方法中的第27行代碼如下:
response.setContentType("text/html;charset=utf-8");PrintWriterout=response.getWriter();out.print("自主創(chuàng)新,中國(guó)軟件從追趕到超越");修改結(jié)果,如【例6-1-4】所示。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)實(shí)施【例6-1-4】修改doGet()方法后的TestServlet類importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***ServletimplementationclassTestServlet*/@WebServlet(name="TestServlet",urlPatterns="/TestServlet")publicclassTestServletextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L;/***@seeHttpServlet#HttpServlet()*/publicTestServlet(){super();//TODOAuto-generatedconstructorstub} /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub response.setContentType("text/html;charset=utf-8"); PrintWriterout=response.getWriter(); out.print("自主創(chuàng)新,中國(guó)軟件從追趕到超越"); } /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub }}任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)實(shí)施第五步:?jiǎn)?dòng)Tomcat服務(wù)器①在eclipse的主界面中,點(diǎn)擊“Run”-“Run”,如圖6-7所示。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)實(shí)施②在彈出的如圖6-8所示的“RunOnServer”窗口,點(diǎn)擊“Finish”按鈕,啟動(dòng)Tomcat服務(wù)器。Tomcat服務(wù)器啟動(dòng)成功之后,效果如圖6-9所示。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)實(shí)施第六步:訪問Servlet在eclipse的主界面點(diǎn)擊如圖6-10所示的“OpenWebBrowser”按鈕,進(jìn)而打開如圖6-11所示的瀏覽器窗口,在瀏覽器窗口輸入Servlet的訪問地址localhost:8080/chapter06/TestServlet,執(zhí)行效果如圖6-12所示。訪問地址localhost:8080/chapter06/TestServlet中的localhost:8080/chapter06是web項(xiàng)目的訪問地址,而/TestServlet則是注解@WebServlet(name="TestServlet",urlPatterns="/TestServlet")中的urlPatterns屬性設(shè)置的訪問該Servlet的URL地址信息。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)實(shí)施任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)拓展1理解ServletConfig接口在上例中,我們只是配置了Servlet的名字及訪問的URL地址,用于請(qǐng)求訪問該Servlet,但Servlet在運(yùn)行期間,經(jīng)常要用到一些配置信息,如文件使用的編碼等信息,這些信息我們都可以通過相應(yīng)的屬性,事先配置在@WebServlet注解中,但是如何在運(yùn)行期間來獲取并使用這些配置信息呢?我們可以通過ServletConfig實(shí)現(xiàn)。當(dāng)Servlet容器(如Tomcat)初始化一個(gè)Servlet時(shí),會(huì)將該Servlet的配置信息封裝到一個(gè)ServletConfig對(duì)象中,并通過調(diào)用init(ServletConfigconfig)方法將ServletConfig對(duì)象傳遞給Servlet實(shí)例。因此,在該Servlet的運(yùn)行期間,它可以通過調(diào)用ServletConfig接口定義的相關(guān)方法來獲取相應(yīng)的配置信息。ServletConfig獲取配置信息的方法如表6-4所示。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)拓展注意,上表中的getInitParameter()方法是獲取配置信息的常用方法,請(qǐng)務(wù)必掌握。此外,getServletContext()方法會(huì)獲取ServletContext對(duì)象,關(guān)于ServletContext對(duì)象我們?cè)诤罄m(xù)有具體講解。接下來,我們通過【例6-1-5】理解如何在運(yùn)行期間使用getInitParameter()方法是獲取配置信息。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)拓展【例6-1-5】在運(yùn)行期間使用getInitParameter()方法是獲取配置信息importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.Servlet;importjavax.servlet.ServletConfig;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebInitParam;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***ServletimplementationclassTestServlet2*/@WebServlet(name="TestServlet2",urlPatterns="/TestServlet2", initParams={@WebInitParam(name="encoding",value="UTF-8")})publicclassTestServlet2extendsHttpServlet{ privatestaticfinallongserialVersionUID=1L;/***@seeHttpServlet#HttpServlet()*/任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)拓展publicTestServlet2(){super();//TODOAuto-generatedconstructorstub} /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub ServletConfigconfig=this.getServletConfig();//實(shí)例化ServletConfig對(duì)象,對(duì)象名為config Stringencode_Param=config.getInitParameter("encoding");//使用getInitParameter方法獲取名字為encoding的參數(shù)對(duì)應(yīng)的參數(shù)值
//輸出得到的編碼信息
PrintWriterout=response.getWriter(); out.print("encoding="+encode_Param);
} /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub doGet(request,response); }}任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)拓展在【例6-1-5】的第16行代碼,我們?cè)贎WebServlet注解中使用WebInitParam屬性設(shè)置參數(shù)名為encoding的參數(shù)的參數(shù)值為“UTF-8”,即設(shè)置文件的編碼為“UTF-8”。然后,我們?cè)诘?1行使用getServletConfig()方法獲取ServletConfig對(duì)象,其對(duì)象名為config。接下來,在第32行我們通過對(duì)象名為config的ServletConfig對(duì)象調(diào)用getInitParameter()方法獲取名字為encoding的參數(shù)的參數(shù)值,即獲取文件編碼。最后,我們輸出獲取到的文件編碼信息,效果如圖6-13所示。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)拓展2理解ServletContext接口在一個(gè)Servlet容器(如Tomcat服務(wù)器)中,可能會(huì)同時(shí)運(yùn)行多個(gè)網(wǎng)站(即多個(gè)web應(yīng)用),如何來區(qū)分這些web應(yīng)用呢?我們可以使用ServletContext實(shí)現(xiàn)。Servlet容器會(huì)為每一個(gè)web應(yīng)用創(chuàng)建一個(gè)唯一的ServletContext對(duì)象,用于表示當(dāng)前Web應(yīng)用。ServletContext對(duì)象不僅封裝了當(dāng)前Web應(yīng)用的所有信息,還能夠?qū)崿F(xiàn)多個(gè)Servlet之間數(shù)據(jù)的共享。(1)獲取web應(yīng)用的初始化信息在web.xml文件中可以配置整個(gè)網(wǎng)站(web應(yīng)用)的初始化信息,如圖6-25所示,在web.xml文件中配置了參數(shù)organizer用于表示網(wǎng)站所有機(jī)構(gòu),其參數(shù)值為ChongqingVocationalCityCollege。此外,還設(shè)置了參數(shù)address用于表示地址,其參數(shù)值為Chongqing。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)拓展我們可以通過ServletContext接口的getInitParameterNames()和getInitParameter(Stringname)方法,分別獲取上述參數(shù)名和參數(shù)值,代碼如【例6-1-6】所示。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)拓展【例6-1-6】通過ServletContext接口獲取web應(yīng)用的初始化信息importjava.io.IOException;importjava.io.PrintWriter;importjava.util.Enumeration;importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***ServletimplementationclassTestServlet3*/@WebServlet(name="TestServlet3",urlPatterns="/TestServlet3")publicclassTestServlet3extendsHttpServlet{ privatestaticfinallongserialVersionUID=1L;/***@seeHttpServlet#HttpServlet()*/publicTestServlet3(){super();//TODOAuto-generatedconstructorstub}
任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)拓展 /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub ServletContextcontext=this.getServletContext();//獲取ServletContext對(duì)象,對(duì)象名為context Enumeration<String>paramNames=context.getInitParameterNames(); //通過對(duì)象名為context的ServletContext對(duì)象調(diào)用getInitParameterNames()方法獲取所有的初始化參數(shù)名,
//并將其保存到枚舉對(duì)象paramNames Stringname=paramNames.nextElement();//nextElement()方法可以依次獲取paramNames中的參數(shù)名字,每執(zhí)行一次獲取到一個(gè)參數(shù)名,
//并將當(dāng)前參數(shù)名保存到name變量中
Stringvalue=context.getInitParameter(name); //通過對(duì)象名為context的ServletContext對(duì)象調(diào)用getInitParameter()方法獲取name中的參數(shù)名所對(duì)應(yīng)的的參數(shù)值
//輸出獲取到的參數(shù)名及其參數(shù)值
PrintWriterout=response.getWriter(); out.print(name+":"+value); } /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub }}。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)拓展其中,第29行調(diào)用getServletContext()方法獲取ServletContext對(duì)象,對(duì)象名為context。第30行中對(duì)象名為context的ServletContext對(duì)象調(diào)用getInitParameterNames()方法獲取所有的初始化參數(shù)名,并將其保存到枚舉對(duì)象paramNames。第32行的nextElement()方法可以依次獲取paramNames中的參數(shù),每執(zhí)行一次獲取到一個(gè)參數(shù),此處,我們得到的是address參數(shù),參數(shù)名address被保存到到變量name中。第34行通過對(duì)象名為context的ServletContext對(duì)象調(diào)用getInitParameter()方法獲取變量name中的參數(shù)名address所對(duì)應(yīng)的參數(shù)值Chongqing,并保存到變量value中。執(zhí)行效果如圖6-15所示。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)拓展(2)多個(gè)Servlet共享數(shù)據(jù)由于web應(yīng)用有且只有一個(gè)ServletContext對(duì)象,而ServletContext對(duì)象的域?qū)傩杂挚梢员凰蠸ervlet訪問,因此,可以通過ServletContext對(duì)象的域?qū)傩詫?shí)現(xiàn)多個(gè)Servlet共享數(shù)據(jù)。ServletContext域?qū)傩缘某S貌僮鞣椒ㄈ绫?-5所示。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)拓展如【例6-1-7】所示,我們?cè)诿譃門estServlet4的Servlet程序的第31行,通過setAttribute()方法設(shè)置了ServletContext域?qū)傩詃ata,其值為“Thisisatestdata”。接下來,我們?cè)诹硪粋€(gè)名字為TestServlet5的Servlet程序中使用getAttibute()方法獲取ServletContext對(duì)象的名字為data的域?qū)傩缘闹担纭纠?-1-8】中的第31行代碼所示,執(zhí)行結(jié)果如圖6-16所示,結(jié)果表明通過ServletContext對(duì)象的域?qū)傩钥梢詫?shí)現(xiàn)多個(gè)Servlet共享數(shù)據(jù)。任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)拓展【例6-1-7】通過setAttribute()方法設(shè)置ServletContext域?qū)傩詃ataimportjava.io.IOException;importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***ServletimplementationclassTestServlet4*/@WebServlet(name="TestServlet4",urlPatterns="/TestServlet4")publicclassTestServlet4extendsHttpServlet{ privatestaticfinallongserialVersionUID=1L;/***@seeHttpServlet#HttpServlet()*/publicTestServlet4(){super();//TODOAuto-generatedconstructorstub} /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)拓展 protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub ServletContextcontext=this.getServletContext();//獲取ServletContext對(duì)象,對(duì)象名為contex context.setAttribute("data","Thisisatestdata");//通過名為context的ServletContext對(duì)象調(diào)用setAttribute()方法創(chuàng)建名字為data的域?qū)傩裕?/p>
//其值為Thisisatestdata } /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub }}任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)拓展 【例6-1-8】使用getAttibute()方法獲取ServletContext對(duì)象的data域?qū)傩灾礽mportjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***ServletimplementationclassTestServlet5*/@WebServlet(name="TestServlet5",urlPatterns="/TestServlet5")publicclassTestServlet5extendsHttpServlet{ privatestaticfinallongserialVersionUID=1L;
/***@seeHttpServlet#HttpServlet()*/publicTestServlet5(){super();//TODOAuto-generatedconstructorstub}任務(wù)一實(shí)現(xiàn)并配置Servlet程序–任務(wù)拓展 /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub ServletContextcontext=this.getServletContext();//獲取ServletContext對(duì)象,對(duì)象名為contex Stringdata=(String)context.getAttribute("data");//getAttibute()方法獲取ServletContext對(duì)象的名字為data的域?qū)傩缘闹?/p>
//并將其保存到變量data中
//輸出獲取到的屬性值
PrintWriterout=response.getWriter(); out.print(data); } /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub }}任務(wù)二應(yīng)用HttpServletRequest和HttpServletResponse對(duì)象實(shí)現(xiàn)用戶登錄--任務(wù)演示2022年6月1日,光明網(wǎng)刊發(fā)《<網(wǎng)絡(luò)安全法>五周年:網(wǎng)絡(luò)安全為人民網(wǎng)絡(luò)安全靠人民》,文中提到“作為我國(guó)網(wǎng)絡(luò)安全領(lǐng)域的基礎(chǔ)性法律,《網(wǎng)絡(luò)安全法》是我國(guó)網(wǎng)絡(luò)空間法治建設(shè)的重要里程碑”。對(duì)于動(dòng)態(tài)網(wǎng)站來說,用戶的賬號(hào)、密碼驗(yàn)證登錄是驗(yàn)證用戶身份,保障網(wǎng)絡(luò)安全的基本措施。本次任務(wù)我們將使用HttpServletRequest和HttpServletResponse對(duì)象實(shí)現(xiàn)用戶的驗(yàn)證登錄,如圖6-17、6-18所示。任務(wù)二應(yīng)用HttpServletRequest和HttpServletResponse對(duì)象實(shí)現(xiàn)用戶登錄--任務(wù)演示任務(wù)二應(yīng)用HttpServletRequest和HttpServletResponse對(duì)象實(shí)現(xiàn)用戶登錄—知識(shí)準(zhǔn)備掌握HttpServletResponse對(duì)象掌握HttpServletRequest對(duì)象實(shí)現(xiàn)請(qǐng)求重定向1掌握HttpServletRequest對(duì)象HttpServletRequest接口繼承自ServletRequest接口,用于封裝客戶端的HTTP請(qǐng)求信息,例如客戶端將用戶名、密碼傳送過來,請(qǐng)求訪問某個(gè)Servlet進(jìn)行驗(yàn)證登錄,其請(qǐng)求信息(用戶名、密碼等)就會(huì)被封裝成HttpServletRequest對(duì)象。不同的請(qǐng)求信息被封裝到HttpServletRequest對(duì)象中,又如何獲取呢?我們可以通過HttpServletRequest對(duì)象的不同種類的方法進(jìn)行獲取。(1)獲取請(qǐng)求行信息的相關(guān)方法當(dāng)客戶端發(fā)送HTTP請(qǐng)求信息訪問調(diào)用某個(gè)Servlet程序時(shí),請(qǐng)求信息的請(qǐng)求行中包含了請(qǐng)求方法、請(qǐng)求資源名、請(qǐng)求路徑等信息。為獲取這些請(qǐng)求行信息,我們可以使用如表6-6所示的相關(guān)獲取請(qǐng)求行信息的方法。1掌握HttpServletRequest對(duì)象1掌握HttpServletRequest對(duì)象為了便于理解各種獲取請(qǐng)求行相關(guān)信息的方法,TestServlet6演示了如何使用上述方法,如【例6-2-1】所示,運(yùn)行結(jié)果如圖6-19所示?!纠?-2-1】請(qǐng)求行信息獲取相關(guān)方法的應(yīng)用示例importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***ServletimplementationclassTestServlet6*/@WebServlet(name="TestServlet6",urlPatterns="/TestServlet6")publicclassTestServlet6extendsHttpServlet{ privatestaticfinallongserialVersionUID=1L;/***@seeHttpServlet#HttpServlet()*/
1掌握HttpServletRequest對(duì)象publicTestServlet6(){super();//TODOAuto-generatedconstructorstub} /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub PrintWriterout=response.getWriter(); //獲取請(qǐng)求行的相關(guān)信息
out.println("getMethod:"+request.getMethod()+"<br/>"); out.println("getRequestURI:"+request.getRequestURI()+"<br/>"); out.println("getQueryString:"+request.getQueryString()+"<br/>"); out.println("getProtocol:"+request.getProtocol()+"<br/>"); out.println("getContextPath:"+request.getContextPath()+"<br/>"); out.println("getPathInfo:"+request.getPathInfo()+"<br/>"); out.println("getPathTranslated:"+request.getPathTranslated()+"<br/>"); out.println("getServletPath:"+request.getServletPath()+"<br/>"); out.println("getRemoteAddr:"+request.getRemoteAddr()+"<br/>"); out.println("getRemoteHost:"+request.getRemoteHost()+"<br/>"); out.println("getRemotePort:"+request.getRemotePort()+"<br/>"); out.println("getLocalAddr:"+request.getLocalAddr()+"<br/>"); out.println("getLocalName:"+request.getLocalName()+"<br/>");
1掌握HttpServletRequest對(duì)象 out.println("getLocalPort:"+request.getLocalPort()+"<br/>"); out.println("getServerName:"+request.getServerName()+"<br/>"); out.println("getServerPort:"+request.getServerPort()+"<br/>"); out.println("getScheme:"+request.getScheme()+"<br/>"); out.println("getRequestURL:"+request.getRequestURL()+"<br/>"); } /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub }}。1掌握HttpServletRequest對(duì)象(2)獲取請(qǐng)求頭的相關(guān)方法當(dāng)客戶端請(qǐng)求訪問某個(gè)Servlet時(shí),我們會(huì)通過請(qǐng)求頭向服務(wù)器傳送附加信息,如客戶端可以接收的數(shù)據(jù)類型、語(yǔ)言等。那么我們?nèi)绾螐腍ttpServletRequest對(duì)象中獲取這些請(qǐng)求頭信息呢?可以通過如表6-7所示的獲取HTTP請(qǐng)求頭信息的相關(guān)方法實(shí)現(xiàn)。1掌握HttpServletRequest對(duì)象為了更好地掌握這些方法,我們?cè)赥estServlet7中以getHeader()方法為例,演示了如何使用getHeader()方法獲取客戶端瀏覽器所支持語(yǔ)言的請(qǐng)求頭信息,如【例6-2-2】所示,運(yùn)行結(jié)果如圖6-20所示。1掌握HttpServletRequest對(duì)象【例6-2-2】使用getHeader()方法獲取客戶端瀏覽器支持語(yǔ)言的請(qǐng)求頭信息importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***ServletimplementationclassTestServlet7*/@WebServlet(name="TestServlet7",urlPatterns="/TestServlet7")publicclassTestServlet7extendsHttpServlet{ privatestaticfinallongserialVersionUID=1L;/***@seeHttpServlet#HttpServlet()*/publicTestServlet7(){super();//TODOAuto-generatedconstructorstub} /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */1掌握HttpServletRequest對(duì)象 protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub Stringaccept_Language=request.getHeader("accept-language");//通過對(duì)象名為request的HttpServletRequest對(duì)象調(diào)用getHeader方法,
//獲取字段accept-language的值,即客戶端瀏覽器所支持的語(yǔ)言
PrintWriterout=response.getWriter(); out.print(accept_Language); } /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub }}。1掌握HttpServletRequest對(duì)象(3)獲取請(qǐng)求參數(shù)在動(dòng)態(tài)網(wǎng)站的實(shí)際運(yùn)行過程中,經(jīng)常會(huì)收到用戶提交的各種表單數(shù)據(jù),如登錄時(shí)用戶提交的用戶名、密碼等。HttpServletRequest對(duì)象提供了一系列用于獲取表單中的請(qǐng)求參數(shù)的方法,如表6-8所示。1掌握HttpServletRequest對(duì)象1掌握HttpServletRequest對(duì)象在實(shí)際應(yīng)用中,getParameter()和getParameterValues()是最基本的獲取請(qǐng)求參數(shù)的方法,其中,getParameter()方法用于獲取某個(gè)指定名稱的參數(shù)值(例如提交的用戶名、密碼等),而getParameterValues()方法用于獲取多個(gè)同名的參數(shù),例如提交的用戶愛好信息,因?yàn)橛脩艨赡苡卸鄠€(gè)愛好,在實(shí)際的頁(yè)面上我們會(huì)用多個(gè)同名的復(fù)選框供用戶選擇,所以像這種多個(gè)同名參數(shù)的獲取就必須使用getParameterValues()方法。如圖6-21所示的用戶注冊(cè)頁(yè)面,其對(duì)應(yīng)的網(wǎng)頁(yè)源代碼如【例6-2-3】所示,在【例6-2-3】中,我們可以看到用戶名、密碼的參數(shù)名(即文本框、密碼框的name屬性)是唯一的,而愛好的參數(shù)名(即復(fù)選框的name屬性)有4個(gè)一樣的(即多個(gè)同名參數(shù)),因此用戶名、密碼請(qǐng)求參數(shù)的獲取使用getParameter()方法,而愛好請(qǐng)求參數(shù)的獲取就需要使用getParameterValues()方法。注意,在【例6-2-3】的第9行的action屬性中明確指明了該表單的相關(guān)注冊(cè)信息將會(huì)提交給TestServlet8進(jìn)行處理,TestServlet8的代碼如【例6-2-4】所示。1掌握HttpServletRequest對(duì)象1掌握HttpServletRequest對(duì)象【例6-2-3】用戶注冊(cè)頁(yè)面源代碼<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><title>用戶注冊(cè)頁(yè)面</title></head>
<body><formaction="/chapter06/TestServlet8"method="POST">
用戶名:<inputtype="text"name="username"><br/>
密
碼:<inputtype="password"name="password"><br/>
愛好:
<inputtype="checkbox"name="hobby"value="basketball">籃球
<inputtype="checkbox"name="hobby"value="football">足球
<inputtype="checkbox"name="hobby"value="volleyball">排球
<inputtype="checkbox"name="hobby"value="badminton">羽毛球<br/> <inputtype="submit"value="提交"> </form></
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版門面房買賣合同附帶裝修及設(shè)備購(gòu)置協(xié)議4篇
- 二零二五年度勞動(dòng)合同終止后追訴期限及補(bǔ)償標(biāo)準(zhǔn)3篇
- 2025年度個(gè)人版權(quán)居間轉(zhuǎn)讓合同參考4篇
- 二零二五年度屋頂綠化苗木采購(gòu)及后期維護(hù)服務(wù)合同3篇
- 二零二五年度文化創(chuàng)意產(chǎn)業(yè)合作開發(fā)合同范本
- 二零二五年度企業(yè)社會(huì)責(zé)任與可持續(xù)發(fā)展咨詢合同范本
- 2025年貨物運(yùn)輸及包裝設(shè)計(jì)合同4篇
- 二零二五年度大數(shù)據(jù)分析處理服務(wù)合同11篇
- 2025年度品牌形象品牌合作推廣與品牌知名度提升合同
- 2025年度拌合料行業(yè)環(huán)保治理與合規(guī)性評(píng)估合同4篇
- 中小學(xué)心理健康教育課程標(biāo)準(zhǔn)
- 四年級(jí)上冊(cè)脫式計(jì)算400題及答案
- 新課標(biāo)人教版小學(xué)數(shù)學(xué)六年級(jí)下冊(cè)集體備課教學(xué)案全冊(cè)表格式
- 人教精通版三年級(jí)英語(yǔ)上冊(cè)各單元知識(shí)點(diǎn)匯總
- 小學(xué)四年級(jí)數(shù)學(xué)競(jìng)賽試題(附答案)
- 魯科版高中化學(xué)必修2全冊(cè)教案
- 人口分布 高一地理下學(xué)期人教版 必修第二冊(cè)
- 教案:第三章 公共管理職能(《公共管理學(xué)》課程)
- 諾和關(guān)懷俱樂部對(duì)外介紹
- 玩轉(zhuǎn)數(shù)和形課件
- 保定市縣級(jí)地圖PPT可編輯矢量行政區(qū)劃(河北省)
評(píng)論
0/150
提交評(píng)論