使用過(guò)濾器和監(jiān)聽(tīng)器_第1頁(yè)
使用過(guò)濾器和監(jiān)聽(tīng)器_第2頁(yè)
使用過(guò)濾器和監(jiān)聽(tīng)器_第3頁(yè)
使用過(guò)濾器和監(jiān)聽(tīng)器_第4頁(yè)
使用過(guò)濾器和監(jiān)聽(tīng)器_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

使用過(guò)濾器和監(jiān)聽(tīng)器第一頁(yè),共三十二頁(yè),2022年,8月28日本章學(xué)習(xí)目標(biāo):

理解過(guò)濾器和監(jiān)聽(tīng)器的執(zhí)行過(guò)程和作用掌握過(guò)濾器和監(jiān)聽(tīng)器的開(kāi)發(fā)和部署第二頁(yè),共三十二頁(yè),2022年,8月28日13.1Filter在Web開(kāi)發(fā)中的應(yīng)用

過(guò)濾器(Filter)是在Servlet2.3規(guī)范中引入的新功能,并在Servlet2.4規(guī)范中得到增強(qiáng)。Servlet過(guò)濾器是一種Web組件,它們攔截請(qǐng)求和響應(yīng),以便查看、提取或以某種方式操作客戶機(jī)和服務(wù)器之間交換的數(shù)據(jù)。第三頁(yè),共三十二頁(yè),2022年,8月28日13.1.1過(guò)濾器概述對(duì)Web應(yīng)用來(lái)說(shuō),過(guò)濾器就是駐留在服務(wù)器端,在源數(shù)據(jù)和目的數(shù)據(jù)間,對(duì)Web請(qǐng)求和Web響應(yīng)的頭屬性(Header)和內(nèi)容體(Body)進(jìn)行操作的一種特殊Web組件。如圖13-1所示。過(guò)濾器目標(biāo)資源瀏覽器請(qǐng)求響應(yīng)Web容器第四頁(yè),共三十二頁(yè),2022年,8月28日在一個(gè)Web應(yīng)用程序中,可以部署多個(gè)過(guò)濾器,這些過(guò)濾器組成一個(gè)過(guò)濾器鏈。過(guò)濾器鏈中的每個(gè)過(guò)濾器都有特定的操作,請(qǐng)求和響應(yīng)在瀏覽器和目標(biāo)資源之間按照部署描述符中聲明的過(guò)濾器的順序,在過(guò)濾器之間進(jìn)行傳遞。如圖13-2所示。過(guò)濾器1目標(biāo)資源瀏覽器請(qǐng)求響應(yīng)Web容器過(guò)濾器3過(guò)濾器4過(guò)濾器2第五頁(yè),共三十二頁(yè),2022年,8月28日13.1.2FilterAPI與過(guò)濾器開(kāi)發(fā)相關(guān)的接口和類包含在javax.servlet和包中,主要的接口和類如表13-1所示。接口/類說(shuō)明javax.servlet.Filter接口過(guò)濾器是執(zhí)行過(guò)濾任務(wù)的對(duì)象,這些任務(wù)是針對(duì)對(duì)某一資源(servlet或靜態(tài)內(nèi)容)的請(qǐng)求或來(lái)自某一資源的響應(yīng)執(zhí)行的,抑或同時(shí)針對(duì)這兩者執(zhí)行。javax.servlet.FilterConfig接口servlet容器使用的過(guò)濾器配置對(duì)象,該對(duì)象在初始化期間將信息傳遞給過(guò)濾器。javax.servlet.FilterChain接口FilterChain是servlet容器為開(kāi)發(fā)人員提供的對(duì)象,它提供了對(duì)某一資源的已過(guò)濾請(qǐng)求調(diào)用鏈的視圖。過(guò)濾器使用FilterChain調(diào)用鏈中的下一個(gè)過(guò)濾器,如果調(diào)用的過(guò)濾器是鏈中的最后一個(gè)過(guò)濾器,則調(diào)用鏈末尾的資源。javax.servlet.ServeltRequestWrapper類extendsjava.lang.ObjectimplementsServletRequest提供ServletRequest接口的便捷實(shí)現(xiàn),希望將請(qǐng)求適配到Servlet的開(kāi)發(fā)人員可以子類化該接口。默認(rèn)情況下,方法通過(guò)包裝的請(qǐng)求對(duì)象調(diào)用。javax.servlet.ServeltResponseWrapper類extendsjava.lang.ObjectimplementsServletResponse提供ServletResponse接口的便捷實(shí)現(xiàn),希望根據(jù)Servlet適配響應(yīng)的開(kāi)發(fā)人員可以子類化該接口。默認(rèn)情況下,方法通過(guò)包裝的響應(yīng)對(duì)象調(diào)用。javax.servlet.HttpServeltRequestWrapper類extendsServletRequestWrapperimplementsHttpServletRequest提供HttpServletRequest接口的便捷實(shí)現(xiàn),希望將請(qǐng)求適配到Servlet的開(kāi)發(fā)人員可以子類化該接口。此類實(shí)現(xiàn)Wrapper或Decorator模式。默認(rèn)情況下,方法通過(guò)包裝的請(qǐng)求對(duì)象調(diào)用。javax.servlet.HttpServeltResponseWrapper類extendsServletResponseWrapperimplementsHttpServletResponse提供HttpServletResponse接口的便捷實(shí)現(xiàn),希望根據(jù)Servlet適配響應(yīng)的開(kāi)發(fā)人員可以子類化該接口。此類實(shí)現(xiàn)Wrapper或Decorator模式。默認(rèn)情況下,方法通過(guò)包裝的響應(yīng)對(duì)象調(diào)用。第六頁(yè),共三十二頁(yè),2022年,8月28日13.1.3Filter接口所有的過(guò)濾器在開(kāi)發(fā)中必須實(shí)現(xiàn)接口,并且提供一個(gè)公開(kāi)的不帶參數(shù)的構(gòu)造方法。接口定義了init()、doFilter()和destroy()三方法,和Servelt接口類似,這三個(gè)方法分別對(duì)應(yīng)Servlet過(guò)濾器生命周期中的初始化、響應(yīng)和銷毀三個(gè)階段第七頁(yè),共三十二頁(yè),2022年,8月28日13.1.4FilterConfig接口當(dāng)容器對(duì)Filter對(duì)象進(jìn)行初始化時(shí),容器調(diào)用Filter的init方法,并傳入一個(gè)實(shí)現(xiàn)FilterConfig接口的對(duì)象。Filter可使用該對(duì)象獲得一些有用的信息。第八頁(yè),共三十二頁(yè),2022年,8月28日13.1.5FilterChain接口

接口由容器實(shí)現(xiàn),容器將其實(shí)例作為參數(shù)傳入過(guò)濾器對(duì)象的doFilter()方法中。過(guò)濾器對(duì)象使用FilterChain對(duì)象調(diào)用過(guò)濾器鏈中的下一個(gè)過(guò)濾器或者是將調(diào)用目標(biāo)資源。第九頁(yè),共三十二頁(yè),2022年,8月28日13.1.7過(guò)濾器的部署在創(chuàng)建過(guò)濾器之后必須將它添加到部署描述符中,這樣容器才會(huì)將過(guò)濾器投入到服務(wù)中去。配置工作由兩部分組成:1.聲明過(guò)濾器<filter>元素用于在Web應(yīng)用中聲明一個(gè)過(guò)濾器。<filter>元素的結(jié)構(gòu)如圖13-6所示。第十頁(yè),共三十二頁(yè),2022年,8月28日f(shuō)ilterdescriptionfilter-namedisplay-namefilter-classiconinit-paramdescriptionparam-nameparam-value第十一頁(yè),共三十二頁(yè),2022年,8月28日2.設(shè)置過(guò)濾器映射<filter-mapping><filter-mapping>元素用于指定過(guò)濾器關(guān)聯(lián)的URL樣式或者Servlet。<filter-mapping>結(jié)構(gòu)如圖13-7所示。filter-mappingfilter-nameservlet-nameurl-pattern0..4dispatcheror第十二頁(yè),共三十二頁(yè),2022年,8月28日使用<filter-mapping>元素使用<servlet-name>元素將過(guò)濾器連接到一個(gè)servlet中。使用<url-pattern>將過(guò)濾器映射到某個(gè)URL模式使用<url-pattern>將過(guò)濾器映射到某個(gè)URL模式的方法會(huì)獲得更大的靈活性,它能夠使開(kāi)發(fā)人員將過(guò)濾器應(yīng)用于一組servlet、JSP或任何靜態(tài)資源。第十三頁(yè),共三十二頁(yè),2022年,8月28日13.1.8對(duì)請(qǐng)求數(shù)據(jù)進(jìn)行處理的過(guò)濾器

【例13-2】使用過(guò)濾器校驗(yàn)表單數(shù)據(jù)在Web應(yīng)用,常要求用戶注冊(cè)成功后才能使用。有時(shí)用戶在注冊(cè)時(shí)輸入不合法。在過(guò)濾器中攔截客戶端請(qǐng)求,獲得輸入的參數(shù)數(shù)據(jù),對(duì)輸入的參數(shù)數(shù)據(jù)的合法性進(jìn)行校驗(yàn),將不合法的請(qǐng)求重新定位到一個(gè)錯(cuò)誤頁(yè)面。第一步:開(kāi)發(fā)3個(gè)jsp頁(yè)面:CheckForm.jsp、CheckFormSuccess.jsp和CheckFormFail.jsp第二步:編寫(xiě)過(guò)濾器類:過(guò)濾器類的名字為CheckFormFilter.java,第三步:在web.xml文件中添加配置過(guò)濾器CheckFormFilter第四步:驗(yàn)證過(guò)濾器CheckFormFilter運(yùn)行效果第十四頁(yè),共三十二頁(yè),2022年,8月28日第十五頁(yè),共三十二頁(yè),2022年,8月28日【例13-3】使用過(guò)濾器改變請(qǐng)求的編碼在應(yīng)用開(kāi)發(fā)中,經(jīng)常使用過(guò)濾功能對(duì)客戶端的請(qǐng)求進(jìn)行統(tǒng)一編碼。當(dāng)沒(méi)有指定request的編碼方式時(shí),從客戶端得到的數(shù)據(jù)是ISO-8859-1編碼的。第十六頁(yè),共三十二頁(yè),2022年,8月28日解決辦法之一就是開(kāi)發(fā)一個(gè)過(guò)濾器對(duì)請(qǐng)求進(jìn)行統(tǒng)一編碼,一次性解決所有頁(yè)面請(qǐng)求的編碼轉(zhuǎn)換問(wèn)題。第一步:編寫(xiě)CheckForm.jsp和CheckFormSuccess.jsp頁(yè)面。第二步:編寫(xiě)過(guò)濾器類:過(guò)濾器類的名字為Encoding.java第三步:在web.xml文件中配置過(guò)濾器EncodingFilter。為了保證過(guò)濾器EncodingFilter在CheckFormFilter之前處理請(qǐng)求,必須在過(guò)濾器CheckFormFilter之前配置過(guò)濾器EncodingFilter。第十七頁(yè),共三十二頁(yè),2022年,8月28日第十八頁(yè),共三十二頁(yè),2022年,8月28日13.1.9對(duì)響應(yīng)內(nèi)容進(jìn)行壓縮的過(guò)濾器

提高網(wǎng)站的訪問(wèn)速度,從軟件角度來(lái)說(shuō)首先就是要盡可能地提高web應(yīng)用程序的執(zhí)行速度,可以優(yōu)化代碼的執(zhí)行效率和使用緩存來(lái)實(shí)現(xiàn)。如果在此基礎(chǔ)上還需進(jìn)一步提高網(wǎng)頁(yè)的瀏覽速度,那就可以對(duì)響應(yīng)內(nèi)容進(jìn)行壓縮,以節(jié)省網(wǎng)絡(luò)的帶寬,提高訪問(wèn)速度。第十九頁(yè),共三十二頁(yè),2022年,8月28日利用請(qǐng)求和響應(yīng)的包裝類(wrapper)來(lái)間接改變請(qǐng)求和響應(yīng)的信息。在Servlet規(guī)范中定義了4個(gè)包裝類:publicclassjavax.servlet.ServeltRequestWrapperextendsjava.lang.ObjectimplementsServletRequestpublicclassjavax.servlet.ServeltResponseWrapperextendsjava.lang.ObjectimplementsServletResponsepublicclassjavax.servlet.HttpServeltRequestWrapperextendsServletRequestWrapperimplementsHttpServletRequestpublicclassjavax.servlet.HttpServeltResponseWrapperextendsServletResponseWrapperimplementsHttpServletResponse這4個(gè)包裝類分別實(shí)現(xiàn)了請(qǐng)求或響應(yīng)的接口,它們?cè)跇?gòu)造方法中接受真正的請(qǐng)求和響應(yīng)對(duì)象,然后利用該對(duì)象的方法來(lái)完成自己需要實(shí)現(xiàn)的方法。包裝類是裝飾設(shè)計(jì)模式的運(yùn)用,它給我們提供了一種不使用繼承而修改或增加現(xiàn)有對(duì)象功能的方法。第二十頁(yè),共三十二頁(yè),2022年,8月28日【例13-5】利用包裝類改變請(qǐng)求和響應(yīng)信息。我們只需要編寫(xiě)一個(gè)包裝類的子類,然后覆蓋需要修改的方法就可以了。使用作為響應(yīng)內(nèi)容的輸出流對(duì)象。GZIPOutputStream是過(guò)濾流類,使用GZIP壓縮格式寫(xiě)入壓縮數(shù)據(jù)。第一步:編寫(xiě)GZIPServletOutputStream.java第二步:編寫(xiě)CompressionResponseWrapper.java第三步:編寫(xiě)CompressionFilter.java第四步:部署過(guò)濾器

編輯web.xml文件,配置過(guò)濾器第五步:運(yùn)行web應(yīng)用程序,測(cè)試CompressionFilter第二十一頁(yè),共三十二頁(yè),2022年,8月28日第二十二頁(yè),共三十二頁(yè),2022年,8月28日13.2Servlet監(jiān)聽(tīng)器

Servlet監(jiān)聽(tīng)器是WEB應(yīng)用程序事件模型的一部分,Servlet監(jiān)聽(tīng)器用于監(jiān)聽(tīng)一些WEB應(yīng)用中重要事件的發(fā)生,監(jiān)聽(tīng)器對(duì)象可以在事情發(fā)生前、發(fā)生后Servlet容器就會(huì)產(chǎn)生相應(yīng)的事件,Servlet監(jiān)聽(tīng)器用來(lái)處理這些事件。第二十三頁(yè),共三十二頁(yè),2022年,8月28日13.2.1監(jiān)聽(tīng)器接口

ServletAPI中定義了8個(gè)監(jiān)聽(tīng)器,根據(jù)監(jiān)聽(tīng)對(duì)象的類型和范圍可以分為3類:ServletContext事件監(jiān)聽(tīng)器、HTTPSession事件監(jiān)聽(tīng)器和ServletRequest事件監(jiān)聽(tīng)器。8個(gè)監(jiān)聽(tīng)器接口如表13-2所示。第二十四頁(yè),共三十二頁(yè),2022年,8月28日13.2.2ServletContextListener接口

在Web應(yīng)用程序啟動(dòng)時(shí)需要執(zhí)行一些初始化任務(wù)時(shí),可以編寫(xiě)實(shí)現(xiàn)了ServletContextListener接口的監(jiān)聽(tīng)器類。在ServletContextListener接口中定義了兩個(gè)事件處理方法,分別是contextInitialize()和contextDestroyed()。ServletContextListener整個(gè)工作過(guò)程如圖13-18所示第二十五頁(yè),共三十二頁(yè),2022年,8月28日13.2.3ServletContextAttributeListener接口

ServletContext的屬性是由Web應(yīng)用程序中所有的servlet所共享的。為保證屬性在整個(gè)Web應(yīng)用范圍內(nèi)的一致性,有必要監(jiān)視ServletContext對(duì)象的任何屬性的改變。ServletContextAttributeListener偵聽(tīng)器就是為了這一目的而設(shè)立的。該偵聽(tīng)器是一個(gè)實(shí)現(xiàn)了接口ServletContextAttributeListener的Java類第二十六頁(yè),共三十二頁(yè),2022年,8月28日?qǐng)D13-19ServletContextAttributeListener操作順序圖第二十七頁(yè),共三十二頁(yè),2022年,8月28日【13-6】開(kāi)發(fā)一個(gè)對(duì)ServletContext及其屬性進(jìn)行監(jiān)聽(tīng)的程序。第一步:編寫(xiě)TestListener.java第二步:在web.xml添加如下代碼部署監(jiān)聽(tīng)器第三步:編寫(xiě)測(cè)試JSP頁(yè)面testContext.jsp第四步:看運(yùn)行結(jié)果c:\test.txt文件第二十八頁(yè),共三十二頁(yè),2022年,8月28日13.2.4HttpSessionBindingListener接口如果一個(gè)對(duì)象實(shí)現(xiàn)了HttpSessionBindingListener接口,當(dāng)這個(gè)對(duì)象被綁定到Session中或從Session中刪除時(shí),Servlet容器會(huì)通知這個(gè)對(duì)象,這個(gè)對(duì)象在接收到通知后,做初始化操作或清除狀態(tài)的操作。第二十九頁(yè),共三十二頁(yè),2022年,8月28日HttpSessionBindingListener接口提供了如下方法:publicvoidvalueBound(HttpSessionBindingEventevent)當(dāng)對(duì)象正在被綁定到Session中,Servlet容器通知對(duì)象它將被綁定到某個(gè)會(huì)話并標(biāo)識(shí)該會(huì)話。publicvoidvalueUnbound(HttpSessionBindingEventevent)當(dāng)從Session中刪除對(duì)象時(shí),Servlet容器通知對(duì)象要從某個(gè)會(huì)話中取消對(duì)它的綁定并標(biāo)識(shí)該會(huì)話第三十頁(yè),共三十二頁(yè),2022年,8月28日容器通過(guò)HttpSessionBindingEvent對(duì)象來(lái)通知偵聽(tīng)器發(fā)生的事件的具體信息。提供了2種方法:publicHttpSessionBindingEvent(Htt

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論