使用過濾器和監聽器_第1頁
使用過濾器和監聽器_第2頁
使用過濾器和監聽器_第3頁
使用過濾器和監聽器_第4頁
使用過濾器和監聽器_第5頁
已閱讀5頁,還剩27頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

使用過濾器和監聽器第一頁,共三十二頁,編輯于2023年,星期五本章學習目標:

理解過濾器和監聽器的執行過程和作用掌握過濾器和監聽器的開發和部署第二頁,共三十二頁,編輯于2023年,星期五13.1Filter在Web開發中的應用

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

javax.servlet.FilterChain接口由容器實現,容器將其實例作為參數傳入過濾器對象的doFilter()方法中。過濾器對象使用FilterChain對象調用過濾器鏈中的下一個過濾器或者是將調用目標資源。第九頁,共三十二頁,編輯于2023年,星期五13.1.7過濾器的部署在創建過濾器之后必須將它添加到部署描述符中,這樣容器才會將過濾器投入到服務中去。配置工作由兩部分組成:1.聲明過濾器<filter>元素用于在Web應用中聲明一個過濾器。<filter>元素的結構如圖13-6所示。第十頁,共三十二頁,編輯于2023年,星期五filterdescriptionfilter-namedisplay-namefilter-classiconinit-paramdescriptionparam-nameparam-value第十一頁,共三十二頁,編輯于2023年,星期五2.設置過濾器映射<filter-mapping><filter-mapping>元素用于指定過濾器關聯的URL樣式或者Servlet。<filter-mapping>結構如圖13-7所示。filter-mappingfilter-nameservlet-nameurl-pattern0..4dispatcheror第十二頁,共三十二頁,編輯于2023年,星期五使用<filter-mapping>元素使用<servlet-name>元素將過濾器連接到一個servlet中。使用<url-pattern>將過濾器映射到某個URL模式使用<url-pattern>將過濾器映射到某個URL模式的方法會獲得更大的靈活性,它能夠使開發人員將過濾器應用于一組servlet、JSP或任何靜態資源。第十三頁,共三十二頁,編輯于2023年,星期五13.1.8對請求數據進行處理的過濾器

【例13-2】使用過濾器校驗表單數據在Web應用,常要求用戶注冊成功后才能使用。有時用戶在注冊時輸入不合法。在過濾器中攔截客戶端請求,獲得輸入的參數數據,對輸入的參數數據的合法性進行校驗,將不合法的請求重新定位到一個錯誤頁面。第一步:開發3個jsp頁面:CheckForm.jsp、CheckFormSuccess.jsp和CheckFormFail.jsp第二步:編寫過濾器類:過濾器類的名字為CheckFormFilter.java,第三步:在web.xml文件中添加配置過濾器CheckFormFilter第四步:驗證過濾器CheckFormFilter運行效果第十四頁,共三十二頁,編輯于2023年,星期五第十五頁,共三十二頁,編輯于2023年,星期五【例13-3】使用過濾器改變請求的編碼在應用開發中,經常使用過濾功能對客戶端的請求進行統一編碼。當沒有指定request的編碼方式時,從客戶端得到的數據是ISO-8859-1編碼的。第十六頁,共三十二頁,編輯于2023年,星期五解決辦法之一就是開發一個過濾器對請求進行統一編碼,一次性解決所有頁面請求的編碼轉換問題。第一步:編寫CheckForm.jsp和CheckFormSuccess.jsp頁面。第二步:編寫過濾器類:過濾器類的名字為Encoding.java第三步:在web.xml文件中配置過濾器EncodingFilter。為了保證過濾器EncodingFilter在CheckFormFilter之前處理請求,必須在過濾器CheckFormFilter之前配置過濾器EncodingFilter。第十七頁,共三十二頁,編輯于2023年,星期五第十八頁,共三十二頁,編輯于2023年,星期五13.1.9對響應內容進行壓縮的過濾器

提高網站的訪問速度,從軟件角度來說首先就是要盡可能地提高web應用程序的執行速度,可以優化代碼的執行效率和使用緩存來實現。如果在此基礎上還需進一步提高網頁的瀏覽速度,那就可以對響應內容進行壓縮,以節省網絡的帶寬,提高訪問速度。第十九頁,共三十二頁,編輯于2023年,星期五利用請求和響應的包裝類(wrapper)來間接改變請求和響應的信息。在Servlet規范中定義了4個包裝類:publicclassjavax.servlet.ServeltRequestWrapperextendsjava.lang.ObjectimplementsServletRequestpublicclassjavax.servlet.ServeltResponseWrapperextendsjava.lang.ObjectimplementsServletResponsepublicclassjavax.servlet.HttpServeltRequestWrapperextendsServletRequestWrapperimplementsHttpServletRequestpublicclassjavax.servlet.HttpServeltResponseWrapperextendsServletResponseWrapperimplementsHttpServletResponse這4個包裝類分別實現了請求或響應的接口,它們在構造方法中接受真正的請求和響應對象,然后利用該對象的方法來完成自己需要實現的方法。包裝類是裝飾設計模式的運用,它給我們提供了一種不使用繼承而修改或增加現有對象功能的方法。第二十頁,共三十二頁,編輯于2023年,星期五【例13-5】利用包裝類改變請求和響應信息。我們只需要編寫一個包裝類的子類,然后覆蓋需要修改的方法就可以了。使用java.util.zip.GZIPOutputStream作為響應內容的輸出流對象。GZIPOutputStream是過濾流類,使用GZIP壓縮格式寫入壓縮數據。第一步:編寫GZIPServletOutputStream.java第二步:編寫CompressionResponseWrapper.java第三步:編寫CompressionFilter.java第四步:部署過濾器

編輯web.xml文件,配置過濾器第五步:運行web應用程序,測試CompressionFilter第二十一頁,共三十二頁,編輯于2023年,星期五第二十二頁,共三十二頁,編輯于2023年,星期五13.2Servlet監聽器

Servlet監聽器是WEB應用程序事件模型的一部分,Servlet監聽器用于監聽一些WEB應用中重要事件的發生,監聽器對象可以在事情發生前、發生后Servlet容器就會產生相應的事件,Servlet監聽器用來處理這些事件。第二十三頁,共三十二頁,編輯于2023年,星期五13.2.1監聽器接口

ServletAPI中定義了8個監聽器,根據監聽對象的類型和范圍可以分為3類:ServletContext事件監聽器、HTTPSession事件監聽器和ServletRequest事件監聽器。8個監聽器接口如表13-2所示。第二十四頁,共三十二頁,編輯于2023年,星期五13.2.2ServletContextListener接口

在Web應用程序啟動時需要執行一些初始化任務時,可以編寫實現了ServletContextListener接口的監聽器類。在ServletContextListener接口中定義了兩個事件處理方法,分別是contextInitialize()和contextDestroyed()。ServletContextListener整個工作過程如圖13-18所示第二十五頁,共三十二頁,編輯于2023年,星期五13.2.3ServletContextAttributeListener接口

ServletContext的屬性是由Web應用程序中所有的servlet所共享的。為保證屬性在整個Web應用范圍內的一致性,有必要監視ServletContext對象的任何屬性的改變。ServletContextAttributeListener偵聽器就是為了這一目的而設立的。該偵聽器是一個實現了接口ServletContextAttributeListener的Java類第二十六頁,共三十二頁,編輯于2023年,星期五圖13-19ServletContextAttributeListener操作順序圖第二十七頁,共三十二頁,編輯于2023年,星期五【13-6】開發一個對ServletContext及其屬性進行監聽的程序。第一步:編寫TestListener.java第二步:在web.xml添加如下代碼部署監聽器第三步:編寫測試JSP頁面testContext.jsp第四步:看運行結果c:\test.txt文件第二十八頁,共三十二頁,編輯于2023年,星期五13.2.4HttpSessionBindingListener接口如果一個對象實現了HttpSessionBindingListener接口,當這個對象被綁定到Session中或從Session中刪除時,Servlet容器會通知這個對象,這個對象在接收到通知后,做初始化操作或清除狀態的操作。第二十九頁,共三十二頁,編輯于2023年,星期五HttpSessionBindingListener接口提供了如下方法:publicvoidvalueBound(HttpSessionBindingEventevent)當對象正在被綁定到Session中,Servlet容器通知對象它將被綁定到某個會話并標識該會話。publicvoidvalueUnbound(HttpSessionBindingEventevent)當從Session中刪除對象時,Servlet容器通知對象要從某個會話中取消對它的綁定并標識該會話第三十頁,共三十二頁,編輯于2023年,星期五容器通過HttpSessionBindingEvent對象來通知偵聽器發生的事件的具體信息。提供了2種方法:publicHttpSessionBindi

溫馨提示

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

評論

0/150

提交評論