輕松學(xué)JavaWeb開發(fā)之Servlet編程課件_第1頁
輕松學(xué)JavaWeb開發(fā)之Servlet編程課件_第2頁
輕松學(xué)JavaWeb開發(fā)之Servlet編程課件_第3頁
輕松學(xué)JavaWeb開發(fā)之Servlet編程課件_第4頁
輕松學(xué)JavaWeb開發(fā)之Servlet編程課件_第5頁
已閱讀5頁,還剩79頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第5章Servlet編程Servlet是Java

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

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

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

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

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

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

Cookie操作Cookie類中的其他常用方法如表5.3所示。方法名方法描述getName方法用于獲得Cookie的名稱setValue和getValue方法分別用于設(shè)置和獲得Cookie的值setMaxAge和getMaxAge方法分別用于設(shè)置和獲得Cookie在客戶機(jī)的有效時(shí)間,也就是在在客戶機(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類中的其他常用方法255.7Session技術(shù)session對象用來保存每個(gè)用戶的用戶信息和會話狀態(tài)。session對象由服務(wù)器端自動創(chuàng)建,可以跟蹤每個(gè)用戶的操作狀態(tài)。用戶首次登錄系統(tǒng)時(shí)服務(wù)器會自動給用戶分配唯一標(biāo)識的sessionid,可以用來區(qū)分開其他用戶。相對于Cookie,session是存儲在服務(wù)器端的會話,相對安全,而且其存儲長度限制也大大的擴(kuò)大了。5.7Session技術(shù)session對象用來保存每個(gè)用265.7.1HttpSession接口方法在Servlet中使用HttpSession對象來描述Session。一個(gè)HttpSession對象就是一個(gè)Session。使用HttpServletRequest接口的getSession方法來獲得一個(gè)HttpSession對象。HttpSession接口中的主要方法如表5.4所示。方法名方法描述getId方法用于返回當(dāng)前HttpSession對象的SessionIDgetCreationTime方法用于返回當(dāng)前的HttpSession對象的創(chuàng)建時(shí)間getLastAccessedTime方法用于返回當(dāng)前HttpSession對象的上一次被訪問的時(shí)間setMaxInactiveInterval和getMaxInactiveInterval方法分別用來設(shè)置和返回當(dāng)前HttpSession對象的可空閑的最長時(shí)間(單位:秒),這個(gè)時(shí)間也就是當(dāng)前會話的有效間隔isNew方法用來判斷當(dāng)前的HttpSession對象是否是新創(chuàng)建的,如果是則返回true,否則返回falseisvalidate方法用于強(qiáng)制當(dāng)前的HttpSession對象失效,這樣Web服務(wù)器可以立即釋放該HttpSession對象getServletContext方法用于返回當(dāng)前HttpSession對象所屬的Web應(yīng)用程序的ServletContext對象setAttribute方法用于將一個(gè)String類型的ID和一個(gè)對象相關(guān)聯(lián),并將其保存在當(dāng)前的HttpSession對象中g(shù)etAttribute方法用于返回一個(gè)和String類型的ID相關(guān)聯(lián)的對象remoteAttribute方法用于刪除與一個(gè)String類型的ID相關(guān)聯(lián)的對象5.7.1HttpSession接口方法在Servlet275.7.1HttpSession接口方法getSession是HttpServletRequest接口的方法,這個(gè)方法用于返回與當(dāng)前請求相關(guān)的HttpSession對象,該方法有兩種重載形式,它們的定義語法如圖5.52所示。5.7.1HttpSession接口方法getSessi285.7.2通過Cookie跟蹤Session客戶端必須通過一個(gè)SessionID才能找到以前在服務(wù)端創(chuàng)建的某一個(gè)HttpSession對象。通過SessionID找HttpSession對象的過程也叫做Session跟蹤。一般客戶端的SessionID通過HTTP請求消息頭的Cookie字段發(fā)送給服務(wù)端,然后服務(wù)端通過getSession方法讀取Cookie字段的值,以確定是否需要新建一個(gè)HttpSession對象,還是獲得一個(gè)已經(jīng)存在的HttpSession對象,或是什么都不做,直接返回null。當(dāng)HttpSession對象是第一次創(chuàng)建時(shí),向這個(gè)對象中寫一個(gè)字符串值。如果HttpSession對象不是第一次創(chuàng)建,那么就將保存在HttpSession對象中的字符串值輸出到客戶端。5.7.2通過Cookie跟蹤Session客戶端必須通295.7.3通過重寫URL跟蹤Session如果客戶端瀏覽器不支持Cookie或是將Cookie功能關(guān)閉,那么就無法使用Cookie來傳遞SessionID。為了在這種情況下仍然可以使用Session,Servlet規(guī)范提供了一種補(bǔ)充會話管理機(jī)制。這種管理機(jī)制允許在Cookie無法工作的情況下使用URL參數(shù)來傳遞SessionID。要想通過URL來發(fā)送SessionID,必須要重寫URL。HttpServletResponse提供了兩個(gè)方法用于重寫URL,如圖5.56所示。5.7.3通過重寫URL跟蹤Session如果客戶端瀏覽305.8Servlet過濾器過濾器是小型的Web組件,它負(fù)責(zé)攔截請求和響應(yīng),以便查看、提取或以某種方式操作正在客戶機(jī)和服務(wù)器之間交換的數(shù)據(jù)。Servlet過濾器應(yīng)用非常廣泛,有攔截的地方一般都可以用到過濾器。當(dāng)前Web應(yīng)用中過濾器已經(jīng)是不可或缺的部分之一。5.8Servlet過濾器過濾器是小型的Web組件,它負(fù)315.8.1過濾器的方法和配置與過濾器相關(guān)的Servlet共包含3個(gè)簡單的接口,分別是Filter、FilterChain及FilterConfig。要實(shí)現(xiàn)過濾器功能,必須先實(shí)現(xiàn)Filter接口。Filter接口定義了3個(gè)方法,如圖5.61所示。Servlets過濾器是一個(gè)Web應(yīng)用組件,和Servlet類似,也需要在Web應(yīng)用配置文件(即web.xml)中進(jìn)行配置部署。5.8.1過濾器的方法和配置與過濾器相關(guān)的Servlet325.8.1過濾器的方法和配置對于過濾器的映射配置,可以將過濾器映射到一個(gè)或多個(gè)Servlet和JSP文件中。以Servlet為例,我們來看其映射配置,如圖5.63所示。注意:在web.xml中配置Servlet和Servlet過濾器,應(yīng)該先聲明過濾器元素,再聲明Servlet元素。5.8.1過濾器的方法和配置對于過濾器的映射配置,可以將335.8.2過濾器應(yīng)用實(shí)例——禁止未授權(quán)的IP訪問站點(diǎn)在實(shí)際的應(yīng)用中,可能會遇到這樣的情況,需要對某些IP進(jìn)行訪問限制,不讓非法的IP訪問應(yīng)用系統(tǒng),這個(gè)時(shí)候就需要用到過濾器進(jìn)行限制,當(dāng)一個(gè)用戶發(fā)出訪問請求的時(shí)候,首先通過過濾器進(jìn)行判斷,如果用戶的IP地址被限制,就禁止訪問,只有合法的IP才可以繼續(xù)訪問。5.8.2過濾器應(yīng)用實(shí)例——禁止未授權(quán)的IP訪問站點(diǎn)在實(shí)345.8.3過濾器應(yīng)用實(shí)例——版權(quán)過濾器現(xiàn)在的網(wǎng)頁都會在尾部加上版權(quán)標(biāo)志,對于這一操作,我們可以運(yùn)用過濾器很方便地實(shí)現(xiàn)它。5.8.3過濾器應(yīng)用實(shí)例——版權(quán)過濾器現(xiàn)在的網(wǎng)頁都會在尾355.9Servlet監(jiān)聽器Servlet監(jiān)聽器是當(dāng)今Web應(yīng)用開發(fā)的一個(gè)重要組成部分。Servlet監(jiān)聽器主要用來對Web應(yīng)用進(jìn)行監(jiān)聽和控制,極大地增強(qiáng)了Web應(yīng)用的事件處理能力。一般來說,Servlet監(jiān)聽就是指一些特殊的Servlet類,這些類可以監(jiān)聽Web應(yīng)用的上下文信息、Servlet會話信息、Servlet請求信息。在實(shí)際操作中,程序員需要繼承或?qū)崿F(xiàn)一些已定義好的類或接口,從而編寫出自己用于監(jiān)聽的類。這些類對特定的信息進(jìn)行監(jiān)聽。一旦被監(jiān)聽的事件發(fā)生,這些類會自動調(diào)用相應(yīng)的方法去執(zhí)行指定的操作。5.9Servlet監(jiān)聽器Servlet監(jiān)聽器是當(dāng)今We365.9.1監(jiān)聽Servlet上下文信息Servlet上下文信息主要是指關(guān)于ServletContext接口的一些信息,比如ServletContext的創(chuàng)建和刪除,Servlet屬性的增加、刪除和修改等。這樣就可以實(shí)現(xiàn)對Servlet上下文信息的跟蹤和記錄。為了實(shí)現(xiàn)這樣的功能,程序員需要實(shí)現(xiàn)ServletContextListener和ServletContextAttributeListener接口,從而編寫出自己的Servlet類。ServletContext接口的主要方法如表5.4所示。方法名稱方法描述getAttribute(Stringname)返回Servlet環(huán)境對象中指定的屬性對象。如果該屬性對象不存在,返回空值getAttributeNames()返回一個(gè)Servlet環(huán)境對象中可用的屬性名的列表getContext(Stringuripath)返回一個(gè)Servlet環(huán)境對象,這個(gè)對象包括了特定URI路徑的Servlets和資源,如果該路徑不存在,則返回一個(gè)空值getRealPath(Stringpath)返回與一個(gè)符合該格式的虛擬路徑相對應(yīng)的真實(shí)路徑的StringgetResource(Stringuripath)返回一個(gè)URL對象,該對象反映位于給定的URL地址的Servlet環(huán)境對象已知的資源getServerInfo()返回一個(gè)String對象,該對象至少包括Servlet引擎的名字和版本號voidlog(Stringmsg,Throwablet)寫指定的信息到一個(gè)Servlet環(huán)境對象的log文件中setAttribute(Stringname,Objecto)給予Servlet環(huán)境對象中你所指定的對象一個(gè)名稱removeAttribute(Stringname)從指定的Servlet環(huán)境對象中刪除一個(gè)屬性5.9.1監(jiān)聽Servlet上下文信息Servlet上下375.9.1監(jiān)聽Servlet上下文信息在使用這個(gè)監(jiān)聽器之前還需要對Web模塊中的web.xml配置文件進(jìn)行配置,配置代碼如圖5.75所示。然后我們就可以編寫一個(gè)JSP程序testListener.jsp來操作ServletContext的屬性,看監(jiān)聽器程序做出什么反應(yīng)。5.9.1監(jiān)聽Servlet上下文信息在使用這個(gè)監(jiān)聽器之385.9.2監(jiān)聽HTTP會話信息HTTP會話信息指的是Session對象的創(chuàng)建和銷毀、會話中屬性的設(shè)置請求、會話的狀態(tài)和會話的綁定信息等。通過對HTTP會話信息的監(jiān)聽,可以進(jìn)行一些很有用的操作,比如,統(tǒng)計(jì)當(dāng)前會話的數(shù)目、設(shè)置某個(gè)對話的屬性、了解某個(gè)對話的狀態(tài)等。與ServletContext監(jiān)聽的實(shí)現(xiàn)方法類似,對HTTP會話的監(jiān)聽也是通過實(shí)現(xiàn)特定的接口來完成的。監(jiān)聽HTTP會話信息需要使用到三個(gè)接口類:HttpSessionListener、HttpSessionActivationListener和HttpSessionAttributeListener接口。5.9.2監(jiān)聽HTTP會話信息HTTP會話信息指的是Se395.9.2監(jiān)聽HTTP會話信息這些接口的主要方法如表5.5所示。方法名方法描述sessionCreated(HttpSessionEventarg0)方法進(jìn)行Http會話創(chuàng)建的監(jiān)聽,如果Http會話被創(chuàng)建將調(diào)用該方法sessionDestroyed(HttpSessionEventarg0)方法對Http會話銷毀進(jìn)行監(jiān)聽,如果某個(gè)Http會話被釋放將調(diào)用該方法sessionDidActivate(HttpSessionEventarg0)方法對Http會話處于active情況進(jìn)行監(jiān)聽sessionWillPassivate(HttpSessionEventarg0)方法對Http會話處于passivate情況進(jìn)行監(jiān)聽attributeAdded(HttpSessionBindingEventarg0)方法對Http會話中屬性添加進(jìn)行監(jiān)聽attributeReplaced(HttpSessionBindingEventarg0)方法對Http會話中屬性修改進(jìn)行監(jiān)聽attributeRemoved(HttpSessionBindingEventarg0)方法對Http會話中屬性刪除進(jìn)行監(jiān)聽5.9.2監(jiān)聽HTTP會話信息這些接口的主要方法如表5.405.9.3對客戶端請求進(jìn)行監(jiān)聽客戶端請求信息是指請求對象的創(chuàng)建、銷毀以及其屬性的添加、更改和刪除。一旦可以對客戶端發(fā)向服務(wù)器的請求進(jìn)行監(jiān)聽,就可以對它們進(jìn)行識別,然后統(tǒng)一處理。對客戶端請求信息的監(jiān)聽的實(shí)現(xiàn)方法與上面兩種類似,通過實(shí)現(xiàn)ServletRequestListener和ServletRequestAttributeListener接口來完成。這些接口的主要方法如表5.6所示。方法名方法描述ServletRequestListener()方法監(jiān)聽客戶端請求的創(chuàng)建和銷毀attributeAdded(HttpSessionBindingEventarg0)方法對Http會話中屬性添加進(jìn)行監(jiān)聽attributeReplaced(HttpSessionBindingEventarg0)方法對Http會話中屬性修改進(jìn)行監(jiān)聽attributeRemoved(HttpSessionBindingEventarg0)方法對Http會話中屬性刪除進(jìn)行監(jiān)聽5.9.3對客戶端請求進(jìn)行監(jiān)聽客戶端請求信息是指請求對象415.10小結(jié)本章首先介紹了Servlet編程方面的基礎(chǔ)知識,然后在此基礎(chǔ)上介紹了Servlet的配置和處理方法,接著我們?yōu)榇蠹抑v解了如何利用JSP頁面調(diào)用Servlet和有關(guān)Servlet的文件操作,最后我們通過實(shí)例講解了Servlet的具體應(yīng)用和過濾器、監(jiān)聽器的知識。本章的重點(diǎn)是Servlet的文件操作以及Servlet應(yīng)用方面的知識,難點(diǎn)是難點(diǎn)是Session技術(shù)以及Servlet過濾器、監(jiān)聽器知識的理解和應(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)都會看到Servlet的影子。因此,充分了解Servlet的原理和使用方法,對于以后學(xué)習(xí)Struts等Web框架將起到非常大的幫助。本章我們將為大家介紹Servlet的基礎(chǔ)知識,并通過具體的示例介紹Servlet的強(qiáng)大功能。第5章Servlet編程Servlet是JavaWeb435.1Servlet基礎(chǔ)Servlet在本質(zhì)上就是Java類。編寫Servlet需要遵循Java的基本語法,但是與一般Java類所不同的是。Servlet是只能運(yùn)行在服務(wù)器端的Java類,而且必需遵循特殊的規(guī)范,在運(yùn)行的過程中有自己的生命周期。5.1Servlet基礎(chǔ)Servlet在本質(zhì)上就是Jav445.1.1什么是ServletServlet是運(yùn)行于服務(wù)器端的、按照其自身規(guī)范編寫的Java應(yīng)用程序。我們可以用圖5.1來解釋這個(gè)概念。Servlet的主要功能是用來接受、處理客戶端請求,并把處理結(jié)果返回到客戶端顯示。其作用過程如圖5.2所示。5.1.1什么是ServletServlet是運(yùn)行于服務(wù)455.1.2Servlet的生命周期Servlet需要在特定的容器中才能運(yùn)行,在這里所說的容器即Servlet運(yùn)行的時(shí)候所需的運(yùn)行環(huán)境。一般情況下,市面上常見的JavaWebServer都可以支持Servlet,例如Tomcat、Resin、Weblogic、WebSphere等,在本書中采用Tomcat作為Servlet的容器,由Tomcat為Servlet提供基本的運(yùn)行環(huán)境。Servlet的生命周期指的是Servlet從被Web服務(wù)器加載到它被銷毀的整個(gè)生命過程。這個(gè)過程如圖5.3所示。5.1.2Servlet的生命周期Servlet需要在特465.1.2Servlet的生命周期從圖5.3中我們呢可以看出,Servlet生命周期的執(zhí)行大致分為4個(gè)步驟,如圖5.4所示。在以上幾個(gè)階段中,Servlet對外提供服務(wù)階段是最重要的。service()方法是編程人員真正要關(guān)心的方法。因?yàn)樗攀荢ervlet真正開始響應(yīng)客戶端請求,并且處理業(yè)務(wù)邏輯的方法。service()接收到客戶端請求后,再調(diào)用該Servlet的相應(yīng)的方法去處理請求。所以程序員在編寫自己的Servlet時(shí),一般只需要重寫方法。在該方法中去處理客戶端請求,并把處理結(jié)果返回。5.1.2Servlet的生命周期從圖5.3中我們呢可以475.2簡單Servlet開發(fā)配置示例在這一節(jié)中我們主要應(yīng)用Servlet編寫一個(gè)HelloWorld程序,實(shí)現(xiàn)向客戶端瀏覽器中輸出“HelloWorld”信息。在系統(tǒng)中創(chuàng)建的第一個(gè)Servlet程序系統(tǒng)會為我們自動生成web.xml配置文件,但是以后的Servlet程序就需要我們自己來配置了。即一般情況下都需要在當(dāng)前應(yīng)用項(xiàng)目的web.xml配置文件中對各個(gè)Servlet進(jìn)行配置,其中web.xml文件的位置在當(dāng)前項(xiàng)目應(yīng)用的WEB-INF文件夾下。我們就結(jié)合圖5.8的示例來講解如何對Servlet進(jìn)行配置,如圖5.9所示。5.2簡單Servlet開發(fā)配置示例在這一節(jié)中我們主要應(yīng)485.2簡單Servlet開發(fā)配置示例總之,編寫一個(gè)Servlet要經(jīng)過以下三個(gè)步驟:(1)編寫Servlet的功能代碼,即實(shí)現(xiàn)功能的代碼類。(2)把編譯成功的Servlet功能代碼類文件拷貝到當(dāng)前應(yīng)用項(xiàng)目的WEB-INF/classes目錄下。(3)在當(dāng)前應(yīng)用項(xiàng)目的web.xml文件中對Servlet進(jìn)行配置,即在web.xml中添加配置信息。經(jīng)過這樣三個(gè)步驟我們就可以通過瀏覽器訪問這個(gè)Servlet了。5.2簡單Servlet開發(fā)配置示例總之,編寫一個(gè)Ser495.3使用HttpServlet處理客戶端請求HttpServlet是使用HTTP協(xié)議的Web服務(wù)器的Servlet類,這個(gè)類已經(jīng)被系統(tǒng)定義好。該類的一些方法,如doGet()方法、doPost()方法等,提供了處理客戶端請求的接口。在實(shí)際編程中,程序員需要繼承這個(gè)類,并重寫上述方法,去編寫自己的Servlet。使用重寫后的方法,就可以完成對客戶端請求進(jìn)行處理。5.3使用HttpServlet處理客戶端請求HttpS505.3.1處理Get請求doGetdoGet()方法是HttpServlet類中用來處理Get請求的方法。用戶通過繼承HttpServlet,重寫doGet()方法,實(shí)現(xiàn)對客戶端的Get請求進(jìn)行處理。要調(diào)用doGet()方法,必須在客戶端的表單里指定請求的類型為Get。doGet()方法的語法格式如圖5.10所示。5.3.1處理Get請求doGetdoGet()方法是H515.3.2處理Post請求doPostdoPost()是HttpServlet中用于處理Post請求的方法。如果要調(diào)用doPost()方法,必須在表單中指定Post請求。doPost()方法與doGet()方法的用法一般來說沒什么區(qū)別,doGet()方法用于處理httpget請求,doPost()方法用于外理httppost請求。至于它們的不同,簡單的說,get是通過httpheader來傳輸數(shù)據(jù),有字?jǐn)?shù)限制,而post則是通過httpbody來傳輸數(shù)據(jù),沒有字?jǐn)?shù)的限制。doPost()方法的語法格式如圖5.14所示。5.3.2處理Post請求doPostdoPost()是525.3.2處理Post請求doPost下面我們來為大家介紹一下javax.servlet.http提供的HTTPServlet應(yīng)用編程接口。創(chuàng)建Servlet,需要擴(kuò)展HttpServlet類,HttpServlet類包含init()、destroy()、service()等方法,其中init()和destroy()方法是繼承的。具體的方法及方法描述如表5.1所示。當(dāng)服務(wù)器調(diào)用sevlet的Service()、doGet()和doPost()這三個(gè)方法時(shí),均需要“請求”和“響應(yīng)”對象作為參數(shù)?!罢埱蟆睂ο筇峁┯嘘P(guān)請求的信息,而“響應(yīng)”對象提供了一個(gè)將響應(yīng)信息返回給瀏覽器的一個(gè)路徑。方法名方法描述init()方法服務(wù)器裝入Servlet時(shí)執(zhí)行??梢耘渲梅?wù)器,在啟動服務(wù)器或客戶機(jī)首次訪問Servlet時(shí)裝入Servletservice()方法Servlet的核心。每當(dāng)一個(gè)客戶請求一個(gè)HttpServlet對象,該對象的service()方法就要被調(diào)用,而且傳遞給這個(gè)方法一個(gè)"請求"(ServletRequest)對象和一個(gè)"響應(yīng)"(ServletResponse)對象作為參數(shù)destroy()方法在服務(wù)器停止且卸裝Servlet時(shí)執(zhí)行該方法??梢詫ervlet作為服務(wù)器進(jìn)程的一部分來關(guān)閉GetServletConfig()方法GetServletConfig()方法返回一個(gè)ServletConfig對象,該對象用來返回初始化參數(shù)和ServletContext。ServletContext接口提供有關(guān)servlet的環(huán)境信息GetServletInfo()方法GetServletInfo()方法是一個(gè)可選的方法,它提供有關(guān)servlet的信息,如作者、版本、版權(quán)等5.3.2處理Post請求doPost下面我們來為大家介535.4

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論