輕松學(xué)JavaWeb開(kāi)發(fā)之Servlet編程課件_第1頁(yè)
輕松學(xué)JavaWeb開(kāi)發(fā)之Servlet編程課件_第2頁(yè)
輕松學(xué)JavaWeb開(kāi)發(fā)之Servlet編程課件_第3頁(yè)
輕松學(xué)JavaWeb開(kāi)發(fā)之Servlet編程課件_第4頁(yè)
輕松學(xué)JavaWeb開(kāi)發(fā)之Servlet編程課件_第5頁(yè)
已閱讀5頁(yè),還剩79頁(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)介

第5章Servlet編程Servlet是Java

Web程序的核心。JSP和幾乎所有的Java

Web框架(如Struts、Webwork)在底層的實(shí)現(xiàn)都會(huì)看到Servlet的影子。因此,充分了解Servlet的原理和使用方法,對(duì)于以后學(xué)習(xí)Struts等Web框架將起到非常大的幫助。本章我們將為大家介紹Servlet的基礎(chǔ)知識(shí),并通過(guò)具體的示例介紹Servlet的強(qiáng)大功能。第5章Servlet編程Servlet是JavaWeb15.1Servlet基礎(chǔ)Servlet在本質(zhì)上就是Java類(lèi)。編寫(xiě)Servlet需要遵循Java的基本語(yǔ)法,但是與一般Java類(lèi)所不同的是。Servlet是只能運(yùn)行在服務(wù)器端的Java類(lèi),而且必需遵循特殊的規(guī)范,在運(yùn)行的過(guò)程中有自己的生命周期。5.1Servlet基礎(chǔ)Servlet在本質(zhì)上就是Jav25.1.1什么是ServletServlet是運(yùn)行于服務(wù)器端的、按照其自身規(guī)范編寫(xiě)的Java應(yīng)用程序。我們可以用圖5.1來(lái)解釋這個(gè)概念。Servlet的主要功能是用來(lái)接受、處理客戶(hù)端請(qǐng)求,并把處理結(jié)果返回到客戶(hù)端顯示。其作用過(guò)程如圖5.2所示。5.1.1什么是ServletServlet是運(yùn)行于服務(wù)35.1.2Servlet的生命周期Servlet需要在特定的容器中才能運(yùn)行,在這里所說(shuō)的容器即Servlet運(yùn)行的時(shí)候所需的運(yùn)行環(huán)境。一般情況下,市面上常見(jiàn)的JavaWebServer都可以支持Servlet,例如Tomcat、Resin、Weblogic、WebSphere等,在本書(shū)中采用Tomcat作為Servlet的容器,由Tomcat為Servlet提供基本的運(yùn)行環(huán)境。Servlet的生命周期指的是Servlet從被Web服務(wù)器加載到它被銷(xiāo)毀的整個(gè)生命過(guò)程。這個(gè)過(guò)程如圖5.3所示。5.1.2Servlet的生命周期Servlet需要在特45.1.2Servlet的生命周期從圖5.3中我們呢可以看出,Servlet生命周期的執(zhí)行大致分為4個(gè)步驟,如圖5.4所示。在以上幾個(gè)階段中,Servlet對(duì)外提供服務(wù)階段是最重要的。service()方法是編程人員真正要關(guān)心的方法。因?yàn)樗攀荢ervlet真正開(kāi)始響應(yīng)客戶(hù)端請(qǐng)求,并且處理業(yè)務(wù)邏輯的方法。service()接收到客戶(hù)端請(qǐng)求后,再調(diào)用該Servlet的相應(yīng)的方法去處理請(qǐng)求。所以程序員在編寫(xiě)自己的Servlet時(shí),一般只需要重寫(xiě)方法。在該方法中去處理客戶(hù)端請(qǐng)求,并把處理結(jié)果返回。5.1.2Servlet的生命周期從圖5.3中我們呢可以55.2簡(jiǎn)單Servlet開(kāi)發(fā)配置示例在這一節(jié)中我們主要應(yīng)用Servlet編寫(xiě)一個(gè)HelloWorld程序,實(shí)現(xiàn)向客戶(hù)端瀏覽器中輸出“HelloWorld”信息。在系統(tǒng)中創(chuàng)建的第一個(gè)Servlet程序系統(tǒng)會(huì)為我們自動(dòng)生成web.xml配置文件,但是以后的Servlet程序就需要我們自己來(lái)配置了。即一般情況下都需要在當(dāng)前應(yīng)用項(xiàng)目的web.xml配置文件中對(duì)各個(gè)Servlet進(jìn)行配置,其中web.xml文件的位置在當(dāng)前項(xiàng)目應(yīng)用的WEB-INF文件夾下。我們就結(jié)合圖5.8的示例來(lái)講解如何對(duì)Servlet進(jìn)行配置,如圖5.9所示。5.2簡(jiǎn)單Servlet開(kāi)發(fā)配置示例在這一節(jié)中我們主要應(yīng)65.2簡(jiǎn)單Servlet開(kāi)發(fā)配置示例總之,編寫(xiě)一個(gè)Servlet要經(jīng)過(guò)以下三個(gè)步驟:(1)編寫(xiě)Servlet的功能代碼,即實(shí)現(xiàn)功能的代碼類(lèi)。(2)把編譯成功的Servlet功能代碼類(lèi)文件拷貝到當(dāng)前應(yīng)用項(xiàng)目的WEB-INF/classes目錄下。(3)在當(dāng)前應(yīng)用項(xiàng)目的web.xml文件中對(duì)Servlet進(jìn)行配置,即在web.xml中添加配置信息。經(jīng)過(guò)這樣三個(gè)步驟我們就可以通過(guò)瀏覽器訪問(wèn)這個(gè)Servlet了。5.2簡(jiǎn)單Servlet開(kāi)發(fā)配置示例總之,編寫(xiě)一個(gè)Ser75.3使用HttpServlet處理客戶(hù)端請(qǐng)求HttpServlet是使用HTTP協(xié)議的Web服務(wù)器的Servlet類(lèi),這個(gè)類(lèi)已經(jīng)被系統(tǒng)定義好。該類(lèi)的一些方法,如doGet()方法、doPost()方法等,提供了處理客戶(hù)端請(qǐng)求的接口。在實(shí)際編程中,程序員需要繼承這個(gè)類(lèi),并重寫(xiě)上述方法,去編寫(xiě)自己的Servlet。使用重寫(xiě)后的方法,就可以完成對(duì)客戶(hù)端請(qǐng)求進(jìn)行處理。5.3使用HttpServlet處理客戶(hù)端請(qǐng)求HttpS85.3.1處理Get請(qǐng)求doGetdoGet()方法是HttpServlet類(lèi)中用來(lái)處理Get請(qǐng)求的方法。用戶(hù)通過(guò)繼承HttpServlet,重寫(xiě)doGet()方法,實(shí)現(xiàn)對(duì)客戶(hù)端的Get請(qǐng)求進(jìn)行處理。要調(diào)用doGet()方法,必須在客戶(hù)端的表單里指定請(qǐng)求的類(lèi)型為Get。doGet()方法的語(yǔ)法格式如圖5.10所示。5.3.1處理Get請(qǐng)求doGetdoGet()方法是H95.3.2處理Post請(qǐng)求doPostdoPost()是HttpServlet中用于處理Post請(qǐng)求的方法。如果要調(diào)用doPost()方法,必須在表單中指定Post請(qǐng)求。doPost()方法與doGet()方法的用法一般來(lái)說(shuō)沒(méi)什么區(qū)別,doGet()方法用于處理httpget請(qǐng)求,doPost()方法用于外理httppost請(qǐng)求。至于它們的不同,簡(jiǎn)單的說(shuō),get是通過(guò)httpheader來(lái)傳輸數(shù)據(jù),有字?jǐn)?shù)限制,而post則是通過(guò)httpbody來(lái)傳輸數(shù)據(jù),沒(méi)有字?jǐn)?shù)的限制。doPost()方法的語(yǔ)法格式如圖5.14所示。5.3.2處理Post請(qǐng)求doPostdoPost()是105.3.2處理Post請(qǐng)求doPost下面我們來(lái)為大家介紹一下javax.servlet.http提供的HTTPServlet應(yīng)用編程接口。創(chuàng)建Servlet,需要擴(kuò)展HttpServlet類(lèi),HttpServlet類(lèi)包含init()、destroy()、service()等方法,其中init()和destroy()方法是繼承的。具體的方法及方法描述如表5.1所示。當(dāng)服務(wù)器調(diào)用sevlet的Service()、doGet()和doPost()這三個(gè)方法時(shí),均需要“請(qǐng)求”和“響應(yīng)”對(duì)象作為參數(shù)?!罢?qǐng)求”對(duì)象提供有關(guān)請(qǐng)求的信息,而“響應(yīng)”對(duì)象提供了一個(gè)將響應(yīng)信息返回給瀏覽器的一個(gè)路徑。方法名方法描述init()方法服務(wù)器裝入Servlet時(shí)執(zhí)行??梢耘渲梅?wù)器,在啟動(dòng)服務(wù)器或客戶(hù)機(jī)首次訪問(wèn)Servlet時(shí)裝入Servletservice()方法Servlet的核心。每當(dāng)一個(gè)客戶(hù)請(qǐng)求一個(gè)HttpServlet對(duì)象,該對(duì)象的service()方法就要被調(diào)用,而且傳遞給這個(gè)方法一個(gè)"請(qǐng)求"(ServletRequest)對(duì)象和一個(gè)"響應(yīng)"(ServletResponse)對(duì)象作為參數(shù)destroy()方法在服務(wù)器停止且卸裝Servlet時(shí)執(zhí)行該方法??梢詫ervlet作為服務(wù)器進(jìn)程的一部分來(lái)關(guān)閉GetServletConfig()方法GetServletConfig()方法返回一個(gè)ServletConfig對(duì)象,該對(duì)象用來(lái)返回初始化參數(shù)和ServletContext。ServletContext接口提供有關(guān)servlet的環(huán)境信息GetServletInfo()方法GetServletInfo()方法是一個(gè)可選的方法,它提供有關(guān)servlet的信息,如作者、版本、版權(quán)等5.3.2處理Post請(qǐng)求doPost下面我們來(lái)為大家介115.4

JSP頁(yè)面調(diào)用Servlet在上面HelloWorld的示例程序中,我們直接在瀏覽器中輸入具體的地址進(jìn)行訪問(wèn)。在實(shí)際的應(yīng)用中,不可能讓用戶(hù)在瀏覽器中直接輸入Servlet的地址進(jìn)行訪問(wèn)。一般情況下,可以通過(guò)調(diào)用Servlet進(jìn)行訪問(wèn),在這里介紹通過(guò)提交表單和超鏈接兩種方式調(diào)用Servlet。5.4JSP頁(yè)面調(diào)用Servlet在上面HelloWor125.4.1通過(guò)表單提交調(diào)用Servlet在通過(guò)提交表單調(diào)用Servlet的時(shí)候,只需要把表單的action指向?qū)?yīng)的Servlet即可。5.4.1通過(guò)表單提交調(diào)用Servlet在通過(guò)提交表單調(diào)135.4.2通過(guò)超鏈接調(diào)用Servlet當(dāng)用戶(hù)有輸入的內(nèi)容需要提交給服務(wù)器時(shí),我們可以用表單來(lái)調(diào)用Servlet。如果在沒(méi)有輸入的數(shù)據(jù)內(nèi)容需要提交的情況下,我們可以直接通過(guò)超鏈接的方式來(lái)調(diào)用Servlet,并對(duì)其傳遞參數(shù)。5.4.2通過(guò)超鏈接調(diào)用Servlet當(dāng)用戶(hù)有輸入的內(nèi)容145.5

Servlet文件操作在JSP的開(kāi)發(fā)過(guò)程中,我們常常把相關(guān)內(nèi)容存儲(chǔ)為文件。在Servlet中我們可以使用輸入輸出流實(shí)現(xiàn)對(duì)文件的讀寫(xiě)。同時(shí),使用Servlet還可以很方便的實(shí)現(xiàn)文件的下載操作。這一節(jié)我們就來(lái)學(xué)習(xí)如何實(shí)現(xiàn)Servlet的文件操作。5.5Servlet文件操作在JSP的開(kāi)發(fā)過(guò)程中,我們常155.5.1Servlet讀取文件我們舉一個(gè)實(shí)例FileRead.java來(lái)讀取一個(gè)文本文件content.txt的內(nèi)容,并且在頁(yè)面上打印文件的內(nèi)容。5.5.1Servlet讀取文件我們舉一個(gè)實(shí)例FileR165.5.2Servlet寫(xiě)文件Servlet寫(xiě)文件的處理方法和讀取文件的處理方法非常類(lèi)似,即把文件輸入流換成文件輸出流。我們也可以來(lái)看一個(gè)寫(xiě)文件示例。5.5.2Servlet寫(xiě)文件Servlet寫(xiě)文件的處理175.5.3Servlet下載文件利用Servlet可以很方便地實(shí)現(xiàn)文件的下載,我們只需要對(duì)服務(wù)器的響應(yīng)對(duì)象response進(jìn)行簡(jiǎn)單的設(shè)置即可。5.5.3Servlet下載文件利用Servlet可以很185.6Servlet的應(yīng)用Servlet是與HTTP協(xié)議緊密結(jié)合的,使用Servlet幾乎可以處理HTTP協(xié)議各個(gè)方面的內(nèi)容,在本節(jié)的幾個(gè)示例程序中,將集中展示Servlet在HTTP方面的具體應(yīng)用。5.6Servlet的應(yīng)用Servlet是與HTTP協(xié)議195.6.1獲取請(qǐng)求信息頭部?jī)?nèi)容當(dāng)用戶(hù)訪問(wèn)一個(gè)頁(yè)面的時(shí)候,會(huì)提交一個(gè)HTTP請(qǐng)求給服務(wù)器的Servlet引擎,在這個(gè)請(qǐng)求中包含了HTTP文件的詳細(xì)屬性信息。我們可以應(yīng)用request.getHeaderNames()方法來(lái)獲取請(qǐng)求信息頭部?jī)?nèi)容。5.6.1獲取請(qǐng)求信息頭部?jī)?nèi)容當(dāng)用戶(hù)訪問(wèn)一個(gè)頁(yè)面的時(shí)候,205.6.2獲取請(qǐng)求信息在上面的Servlet示例中,我們?nèi)〕隽薍TTP文件頭信息,在Servlet中還可以很方便取出用戶(hù)發(fā)出請(qǐng)求對(duì)象自身的信息。這些信息是和用戶(hù)的請(qǐng)求密切相關(guān)的,例如用戶(hù)提交請(qǐng)求所使用的協(xié)議,客戶(hù)提交表單的方法是POST還是GET等。5.6.2獲取請(qǐng)求信息在上面的Servlet示例中,我們215.6.3獲取參數(shù)信息有關(guān)用戶(hù)請(qǐng)求的參數(shù)信息,也可以通過(guò)Servlet來(lái)獲取。這種參數(shù)既包括以POST方法或者是GET方法提交的表單,也包括直接使用超鏈接傳遞的參數(shù)。Servlet都可以使用request.getParameter()方法取得這些參數(shù)信息并且加以處理。5.6.3獲取參數(shù)信息有關(guān)用戶(hù)請(qǐng)求的參數(shù)信息,也可以通過(guò)225.6.4

Cookie操作Cookie是一種在客戶(hù)端保存信息的技術(shù)。讀者在瀏覽網(wǎng)頁(yè)時(shí)可能會(huì)注意到這樣的現(xiàn)象,如在打開(kāi)某個(gè)登錄網(wǎng)頁(yè)時(shí),在第一次打開(kāi)時(shí),用戶(hù)名文本框是空的,當(dāng)輸入一個(gè)用戶(hù)名,并成功登錄后。在第二次打開(kāi)這個(gè)登錄網(wǎng)頁(yè)時(shí),在第一次輸入的用戶(hù)名會(huì)被自動(dòng)填入這個(gè)用戶(hù)名文本框,就算重啟計(jì)算機(jī)后,仍然如此。其實(shí)這就是Cookie所起的作用。5.6.4Cookie操作Cookie是一種在客戶(hù)端保存235.6.4

Cookie操作在Servlet中,使用java.servlet.http.Cookie類(lèi)來(lái)封裝一個(gè)Cookie消息,在HttpServletResponse接口中定義了一個(gè)addCookie方法來(lái)向?yàn)g覽器發(fā)送Cookie消息(也就是Cookie對(duì)象),在HttpServletRequest接口中定義了一個(gè)getCookies方法來(lái)讀取瀏覽器發(fā)送的Web服務(wù)器的所有Cookie消息。Cookie類(lèi)中定義了生成和提取Cookie消息的各個(gè)屬性的方法。Cookie類(lèi)只有一個(gè)構(gòu)造方法,它的語(yǔ)法結(jié)構(gòu)如圖5.47所示。5.6.4Cookie操作在Servlet中,使用jav245.6.4

Cookie操作Cookie類(lèi)中的其他常用方法如表5.3所示。方法名方法描述getName方法用于獲得Cookie的名稱(chēng)setValue和getValue方法分別用于設(shè)置和獲得Cookie的值setMaxAge和getMaxAge方法分別用于設(shè)置和獲得Cookie在客戶(hù)機(jī)的有效時(shí)間,也就是在在客戶(hù)機(jī)上的有效秒數(shù)setPath和getPath方法分別用于設(shè)置和獲得當(dāng)前Cookie的有效Web路徑setDomain和getDomain方法分別用于設(shè)置和獲得當(dāng)前Cookie的有效域setComment和getComment方法分別用于設(shè)置和返回當(dāng)前Cookie的注釋部分setVersion與getVersion方法分別用于設(shè)置和獲得當(dāng)前Cookie的協(xié)議版本setSecure和getSecure方法分別用于設(shè)置和獲得當(dāng)前Cookie是否只能使用安全的協(xié)議傳輸Cookie5.6.4Cookie操作Cookie類(lèi)中的其他常用方法255.7Session技術(shù)session對(duì)象用來(lái)保存每個(gè)用戶(hù)的用戶(hù)信息和會(huì)話(huà)狀態(tài)。session對(duì)象由服務(wù)器端自動(dòng)創(chuàng)建,可以跟蹤每個(gè)用戶(hù)的操作狀態(tài)。用戶(hù)首次登錄系統(tǒng)時(shí)服務(wù)器會(huì)自動(dòng)給用戶(hù)分配唯一標(biāo)識(shí)的sessionid,可以用來(lái)區(qū)分開(kāi)其他用戶(hù)。相對(duì)于Cookie,session是存儲(chǔ)在服務(wù)器端的會(huì)話(huà),相對(duì)安全,而且其存儲(chǔ)長(zhǎng)度限制也大大的擴(kuò)大了。5.7Session技術(shù)session對(duì)象用來(lái)保存每個(gè)用265.7.1HttpSession接口方法在Servlet中使用HttpSession對(duì)象來(lái)描述Session。一個(gè)HttpSession對(duì)象就是一個(gè)Session。使用HttpServletRequest接口的getSession方法來(lái)獲得一個(gè)HttpSession對(duì)象。HttpSession接口中的主要方法如表5.4所示。方法名方法描述getId方法用于返回當(dāng)前HttpSession對(duì)象的SessionIDgetCreationTime方法用于返回當(dāng)前的HttpSession對(duì)象的創(chuàng)建時(shí)間getLastAccessedTime方法用于返回當(dāng)前HttpSession對(duì)象的上一次被訪問(wèn)的時(shí)間setMaxInactiveInterval和getMaxInactiveInterval方法分別用來(lái)設(shè)置和返回當(dāng)前HttpSession對(duì)象的可空閑的最長(zhǎng)時(shí)間(單位:秒),這個(gè)時(shí)間也就是當(dāng)前會(huì)話(huà)的有效間隔isNew方法用來(lái)判斷當(dāng)前的HttpSession對(duì)象是否是新創(chuàng)建的,如果是則返回true,否則返回falseisvalidate方法用于強(qiáng)制當(dāng)前的HttpSession對(duì)象失效,這樣Web服務(wù)器可以立即釋放該HttpSession對(duì)象getServletContext方法用于返回當(dāng)前HttpSession對(duì)象所屬的Web應(yīng)用程序的ServletContext對(duì)象setAttribute方法用于將一個(gè)String類(lèi)型的ID和一個(gè)對(duì)象相關(guān)聯(lián),并將其保存在當(dāng)前的HttpSession對(duì)象中g(shù)etAttribute方法用于返回一個(gè)和String類(lèi)型的ID相關(guān)聯(lián)的對(duì)象remoteAttribute方法用于刪除與一個(gè)String類(lèi)型的ID相關(guān)聯(lián)的對(duì)象5.7.1HttpSession接口方法在Servlet275.7.1HttpSession接口方法getSession是HttpServletRequest接口的方法,這個(gè)方法用于返回與當(dāng)前請(qǐng)求相關(guān)的HttpSession對(duì)象,該方法有兩種重載形式,它們的定義語(yǔ)法如圖5.52所示。5.7.1HttpSession接口方法getSessi285.7.2通過(guò)Cookie跟蹤Session客戶(hù)端必須通過(guò)一個(gè)SessionID才能找到以前在服務(wù)端創(chuàng)建的某一個(gè)HttpSession對(duì)象。通過(guò)SessionID找HttpSession對(duì)象的過(guò)程也叫做Session跟蹤。一般客戶(hù)端的SessionID通過(guò)HTTP請(qǐng)求消息頭的Cookie字段發(fā)送給服務(wù)端,然后服務(wù)端通過(guò)getSession方法讀取Cookie字段的值,以確定是否需要新建一個(gè)HttpSession對(duì)象,還是獲得一個(gè)已經(jīng)存在的HttpSession對(duì)象,或是什么都不做,直接返回null。當(dāng)HttpSession對(duì)象是第一次創(chuàng)建時(shí),向這個(gè)對(duì)象中寫(xiě)一個(gè)字符串值。如果HttpSession對(duì)象不是第一次創(chuàng)建,那么就將保存在HttpSession對(duì)象中的字符串值輸出到客戶(hù)端。5.7.2通過(guò)Cookie跟蹤Session客戶(hù)端必須通295.7.3通過(guò)重寫(xiě)URL跟蹤Session如果客戶(hù)端瀏覽器不支持Cookie或是將Cookie功能關(guān)閉,那么就無(wú)法使用Cookie來(lái)傳遞SessionID。為了在這種情況下仍然可以使用Session,Servlet規(guī)范提供了一種補(bǔ)充會(huì)話(huà)管理機(jī)制。這種管理機(jī)制允許在Cookie無(wú)法工作的情況下使用URL參數(shù)來(lái)傳遞SessionID。要想通過(guò)URL來(lái)發(fā)送SessionID,必須要重寫(xiě)URL。HttpServletResponse提供了兩個(gè)方法用于重寫(xiě)URL,如圖5.56所示。5.7.3通過(guò)重寫(xiě)URL跟蹤Session如果客戶(hù)端瀏覽305.8Servlet過(guò)濾器過(guò)濾器是小型的Web組件,它負(fù)責(zé)攔截請(qǐng)求和響應(yīng),以便查看、提取或以某種方式操作正在客戶(hù)機(jī)和服務(wù)器之間交換的數(shù)據(jù)。Servlet過(guò)濾器應(yīng)用非常廣泛,有攔截的地方一般都可以用到過(guò)濾器。當(dāng)前Web應(yīng)用中過(guò)濾器已經(jīng)是不可或缺的部分之一。5.8Servlet過(guò)濾器過(guò)濾器是小型的Web組件,它負(fù)315.8.1過(guò)濾器的方法和配置與過(guò)濾器相關(guān)的Servlet共包含3個(gè)簡(jiǎn)單的接口,分別是Filter、FilterChain及FilterConfig。要實(shí)現(xiàn)過(guò)濾器功能,必須先實(shí)現(xiàn)Filter接口。Filter接口定義了3個(gè)方法,如圖5.61所示。Servlets過(guò)濾器是一個(gè)Web應(yīng)用組件,和Servlet類(lèi)似,也需要在Web應(yīng)用配置文件(即web.xml)中進(jìn)行配置部署。5.8.1過(guò)濾器的方法和配置與過(guò)濾器相關(guān)的Servlet325.8.1過(guò)濾器的方法和配置對(duì)于過(guò)濾器的映射配置,可以將過(guò)濾器映射到一個(gè)或多個(gè)Servlet和JSP文件中。以Servlet為例,我們來(lái)看其映射配置,如圖5.63所示。注意:在web.xml中配置Servlet和Servlet過(guò)濾器,應(yīng)該先聲明過(guò)濾器元素,再聲明Servlet元素。5.8.1過(guò)濾器的方法和配置對(duì)于過(guò)濾器的映射配置,可以將335.8.2過(guò)濾器應(yīng)用實(shí)例——禁止未授權(quán)的IP訪問(wèn)站點(diǎn)在實(shí)際的應(yīng)用中,可能會(huì)遇到這樣的情況,需要對(duì)某些IP進(jìn)行訪問(wèn)限制,不讓非法的IP訪問(wèn)應(yīng)用系統(tǒng),這個(gè)時(shí)候就需要用到過(guò)濾器進(jìn)行限制,當(dāng)一個(gè)用戶(hù)發(fā)出訪問(wèn)請(qǐng)求的時(shí)候,首先通過(guò)過(guò)濾器進(jìn)行判斷,如果用戶(hù)的IP地址被限制,就禁止訪問(wèn),只有合法的IP才可以繼續(xù)訪問(wèn)。5.8.2過(guò)濾器應(yīng)用實(shí)例——禁止未授權(quán)的IP訪問(wèn)站點(diǎn)在實(shí)345.8.3過(guò)濾器應(yīng)用實(shí)例——版權(quán)過(guò)濾器現(xiàn)在的網(wǎng)頁(yè)都會(huì)在尾部加上版權(quán)標(biāo)志,對(duì)于這一操作,我們可以運(yùn)用過(guò)濾器很方便地實(shí)現(xiàn)它。5.8.3過(guò)濾器應(yīng)用實(shí)例——版權(quán)過(guò)濾器現(xiàn)在的網(wǎng)頁(yè)都會(huì)在尾355.9Servlet監(jiān)聽(tīng)器Servlet監(jiān)聽(tīng)器是當(dāng)今Web應(yīng)用開(kāi)發(fā)的一個(gè)重要組成部分。Servlet監(jiān)聽(tīng)器主要用來(lái)對(duì)Web應(yīng)用進(jìn)行監(jiān)聽(tīng)和控制,極大地增強(qiáng)了Web應(yīng)用的事件處理能力。一般來(lái)說(shuō),Servlet監(jiān)聽(tīng)就是指一些特殊的Servlet類(lèi),這些類(lèi)可以監(jiān)聽(tīng)Web應(yīng)用的上下文信息、Servlet會(huì)話(huà)信息、Servlet請(qǐng)求信息。在實(shí)際操作中,程序員需要繼承或?qū)崿F(xiàn)一些已定義好的類(lèi)或接口,從而編寫(xiě)出自己用于監(jiān)聽(tīng)的類(lèi)。這些類(lèi)對(duì)特定的信息進(jìn)行監(jiān)聽(tīng)。一旦被監(jiān)聽(tīng)的事件發(fā)生,這些類(lèi)會(huì)自動(dòng)調(diào)用相應(yīng)的方法去執(zhí)行指定的操作。5.9Servlet監(jiān)聽(tīng)器Servlet監(jiān)聽(tīng)器是當(dāng)今We365.9.1監(jiān)聽(tīng)Servlet上下文信息Servlet上下文信息主要是指關(guān)于ServletContext接口的一些信息,比如ServletContext的創(chuàng)建和刪除,Servlet屬性的增加、刪除和修改等。這樣就可以實(shí)現(xiàn)對(duì)Servlet上下文信息的跟蹤和記錄。為了實(shí)現(xiàn)這樣的功能,程序員需要實(shí)現(xiàn)ServletContextListener和ServletContextAttributeListener接口,從而編寫(xiě)出自己的Servlet類(lèi)。ServletContext接口的主要方法如表5.4所示。方法名稱(chēng)方法描述getAttribute(Stringname)返回Servlet環(huán)境對(duì)象中指定的屬性對(duì)象。如果該屬性對(duì)象不存在,返回空值getAttributeNames()返回一個(gè)Servlet環(huán)境對(duì)象中可用的屬性名的列表getContext(Stringuripath)返回一個(gè)Servlet環(huán)境對(duì)象,這個(gè)對(duì)象包括了特定URI路徑的Servlets和資源,如果該路徑不存在,則返回一個(gè)空值getRealPath(Stringpath)返回與一個(gè)符合該格式的虛擬路徑相對(duì)應(yīng)的真實(shí)路徑的StringgetResource(Stringuripath)返回一個(gè)URL對(duì)象,該對(duì)象反映位于給定的URL地址的Servlet環(huán)境對(duì)象已知的資源getServerInfo()返回一個(gè)String對(duì)象,該對(duì)象至少包括Servlet引擎的名字和版本號(hào)voidlog(Stringmsg,Throwablet)寫(xiě)指定的信息到一個(gè)Servlet環(huán)境對(duì)象的log文件中setAttribute(Stringname,Objecto)給予Servlet環(huán)境對(duì)象中你所指定的對(duì)象一個(gè)名稱(chēng)removeAttribute(Stringname)從指定的Servlet環(huán)境對(duì)象中刪除一個(gè)屬性5.9.1監(jiān)聽(tīng)Servlet上下文信息Servlet上下375.9.1監(jiān)聽(tīng)Servlet上下文信息在使用這個(gè)監(jiān)聽(tīng)器之前還需要對(duì)Web模塊中的web.xml配置文件進(jìn)行配置,配置代碼如圖5.75所示。然后我們就可以編寫(xiě)一個(gè)JSP程序testListener.jsp來(lái)操作ServletContext的屬性,看監(jiān)聽(tīng)器程序做出什么反應(yīng)。5.9.1監(jiān)聽(tīng)Servlet上下文信息在使用這個(gè)監(jiān)聽(tīng)器之385.9.2監(jiān)聽(tīng)HTTP會(huì)話(huà)信息HTTP會(huì)話(huà)信息指的是Session對(duì)象的創(chuàng)建和銷(xiāo)毀、會(huì)話(huà)中屬性的設(shè)置請(qǐng)求、會(huì)話(huà)的狀態(tài)和會(huì)話(huà)的綁定信息等。通過(guò)對(duì)HTTP會(huì)話(huà)信息的監(jiān)聽(tīng),可以進(jìn)行一些很有用的操作,比如,統(tǒng)計(jì)當(dāng)前會(huì)話(huà)的數(shù)目、設(shè)置某個(gè)對(duì)話(huà)的屬性、了解某個(gè)對(duì)話(huà)的狀態(tài)等。與ServletContext監(jiān)聽(tīng)的實(shí)現(xiàn)方法類(lèi)似,對(duì)HTTP會(huì)話(huà)的監(jiān)聽(tīng)也是通過(guò)實(shí)現(xiàn)特定的接口來(lái)完成的。監(jiān)聽(tīng)HTTP會(huì)話(huà)信息需要使用到三個(gè)接口類(lèi):HttpSessionListener、HttpSessionActivationListener和HttpSessionAttributeListener接口。5.9.2監(jiān)聽(tīng)HTTP會(huì)話(huà)信息HTTP會(huì)話(huà)信息指的是Se395.9.2監(jiān)聽(tīng)HTTP會(huì)話(huà)信息這些接口的主要方法如表5.5所示。方法名方法描述sessionCreated(HttpSessionEventarg0)方法進(jìn)行Http會(huì)話(huà)創(chuàng)建的監(jiān)聽(tīng),如果Http會(huì)話(huà)被創(chuàng)建將調(diào)用該方法sessionDestroyed(HttpSessionEventarg0)方法對(duì)Http會(huì)話(huà)銷(xiāo)毀進(jìn)行監(jiān)聽(tīng),如果某個(gè)Http會(huì)話(huà)被釋放將調(diào)用該方法sessionDidActivate(HttpSessionEventarg0)方法對(duì)Http會(huì)話(huà)處于active情況進(jìn)行監(jiān)聽(tīng)sessionWillPassivate(HttpSessionEventarg0)方法對(duì)Http會(huì)話(huà)處于passivate情況進(jìn)行監(jiān)聽(tīng)attributeAdded(HttpSessionBindingEventarg0)方法對(duì)Http會(huì)話(huà)中屬性添加進(jìn)行監(jiān)聽(tīng)attributeReplaced(HttpSessionBindingEventarg0)方法對(duì)Http會(huì)話(huà)中屬性修改進(jìn)行監(jiān)聽(tīng)attributeRemoved(HttpSessionBindingEventarg0)方法對(duì)Http會(huì)話(huà)中屬性刪除進(jìn)行監(jiān)聽(tīng)5.9.2監(jiān)聽(tīng)HTTP會(huì)話(huà)信息這些接口的主要方法如表5.405.9.3對(duì)客戶(hù)端請(qǐng)求進(jìn)行監(jiān)聽(tīng)客戶(hù)端請(qǐng)求信息是指請(qǐng)求對(duì)象的創(chuàng)建、銷(xiāo)毀以及其屬性的添加、更改和刪除。一旦可以對(duì)客戶(hù)端發(fā)向服務(wù)器的請(qǐng)求進(jìn)行監(jiān)聽(tīng),就可以對(duì)它們進(jìn)行識(shí)別,然后統(tǒng)一處理。對(duì)客戶(hù)端請(qǐng)求信息的監(jiān)聽(tīng)的實(shí)現(xiàn)方法與上面兩種類(lèi)似,通過(guò)實(shí)現(xiàn)ServletRequestListener和ServletRequestAttributeListener接口來(lái)完成。這些接口的主要方法如表5.6所示。方法名方法描述ServletRequestListener()方法監(jiān)聽(tīng)客戶(hù)端請(qǐng)求的創(chuàng)建和銷(xiāo)毀attributeAdded(HttpSessionBindingEventarg0)方法對(duì)Http會(huì)話(huà)中屬性添加進(jìn)行監(jiān)聽(tīng)attributeReplaced(HttpSessionBindingEventarg0)方法對(duì)Http會(huì)話(huà)中屬性修改進(jìn)行監(jiān)聽(tīng)attributeRemoved(HttpSessionBindingEventarg0)方法對(duì)Http會(huì)話(huà)中屬性刪除進(jìn)行監(jiān)聽(tīng)5.9.3對(duì)客戶(hù)端請(qǐng)求進(jìn)行監(jiān)聽(tīng)客戶(hù)端請(qǐng)求信息是指請(qǐng)求對(duì)象415.10小結(jié)本章首先介紹了Servlet編程方面的基礎(chǔ)知識(shí),然后在此基礎(chǔ)上介紹了Servlet的配置和處理方法,接著我們?yōu)榇蠹抑v解了如何利用JSP頁(yè)面調(diào)用Servlet和有關(guān)Servlet的文件操作,最后我們通過(guò)實(shí)例講解了Servlet的具體應(yīng)用和過(guò)濾器、監(jiān)聽(tīng)器的知識(shí)。本章的重點(diǎn)是Servlet的文件操作以及Servlet應(yīng)用方面的知識(shí),難點(diǎn)是難點(diǎn)是Session技術(shù)以及Servlet過(guò)濾器、監(jiān)聽(tīng)器知識(shí)的理解和應(yīng)用。熟練掌握Servlet是學(xué)好JavaWeb技術(shù)的基本要求,所以讀者要多加練習(xí),以打好基礎(chǔ)。5.10小結(jié)本章首先介紹了Servlet編程方面的基礎(chǔ)知42第5章Servlet編程Servlet是Java

Web程序的核心。JSP和幾乎所有的Java

Web框架(如Struts、Webwork)在底層的實(shí)現(xiàn)都會(huì)看到Servlet的影子。因此,充分了解Servlet的原理和使用方法,對(duì)于以后學(xué)習(xí)Struts等Web框架將起到非常大的幫助。本章我們將為大家介紹Servlet的基礎(chǔ)知識(shí),并通過(guò)具體的示例介紹Servlet的強(qiáng)大功能。第5章Servlet編程Servlet是JavaWeb435.1Servlet基礎(chǔ)Servlet在本質(zhì)上就是Java類(lèi)。編寫(xiě)Servlet需要遵循Java的基本語(yǔ)法,但是與一般Java類(lèi)所不同的是。Servlet是只能運(yùn)行在服務(wù)器端的Java類(lèi),而且必需遵循特殊的規(guī)范,在運(yùn)行的過(guò)程中有自己的生命周期。5.1Servlet基礎(chǔ)Servlet在本質(zhì)上就是Jav445.1.1什么是ServletServlet是運(yùn)行于服務(wù)器端的、按照其自身規(guī)范編寫(xiě)的Java應(yīng)用程序。我們可以用圖5.1來(lái)解釋這個(gè)概念。Servlet的主要功能是用來(lái)接受、處理客戶(hù)端請(qǐng)求,并把處理結(jié)果返回到客戶(hù)端顯示。其作用過(guò)程如圖5.2所示。5.1.1什么是ServletServlet是運(yùn)行于服務(wù)455.1.2Servlet的生命周期Servlet需要在特定的容器中才能運(yùn)行,在這里所說(shuō)的容器即Servlet運(yùn)行的時(shí)候所需的運(yùn)行環(huán)境。一般情況下,市面上常見(jiàn)的JavaWebServer都可以支持Servlet,例如Tomcat、Resin、Weblogic、WebSphere等,在本書(shū)中采用Tomcat作為Servlet的容器,由Tomcat為Servlet提供基本的運(yùn)行環(huán)境。Servlet的生命周期指的是Servlet從被Web服務(wù)器加載到它被銷(xiāo)毀的整個(gè)生命過(guò)程。這個(gè)過(guò)程如圖5.3所示。5.1.2Servlet的生命周期Servlet需要在特465.1.2Servlet的生命周期從圖5.3中我們呢可以看出,Servlet生命周期的執(zhí)行大致分為4個(gè)步驟,如圖5.4所示。在以上幾個(gè)階段中,Servlet對(duì)外提供服務(wù)階段是最重要的。service()方法是編程人員真正要關(guān)心的方法。因?yàn)樗攀荢ervlet真正開(kāi)始響應(yīng)客戶(hù)端請(qǐng)求,并且處理業(yè)務(wù)邏輯的方法。service()接收到客戶(hù)端請(qǐng)求后,再調(diào)用該Servlet的相應(yīng)的方法去處理請(qǐng)求。所以程序員在編寫(xiě)自己的Servlet時(shí),一般只需要重寫(xiě)方法。在該方法中去處理客戶(hù)端請(qǐng)求,并把處理結(jié)果返回。5.1.2Servlet的生命周期從圖5.3中我們呢可以475.2簡(jiǎn)單Servlet開(kāi)發(fā)配置示例在這一節(jié)中我們主要應(yīng)用Servlet編寫(xiě)一個(gè)HelloWorld程序,實(shí)現(xiàn)向客戶(hù)端瀏覽器中輸出“HelloWorld”信息。在系統(tǒng)中創(chuàng)建的第一個(gè)Servlet程序系統(tǒng)會(huì)為我們自動(dòng)生成web.xml配置文件,但是以后的Servlet程序就需要我們自己來(lái)配置了。即一般情況下都需要在當(dāng)前應(yīng)用項(xiàng)目的web.xml配置文件中對(duì)各個(gè)Servlet進(jìn)行配置,其中web.xml文件的位置在當(dāng)前項(xiàng)目應(yīng)用的WEB-INF文件夾下。我們就結(jié)合圖5.8的示例來(lái)講解如何對(duì)Servlet進(jìn)行配置,如圖5.9所示。5.2簡(jiǎn)單Servlet開(kāi)發(fā)配置示例在這一節(jié)中我們主要應(yīng)485.2簡(jiǎn)單Servlet開(kāi)發(fā)配置示例總之,編寫(xiě)一個(gè)Servlet要經(jīng)過(guò)以下三個(gè)步驟:(1)編寫(xiě)Servlet的功能代碼,即實(shí)現(xiàn)功能的代碼類(lèi)。(2)把編譯成功的Servlet功能代碼類(lèi)文件拷貝到當(dāng)前應(yīng)用項(xiàng)目的WEB-INF/classes目錄下。(3)在當(dāng)前應(yīng)用項(xiàng)目的web.xml文件中對(duì)Servlet進(jìn)行配置,即在web.xml中添加配置信息。經(jīng)過(guò)這樣三個(gè)步驟我們就可以通過(guò)瀏覽器訪問(wèn)這個(gè)Servlet了。5.2簡(jiǎn)單Servlet開(kāi)發(fā)配置示例總之,編寫(xiě)一個(gè)Ser495.3使用HttpServlet處理客戶(hù)端請(qǐng)求HttpServlet是使用HTTP協(xié)議的Web服務(wù)器的Servlet類(lèi),這個(gè)類(lèi)已經(jīng)被系統(tǒng)定義好。該類(lèi)的一些方法,如doGet()方法、doPost()方法等,提供了處理客戶(hù)端請(qǐng)求的接口。在實(shí)際編程中,程序員需要繼承這個(gè)類(lèi),并重寫(xiě)上述方法,去編寫(xiě)自己的Servlet。使用重寫(xiě)后的方法,就可以完成對(duì)客戶(hù)端請(qǐng)求進(jìn)行處理。5.3使用HttpServlet處理客戶(hù)端請(qǐng)求HttpS505.3.1處理Get請(qǐng)求doGetdoGet()方法是HttpServlet類(lèi)中用來(lái)處理Get請(qǐng)求的方法。用戶(hù)通過(guò)繼承HttpServlet,重寫(xiě)doGet()方法,實(shí)現(xiàn)對(duì)客戶(hù)端的Get請(qǐng)求進(jìn)行處理。要調(diào)用doGet()方法,必須在客戶(hù)端的表單里指定請(qǐng)求的類(lèi)型為Get。doGet()方法的語(yǔ)法格式如圖5.10所示。5.3.1處理Get請(qǐng)求doGetdoGet()方法是H515.3.2處理Post請(qǐng)求doPostdoPost()是HttpServlet中用于處理Post請(qǐng)求的方法。如果要調(diào)用doPost()方法,必須在表單中指定Post請(qǐng)求。doPost()方法與doGet()方法的用法一般來(lái)說(shuō)沒(méi)什么區(qū)別,doGet()方法用于處理httpget請(qǐng)求,doPost()方法用于外理httppost請(qǐng)求。至于它們的不同,簡(jiǎn)單的說(shuō),get是通過(guò)httpheader來(lái)傳輸數(shù)據(jù),有字?jǐn)?shù)限制,而post則是通過(guò)httpbody來(lái)傳輸數(shù)據(jù),沒(méi)有字?jǐn)?shù)的限制。doPost()方法的語(yǔ)法格式如圖5.14所示。5.3.2處理Post請(qǐng)求doPostdoPost()是525.3.2處理Post請(qǐng)求doPost下面我們來(lái)為大家介紹一下javax.servlet.http提供的HTTPServlet應(yīng)用編程接口。創(chuàng)建Servlet,需要擴(kuò)展HttpServlet類(lèi),HttpServlet類(lèi)包含init()、destroy()、service()等方法,其中init()和destroy()方法是繼承的。具體的方法及方法描述如表5.1所示。當(dāng)服務(wù)器調(diào)用sevlet的Service()、doGet()和doPost()這三個(gè)方法時(shí),均需要“請(qǐng)求”和“響應(yīng)”對(duì)象作為參數(shù)?!罢?qǐng)求”對(duì)象提供有關(guān)請(qǐng)求的信息,而“響應(yīng)”對(duì)象提供了一個(gè)將響應(yīng)信息返回給瀏覽器的一個(gè)路徑。方法名方法描述init()方法服務(wù)器裝入Servlet時(shí)執(zhí)行??梢耘渲梅?wù)器,在啟動(dòng)服務(wù)器或客戶(hù)機(jī)首次訪問(wèn)Servlet時(shí)裝入Servletservice()方法Servlet的核心。每當(dāng)一個(gè)客戶(hù)請(qǐng)求一個(gè)HttpServlet對(duì)象,該對(duì)象的service()方法就要被調(diào)用,而且傳遞給這個(gè)方法一個(gè)"請(qǐng)求"(ServletRequest)對(duì)象和一個(gè)"響應(yīng)"(ServletResponse)對(duì)象作為參數(shù)destroy()方法在服務(wù)器停止且卸裝Servlet時(shí)執(zhí)行該方法??梢詫ervlet作為服務(wù)器進(jìn)程的一部分來(lái)關(guān)閉GetServletConfig()方法GetServletConfig()方法返回一個(gè)ServletConfig對(duì)象,該對(duì)象用來(lái)返回初始化參數(shù)和ServletContext。ServletContext接口提供有關(guān)servlet的環(huán)境信息GetServletInfo()方法GetServletInfo()方法是一個(gè)可選的方法,它提供有關(guān)servlet的信息,如作者、版本、版權(quán)等5.3.2處理Post請(qǐng)求doPost下面我們來(lái)為大家介535.4

JSP頁(yè)面調(diào)用Servlet在上面HelloWorld的示例程序中,我們直接在瀏覽器中輸入具體的地址進(jìn)行訪問(wèn)。在實(shí)際的應(yīng)用中,不可能讓用戶(hù)在瀏覽器中直接輸入Servlet的地址進(jìn)行訪問(wèn)。一般情況下,可以通過(guò)調(diào)用Servlet進(jìn)行訪問(wèn),在這里介紹通過(guò)提交表單和超鏈接兩種方式調(diào)用Servlet。5.4JSP頁(yè)面調(diào)用Servlet在上面HelloWor545.4.1通過(guò)表單提交調(diào)用Servlet在通過(guò)提交表單調(diào)用Servlet的時(shí)候,只需要把表單的action指向?qū)?yīng)的Servlet即可。5.4.1通過(guò)表單提交調(diào)用Servlet在通過(guò)提交表單調(diào)555.4.2通過(guò)超鏈接調(diào)用Servlet當(dāng)用戶(hù)有輸入的內(nèi)容需要提交給服務(wù)器時(shí),我們可以用表單來(lái)調(diào)用Servlet。如果在沒(méi)有輸入的數(shù)據(jù)內(nèi)容需要提交的情況下,我們可以直接通過(guò)超鏈接的方式來(lái)調(diào)用Servlet,并對(duì)其傳遞參數(shù)。5.4.2通過(guò)超鏈接調(diào)用Servlet當(dāng)用戶(hù)有輸入的內(nèi)容565.5

Servlet文件操作在JSP的開(kāi)發(fā)過(guò)程中,我們常常把相關(guān)內(nèi)容存儲(chǔ)為文件。在Servlet中我們可以使用輸入輸出流實(shí)現(xiàn)對(duì)文件的讀寫(xiě)。同時(shí),使用Servlet還可以很方便的實(shí)現(xiàn)文件的下載操作。這一節(jié)我們就來(lái)學(xué)習(xí)如何實(shí)現(xiàn)Servlet的文件操作。5.5Servlet文件操作在JSP的開(kāi)發(fā)過(guò)程中,我們常575.5.1Servlet讀取文件我們舉一個(gè)實(shí)例FileRead.java來(lái)讀取一個(gè)文本文件content.txt的內(nèi)容,并且在頁(yè)面上打印文件的內(nèi)容。5.5.1Servlet讀取文件我們舉一個(gè)實(shí)例FileR585.5.2Servlet寫(xiě)文件Servlet寫(xiě)文件的處理方法和讀取文件的處理方法非常類(lèi)似,即把文件輸入流換成文件輸出流。我們也可以來(lái)看一個(gè)寫(xiě)文件示例。5.5.2Servlet寫(xiě)文件Servlet寫(xiě)文件的處理595.5.3Servlet下載文件利用Servlet可以很方便地實(shí)現(xiàn)文件的下載,我們只需要對(duì)服務(wù)器的響應(yīng)對(duì)象response進(jìn)行簡(jiǎn)單的設(shè)置即可。5.5.3Servlet下載文件利用Servlet可以很605.6Servlet的應(yīng)用Servlet是與HTTP協(xié)議緊密結(jié)合的,使用Servlet幾乎可以處理HTTP協(xié)議各個(gè)方面的內(nèi)容,在本節(jié)的幾個(gè)示例程序中,將集中展示Servlet在HTTP方面的具體應(yīng)用。5.6Servlet的應(yīng)用Servlet是與HTTP協(xié)議615.6.1獲取請(qǐng)求信息頭部?jī)?nèi)容當(dāng)用戶(hù)訪問(wèn)一個(gè)頁(yè)面的時(shí)候,會(huì)提交一個(gè)HTTP請(qǐng)求給服務(wù)器的Servlet引擎,在這個(gè)請(qǐng)求中包含了HTTP文件的詳細(xì)屬性信息。我們可以應(yīng)用request.getHeaderNames()方法來(lái)獲取請(qǐng)求信息頭部?jī)?nèi)容。5.6.1獲取請(qǐng)求信息頭部?jī)?nèi)容當(dāng)用戶(hù)訪問(wèn)一個(gè)頁(yè)面的時(shí)候,625.6.2獲取請(qǐng)求信息在上面的Servlet示例中,我們?nèi)〕隽薍TTP文件頭信息,在Servlet中還可以很方便取出用戶(hù)發(fā)出請(qǐng)求對(duì)象自身的信息。這些信息是和用戶(hù)的請(qǐng)求密切相關(guān)的,例如用戶(hù)提交請(qǐng)求所使用的協(xié)議,客戶(hù)提交表單的方法是POST還是GET等。5.6.2獲取請(qǐng)求信息在上面的Servlet示例中,我們635.6.3獲取參數(shù)信息有關(guān)用戶(hù)請(qǐng)求的參數(shù)信息,也可以通過(guò)Servlet來(lái)獲取。這種參數(shù)既包括以POST方法或者是GET方法提交的表單,也包括直接使用超鏈接傳遞的參數(shù)。Servlet都可以使用request.getParameter()方法取得這些參數(shù)信息并且加以處理。5.6.3獲取參數(shù)信息有關(guān)用戶(hù)請(qǐng)求的參數(shù)信息,也可以通過(guò)645.6.4

Cookie操作Cookie是一種在客戶(hù)端保存信息的技術(shù)。讀者在瀏覽網(wǎng)頁(yè)時(shí)可能會(huì)注意到這樣的現(xiàn)象,如在打開(kāi)某個(gè)登錄網(wǎng)頁(yè)時(shí),在第一次打開(kāi)時(shí),用戶(hù)名文本框是空的,當(dāng)輸入一個(gè)用戶(hù)名,并成功登錄后。在第二次打開(kāi)這個(gè)登錄網(wǎng)頁(yè)時(shí),在第一次輸入的用戶(hù)名會(huì)被自動(dòng)填入這個(gè)用戶(hù)名文本框,就算重啟計(jì)算機(jī)后,仍然如此。其實(shí)這就是Cookie所起的作用。5.6.4Cookie操作Cookie是一種在客戶(hù)端保存655.6.4

Cookie操作在Servlet中,使用java.servlet.http.Cookie類(lèi)來(lái)封裝一個(gè)Cookie消息,在HttpServletResponse接口中定義了一個(gè)addCookie方法來(lái)向?yàn)g覽器發(fā)送Cookie消息(也就是Cookie對(duì)象),在HttpServletRequest接口中定義了一個(gè)getCookies方法來(lái)讀取瀏覽器發(fā)送的Web服務(wù)器的所有Cookie消息。Cookie類(lèi)中定義了生成和提取Cookie消息的各個(gè)屬性的方法。Cookie類(lèi)只有一個(gè)構(gòu)造方法,它的語(yǔ)法結(jié)構(gòu)如圖5.47所示。5.6.4Cookie操作在Servlet中,使用jav665.6.4

Cookie操作Cookie類(lèi)中的其他常用方法如表5.3所示。方法名方法描述getName方法用于獲得Cookie的名稱(chēng)setValue和getValue方法分別用于設(shè)置和獲得Cookie的值setMaxAge和getMaxAge方法分別用于設(shè)置和獲得Cookie在客戶(hù)機(jī)的有效時(shí)間,也就是在在客戶(hù)機(jī)上的有效秒數(shù)setPath和getPath方法分別用于設(shè)置和獲得當(dāng)前Cookie的有效Web路徑setDomain和getDomain方法分別用于設(shè)置和獲得當(dāng)前Cookie的有效域setComment和getComment方法分別用于設(shè)置和返回當(dāng)前Cookie的注釋部分setVersion與getVersion方法分別用于設(shè)置和獲得當(dāng)前Cookie的協(xié)議版本setSecure和getSecure方法分別用于設(shè)置和獲得當(dāng)前Cookie是否只能使用安全的協(xié)議傳輸Cookie5.6.4Cookie操作Cookie類(lèi)中的其他常用方法675.7Session技術(shù)session對(duì)象用來(lái)保存每個(gè)用戶(hù)的用戶(hù)信息和會(huì)話(huà)狀態(tài)。session對(duì)象由服務(wù)器端自動(dòng)創(chuàng)建,可以跟蹤每個(gè)用戶(hù)的操作狀態(tài)。用戶(hù)首次登錄系統(tǒng)時(shí)服務(wù)器會(huì)自動(dòng)給用戶(hù)分配唯一標(biāo)識(shí)的sessionid,可以用來(lái)區(qū)分開(kāi)其他用戶(hù)。相對(duì)于Cookie,session是存儲(chǔ)在服務(wù)器端的會(huì)話(huà),相對(duì)安全,而且其存儲(chǔ)長(zhǎng)度限制也大大的擴(kuò)大了。5.7Session技術(shù)session對(duì)象用來(lái)保存每個(gè)用685.7.1HttpSession接口方法在Servlet中使用HttpSession對(duì)象來(lái)描述Session。一個(gè)HttpSession對(duì)象就是一個(gè)Session。使用HttpServletRequest接口的getSession方法來(lái)獲得一個(gè)HttpSession對(duì)象。HttpSession接口中的主要方法如表5.4所示。方法名方法描述getId方法用于返回當(dāng)前HttpSession對(duì)象的SessionIDgetCreationTime方法用于返回當(dāng)前的HttpSession對(duì)象的創(chuàng)建時(shí)間getLastAccessedTime方法用于返回當(dāng)前HttpSession對(duì)象的上一次被訪問(wèn)的時(shí)間setMaxInactiveInterval和getMaxInactiveInterval方法分別用來(lái)設(shè)置和返回當(dāng)前HttpSession對(duì)象的可空閑的最長(zhǎng)時(shí)間(單位:秒),這個(gè)時(shí)間也就是當(dāng)前會(huì)話(huà)的有效間隔isNew方法用來(lái)判斷當(dāng)前的HttpSession對(duì)象是否是新創(chuàng)建的,如果是則返回true,否則返回falseisvalidate方法用于強(qiáng)制當(dāng)前的HttpSession對(duì)象失效,這樣Web服務(wù)器可以立即釋放該HttpSession對(duì)象getServletContext方法用于返回當(dāng)前HttpSession對(duì)象所屬的Web應(yīng)用程序的ServletContext對(duì)象setAttribute方法用于將一個(gè)String類(lèi)型的ID和一個(gè)對(duì)象相關(guān)聯(lián),并將其保存在當(dāng)前的HttpSession對(duì)象中g(shù)etAttribute方法用于返回一個(gè)和String類(lèi)型的ID相關(guān)聯(lián)的對(duì)象remoteAttribute方法用于刪除與一個(gè)String類(lèi)型的ID相關(guān)聯(lián)的對(duì)象5.7.1HttpSession接口方法在Servlet695.7.1HttpSession接口方法getSession是HttpServletRequest接口的方法,這個(gè)方法用于返回與當(dāng)前請(qǐng)求相關(guān)的HttpSession對(duì)象,該方法有兩種重載形式,它們的定義語(yǔ)法如圖5.52所示。5.7.1HttpSession接口方法getSessi705.7.2通過(guò)Cookie跟蹤Session客戶(hù)端必須通過(guò)一個(gè)SessionID才能找到以前在服務(wù)端創(chuàng)建的某一個(gè)HttpSession對(duì)象。通過(guò)SessionID找HttpSession對(duì)象的過(guò)程也叫做Session跟蹤。一般客戶(hù)端的SessionID通過(guò)HTTP請(qǐng)求消息頭的Cookie字段發(fā)送給服務(wù)端,然后服務(wù)端通過(guò)getSession方法讀取Cookie字段的值,以確定是否需要新建一個(gè)HttpSession對(duì)象,還是獲得一個(gè)已經(jīng)存在的HttpSession對(duì)象,或是什么都不做,直接返回null。當(dāng)HttpSession對(duì)象是第一次創(chuàng)建時(shí),向這個(gè)對(duì)象中寫(xiě)一個(gè)字符串值。如果HttpSession對(duì)象不是第一次創(chuàng)建,那么就將保存在HttpSession對(duì)象中的字符串值輸出到客戶(hù)端。5.7.2通過(guò)Cookie跟蹤Session客戶(hù)端必須通715.7.3通過(guò)重寫(xiě)URL跟蹤Session如果客戶(hù)端瀏覽器不支持Cookie或是將Cookie功能關(guān)閉,那么就無(wú)法使用Cookie來(lái)傳遞SessionID。為了在這種情況下仍然可以使用Session,Servlet規(guī)范提供了一種補(bǔ)充會(huì)話(huà)管理機(jī)制。這種管理機(jī)制允許在Cookie無(wú)法工作的情況下使用URL參數(shù)來(lái)傳遞SessionID。要想通過(guò)URL來(lái)發(fā)送SessionID,必須要重寫(xiě)URL。HttpServletResponse提供了兩個(gè)方法用于重寫(xiě)URL,如圖5.56所示。5.7.3通過(guò)重寫(xiě)URL跟蹤Session如果客戶(hù)端瀏覽725.8Servlet過(guò)濾器過(guò)濾器是小型的Web組件,它負(fù)責(zé)攔截請(qǐng)求和響應(yīng),以便查看、提取或以某種方式操作正在客戶(hù)機(jī)和服務(wù)器之間交換的數(shù)據(jù)。Servlet過(guò)濾器應(yīng)用非常廣泛,有攔截的地方一般都可以用到過(guò)濾器。當(dāng)前Web應(yīng)用中過(guò)濾器已經(jīng)是不可或缺的部分之一。5.8Servlet過(guò)濾器過(guò)濾器是小型的Web組件,它負(fù)735.8.1過(guò)濾器的方法和配置與過(guò)濾器相關(guān)的Servlet共包含3個(gè)簡(jiǎn)單的接口,分別是Filter、FilterChain及FilterConfig。要實(shí)現(xiàn)過(guò)濾器功能,必須先實(shí)現(xiàn)Filter接口。Filter接口定義了3個(gè)方法,如圖5.61所示。Servlets過(guò)濾器是一個(gè)Web應(yīng)用組件,和Servlet類(lèi)似,也需要在Web應(yīng)用配置文件(即web.xml)中進(jìn)行配置部署。5.8.1過(guò)濾器的方法和配置與過(guò)濾器相關(guān)的Servlet745.8.1過(guò)濾器的方法和配置對(duì)于過(guò)濾器的映射配置,可以將過(guò)濾器映射到一個(gè)或多個(gè)Servlet和JSP文件中。以Servlet為例,我們來(lái)看其映射配置,如圖5.63所示。注意:在web.xml中配置Servlet和Servlet過(guò)濾器,應(yīng)該先聲明過(guò)濾器元素,再聲明Servlet元素。5.8.1過(guò)濾器的方法和配置對(duì)于過(guò)濾器的映射配置,可以將755.8.2過(guò)濾器應(yīng)用實(shí)例——禁止未授權(quán)的IP訪問(wèn)站點(diǎn)在實(shí)際的應(yīng)用中,可能會(huì)遇到這樣的情況,需要對(duì)某些IP進(jìn)行訪問(wèn)限制,不讓非法的IP訪問(wèn)應(yīng)用系統(tǒng),這個(gè)時(shí)候就需要用到過(guò)濾器進(jìn)行限制,當(dāng)一個(gè)用戶(hù)發(fā)出訪問(wèn)請(qǐng)求的時(shí)候,首先通過(guò)過(guò)濾器進(jìn)行判斷,如果用戶(hù)的IP地址被限制,就禁止訪問(wèn),只有合法的IP才可以繼續(xù)訪問(wèn)。5.8.2過(guò)濾器應(yīng)用實(shí)例——禁止未授權(quán)的IP訪問(wèn)站點(diǎn)在實(shí)765.8.3過(guò)濾器應(yīng)用實(shí)例——版權(quán)過(guò)濾器現(xiàn)在的網(wǎng)頁(yè)都會(huì)在尾部加上版權(quán)標(biāo)志,對(duì)于這一操作,我們可以運(yùn)用過(guò)濾器很方便地實(shí)現(xiàn)它。5.8.3過(guò)濾器應(yīng)用實(shí)例——版權(quán)過(guò)濾器現(xiàn)在的網(wǎng)頁(yè)都會(huì)在尾775.9Servlet監(jiān)聽(tīng)器Servlet監(jiān)聽(tīng)器是當(dāng)今Web應(yīng)用開(kāi)發(fā)的一個(gè)重要組成部分。Servlet監(jiān)聽(tīng)器主要用來(lái)對(duì)Web應(yīng)用進(jìn)行監(jiān)聽(tīng)和控制,極大地增強(qiáng)了Web應(yīng)用的事件處理能力。一般來(lái)說(shuō),Servlet監(jiān)聽(tīng)就是指一些特殊的Servlet類(lèi),這些類(lèi)可以監(jiān)聽(tīng)Web應(yīng)用的上下文信息、Servlet會(huì)話(huà)信息、Servlet請(qǐng)求信息。在實(shí)際操作中,程序員需要繼承或?qū)崿F(xiàn)一些已定義好的類(lèi)或接口,從而編寫(xiě)出自己用于監(jiān)聽(tīng)的類(lèi)。這些類(lèi)對(duì)特定的信息進(jìn)行監(jiān)聽(tīng)。一旦被監(jiān)聽(tīng)的事件發(fā)生,這些類(lèi)會(huì)自動(dòng)調(diào)用相應(yīng)的方法去執(zhí)行指定的操作。5.9Servlet監(jiān)聽(tīng)器Servlet監(jiān)聽(tīng)器是當(dāng)今We785.9.1監(jiān)聽(tīng)Servlet上下文信息Servlet上下文信息主要是指關(guān)于ServletContext接口的一些信息,比如ServletContext的創(chuàng)建和刪除,Servlet屬性的增加、刪除和修改等。這樣就可以實(shí)現(xiàn)對(duì)Servlet上下文信息的跟蹤和記錄。為了實(shí)現(xiàn)這樣的功能,程序員需要實(shí)現(xiàn)ServletContextListener和ServletContextAttributeListener接口,從而編寫(xiě)出自己的Servlet類(lèi)。ServletContext接口的主要方法如表5.4所示。方法名稱(chēng)方法描述getAttribute(Stringname)返回Servlet環(huán)境對(duì)象中指定的屬性對(duì)象。如果該屬性對(duì)象不存在,返回空值getAttributeNames()返回一個(gè)Servlet環(huán)境對(duì)象中可用的屬

溫馨提示

  • 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)論