




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
JavaWeb開發從入門到實踐JavaWebDevelopmentFromIntroductiontoPractice過濾器和監聽器Chap07提綱過濾器和監聽器過濾器和監聽器分別用于處理用戶輸入的事件和動態監控應用程序的狀態變化。7.1過濾器7.2監聽器7.3本章小結7.1過濾器7.1.1過濾器的概念7.1.2配置過濾器7.1.3過濾器的生命周期7.1.4過濾器的鏈及執行順序7.1.5過濾器的應用7.1.1過濾器的概念過濾器(Filter)的作用就是把瀏覽器對資源的請求攔截下來。圖
7-1
過濾器的工作原理7.1.1過濾器的概念過濾器需要實現jakarta.servlet.Filter接口publicvoidinit(FilterConfigfilterConfig)throwsServletException{}
publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{}
publicvoiddestroy(){}init()方法該方法用來初始化過濾器對象doFilter()方法該方法是主要實現過濾的方法destroy()方法該方法的作用是釋放過濾器中使用的資源,是在關閉Web服務器時執行
7.1.2配置過濾器配置過濾器有兩種方法一是在web.xml中配置二是通過注解配置<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.swxy.filter.MyFilter</filter-class></filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>@WebFilter(filterName="myFilter",
//指定Filter的name屬性,等價于<filter-name>標簽 urlPatterns="/*",
//指定Filter的URL匹配模式
initParams={
//設置過濾器的初始參數
@WebInitParam(name="username",value="Charles")})
publicclassMyFilterimplementsFilter{//省略}7.1.3過濾器的生命周期過濾器的生命周期是:實例化→初始化→過濾→銷毀。圖
7-2
過濾器和Servlet的生命周期7.1.3過濾器的生命周期案例:過濾器、Servlet的生命周期示例MyFilter.java@WebFilter("/*")
publicclassMyFilterimplementsFilter{
publicMyFilter(){
System.out.println("Filter構造方法");
}
@Override
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
System.out.println("Filter初始化");
}
7.1.3過濾器的生命周期@Override
publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{
System.out.println("過濾前");
filterChain.doFilter(servletRequest,servletResponse);//放行
System.out.println("過濾后");
}
@Override
publicvoiddestroy(){
System.out.println("Filter銷毀方法");
}
}7.1.3過濾器的生命周期@WebServlet("/myServlet") publicclassMyServletextendsHttpServlet{ publicMyServlet(){System.out.println("Servlet構造方法");} @Override publicvoidinit()throwsServletException{ System.out.println("Servlet初始化方法"); } @Override protectedvoidservice(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{ System.out.println("Servlet的service()方法"); } @Override publicvoiddestroy(){ System.out.println("Servlet銷毀方法"); } }MyServlet.java7.1.3過濾器的生命周期查看測試結果Filter構造方法Filter初始化Servlet構造方法Servlet初始化方法過濾前Servlet的service()方法過濾后Servlet銷毀方法Filter銷毀方法7.1.4過濾器的鏈及執行順序過濾器鏈是指在一個Web應用,可以配置多個過濾器,這些過濾器稱為過濾器鏈。圖
7-3
過濾器鏈過濾器鏈7.1.4過濾器的鏈及執行順序執行過濾器1的放行前邏輯代碼執行過濾器1的放行代碼執行過濾器2的放行前邏輯代碼執行過濾器2的放行代碼執行過濾器3的放行前邏輯代碼執行過濾器3的放行代碼訪問Web資源執行過濾器3的放行后邏輯代碼執行過濾器2的放行后邏輯代碼執行過濾器1的放行后邏輯代碼7.1.4過濾器的鏈及執行順序過濾器的執行順序過濾器的攔截路徑相同時:首先按照<filter-mapping>標記在web.xml中出現的先后順序執行過濾器然后接照過濾器類名的字典順序執行注解的過濾器。7.1.5過濾器的應用JavaWeb過濾器是一種用于攔截、處理和修改請求和響應的組件,用于實現一些通用的功能字符編碼轉換過濾器1、EncodingFilter.java@WebFilter(urlPatterns="/*", initParams={@WebInitParam(name="encoding",value="UTF-8")})
publicclassEncodingFilterimplementsFilter{
privateStringencoding="";
@Override
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
this.encoding=filterConfig.getInitParameter("encoding");
}
7.1.5過濾器的應用@Override
publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{
HttpServletRequestrequest=(HttpServletRequest)servletRequest;
//轉子接口
HttpServletResponseresponse=(HttpServletResponse)servletResponse;//轉子接口
Stringmethod=request.getMethod();//獲取請求方式(如GET、POST等)
if("POST".equals(method)){//請求方式為POST時,中文亂碼的處理
request.setCharacterEncoding(encoding);
}else{//請求方式為GET時,中文亂碼的處理
Enumeration<String>parameterNames=request.getParameterNames();
while(parameterNames.hasMoreElements()){
Stringelement=parameterNames.nextElement();
Stringvalue=request.getParameter(element);
if(value!=null&&!"".equals(value)){
value=newString(value.trim().getBytes("ISO-8859-1"),encoding);
}
}
}filterChain.doFilter(servletRequest,servletResponse);//過濾器放行
}
7.1.5過濾器的應用 @Override
publicvoiddestroy(){
Filter.super.destroy();
}
}2、EncodingFilter.java@WebServlet("/encodingServlet")
publicclassEncodingServletextendsHttpServlet{
@Override
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
Stringusername=req.getParameter("username");System.out.println(username);
}
}7.1.5過濾器的應用臟字過濾器1、準備屬性文件perties。在項目src下新建文件夾“resource”,在該文件夾下創建文件perties狗屁=***廢物=***該文件經過native2ascii編碼后才能使用,命令語法如下:native2ascii-encodingutf-8源文件轉換后文件7.1.5過濾器的應用2、定義響應器包裝類publicclassReplaceWrapperextendsHttpServletResponseWrapper{
privateCharArrayWritercharWriter=newCharArrayWriter();
publicReplaceWrapper(HttpServletResponseresponse){
super(response);//必須調用父類構造方法
}
publicPrintWritergetWriter()throwsIOException{
returnnewPrintWriter(charWriter);//字符數組緩存輸出內容
}
publicCharArrayWritergetCharWriter(){
returncharWriter;
}
}7.1.5過濾器的應用3、定義用來替換臟字的過濾器@WebFilter(urlPatterns="/*",initParams={@WebInitParam(name="path",value="resource/perties")})publicclassReplaceFilterimplementsFilter{ privatePropertiesproperties=newProperties(); @Override publicvoidinit(FilterConfigfilterConfig)throwsServletException{
Stringpath=filterConfig.getInitParameter("path");//獲取初始化參數(文件名) try{ //加載資源文件 properties.load(ReplaceFilter.class.getClassLoader().getResourceAsStream(path)); }catch(Exceptione){ e.printStackTrace(); }
}
7.1.5過濾器的應用 @Override publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{
HttpServletResponseresponse=(HttpServletResponse)servletResponse; ReplaceWrapperresp=newReplaceWrapper(response);//實例化響應器包裝類 filterChain.doFilter(servletRequest,resp); Stringstr=resp.getCharWriter().toString();//緩存輸出字符 for(Objecto:properties.keySet()){//循環文件(如:perties)中的key Stringkey=(String)o;
str=str.replace(key,properties.getProperty(key));//替換非法字符 } PrintWriterout=response.getWriter();//使用原來的HttpServletResponse輸出字符 out.write(str); }}7.1.5過濾器的應用@WebServlet("/replaceFilterServlet")publicclassReplaceFilterServletextendsHttpServlet{ @Override protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{ resp.setContentType("text/html;charset=UTF-8"); PrintWriterout=resp.getWriter(); out.println("<!DOCTYPEhtml>"); out.println("<HTML>"); out.println("<HEAD><TITLE>臟字過濾器的使用</TITLE></HEAD>"); out.println("helloeveryone!大家好<br/>狗屁<br/>廢物"); out.println("</HTML>"); out.flush(); out.close(); }}4、編寫一個Servlet用來測試臟字過濾器7.1.5過濾器的應用5、測試結果圖
7-5
測試臟字過濾器7.2監聽器7.2.1監聽對象生命周期的監聽器7.2.2監聽對象屬性的監聽器7.2.3監聽Session對象狀態變化的監聽器7.2監聽器表
7-1
監聽器接口和方法類別監聽接口方法生命周期監聽器ServletContextListenervoidcontextInitialized(ServletContextEventsce)voidcontextDestroyed(ServletContextEventsce)HttpSessionListenervoidsessionCreated(HttpSessionEventse)voidsessionDestroyed(HttpSessionEventse)ServletRequestListenervoidrequestDestroyed(ServletRequestEventsre)voidrequestInitialized(ServletRequestEventsre)對象屬性監聽器ServletContextAttributeListenervoidattributeAdded(ServletContextAttributeEventscae)voidattributeRemoved(ServletContextAttributeEventscae)voidattributeReplaced(ServletContextAttributeEventscae)HttpSessionAttributeListenervoidattributeAdded(HttpSessionBindingEventse)voidattributeRemoved(HttpSessionBindingEventse)voidattributeReplaced(HttpSessionBindingEventse)ServletRequestAttributeListenervoidattributeAdded(ServletRequestAttributeEventsrae)voidattributeRemoved(ServletRequestAttributeEventsrae)voidattributeReplaced(ServletRequestAttributeEventsrae)Session對象狀態變化監聽器HttpSessionBindingListenervoidvalueBound(HttpSessionBindingEventevent)voidvalueUnbound(HttpSessionBindingEventevent)HttpSessionActivationListenervoidsessionWillPassivate(HttpSessionEventse)voidsessionDidActivate(HttpSessionEventse)在Web應用中,監聽器是指應用通過監聽事件來監聽請求中的行為而創建的一組類。7.2.1監聽對象生命周期的監聽器監聽對象生命周期的監聽器有三個:ServletContextListener、HttpSessionListener和ServletRequestListener。ServletContextListener用于監聽應用啟動和停止事件,提供了兩個抽象方法publicvoidcontextInitialized(ServletContextEventsce){}//已完成加載Web應用和初始化參數publicvoidcontextDestroyed(ServletContextEventsce){}//Web應用即將關閉7.2.1監聽對象生命周期的監聽器案例:ServletContextListener的使用1、MyServletContextListener類,實現ServletContextListener接口publicclassMyServletContextListenerimplementsServletContextListener{
@Override
publicvoidcontextInitialized(ServletContextEventsce){
ServletContextservletContext=sce.getServletContext();//獲取ServletContext對象
Stringusername=servletContext.getInitParameter("username");//獲取初始化值
System.out.println("參數username:"+username);
}
@Override
publicvoidcontextDestroyed(ServletContextEventsce){
System.out.println("釋放資源");
}
}7.2.1監聽對象生命周期的監聽器2、在web.xml中配置監聽器<context-param> <param-name>username</param-name> <param-value>Charles</param-value></context-param><listener> <listener-class>com.swxy.listener.MyServletContextListener</listener-class></listener>圖
7-6
啟動服務器獲取初始化參數3、啟動服務器Tomcat7.2.1監聽對象生命周期的監聽器HttpSessionListenerHttpSessionListener接口提供了二個抽象方法voidsessionCreated(HttpSessionEventse){}//創新了新的會話
voidsessionDestroyed(HttpSessionEventse){}//銷毀了一個會話7.2.1監聽對象生命周期的監聽器案例:利用HttpSessionListener統計在線人數1、創建類MyHttpSessionListener實現HttpSessionListener接口packagecom.swxy.listener;
//導入包省略
@WebListener
publicclassMyHttpSessionListenerimplementsHttpSessionListener{
intonline=1;//記錄在線人數
@Override
publicvoidsessionCreated(HttpSessionEventse){
ServletContextservletContext=se.getSession().getServletContext();//獲取Application對象
Objectcount=servletContext.getAttribute("count");
if(count!=null){
online=Integer.parseInt(count.toString());
online++;//創建Session時,在線人數+1
}
servletContext.setAttribute("count",online);//在線人數存儲到Application作用域中
7.2.1監聽對象生命周期的監聽器}@Override
publicvoidsessionDestroyed(HttpSessionEventse){
ServletContextservletContext=se.getSession().getServletContext();
Objectcount=servletContext.getAttribute("count");
if(count!=null){
online=Integer.parseInt(count.toString());
online--;//銷毀Session對象時,在線人數-1
}
servletContext.setAttribute("count",online);
}
}7.2.1監聽對象生命周期的監聽器2、創建類OnLineServlet繼承HttpServlet@WebServlet("/OnLineServlet")publicclassOnLineServletextendsHttpServlet{ @Override protectedvoidservice(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{ resp.setContentType("text/html;charset=UTF-8");//設置響應類型及編碼 HttpSessionsession=req.getSession();//創建Session對象 Stringlogout=req.getParameter("logout"); if("true".equals(logout)){ session.invalidate(); }
7.2.1監聽對象生命周期的監聽器2、創建類OnLineServlet繼承HttpServlet Integercount=(Integer)session.getServletContext().getAttribute("count");//獲取在線人數 PrintWriterout=resp.getWriter(); out.write("<h2>在線人數:"+count+"</h2>"); out.write("<h3><ahref='OnLineServlet?logout=true'>注銷</a></h3>"); }}3、測試結果圖
7-7
運行結果圖
7-8
點擊注銷后的運行結果7.2.1監聽對象生命周期的監聽器ServletRequestListenerServletRequestListener接口提供了二個抽象方法publicvoidrequestInitialized(ServletRequestEventsre){}//創建了新的Request對象publicvoidrequestDestroyed(ServletRequestEventsre){}//已經銷毀了Request對象在Web應用中,有以下兩種方式配置ServletRequestListener1、在web.xml文件中配置<listener>
<listener-class>com.swxy.listener.MyServletRequestListener</listener-class></listener>2、注解方式@WebListenerpublicclassMyServletRequestListenerimplementsServletRequestListener{}7.2.2監聽對象屬性的監聽器監聽對象生命周期的監聽器有三個:ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener。ServletContextAttributeListenerServletContextAttributeListener接口提供了三個抽象方法voidattributeAdded(ServletContextAttributeEventscae){}//屬性被添加到Application中時調用voidattributeRemoved(ServletContextAttributeEventscae){}//屬性從Application中移除時調
voidattributeReplaced(ServletContextAttributeEventscae){}//屬性被修改時調用在Web應用中,有以下兩種方式配置ServletContextAttributeListener。1、在web.xml文件中配置<listener>
<listener-class>com.swxy.listener.MyServletContextAttributeListener</listener-class></listener>7.2.2監聽對象屬性的監聽器2、注解方式@WebListenerpublicclassMyServletContextAttributeListenerimplementsServletContextAttributeListener{}7.2.2監聽對象屬性的監聽器HttpSessionAttributeListenervoidattributeAdded(HttpSessionBindingEventse){}//屬性被添加到Session中時調用voidattributeRemoved(HttpSessionBindingEventse){}//屬性從Session中移除時調用voidattributeReplaced(HttpSessionBindingEventse){}//屬性被修改時調用HttpSessionAttributeListener接口提供了三個抽象方法ServletRequestAttributeListenervoidattributeAdded(ServletRequestAttributeEventsrae){}//屬性被添加到Request中時調用voidattributeRemoved(ServletRequestAttributeEventsrae){}//屬性從Request中移除時調用voidattributeReplaced(ServletRequestAttributeEventsrae){}//屬性被修改時調用ServletRequestAttributeListener接口可以用來監聽Request對象加入屬性、移除屬性和替換屬性時響應的動作事件,該接口提供了三個抽象方法在Web應用中,配置方式同樣有二種方式:在web.xml中配置和注解,與ServletContextAttributeListener配置類似。7.2.3監聽Session對象狀態變化的監聽器監聽Session對象狀態變化的監聽器有二個:HttpSessionBindingListener和HttpSessionActivationListenerHttpSessionBindingListenerHttpSessionBindingListener是“HttpSession對象綁定監聽器”,用來監聽HttpSession中,設置成HttpSession屬性或從HttpSession中移除時得到Session的通知。voidvalueBound(HttpSessionBindingEventevent){}//已經綁定一個Session范圍的對象或者變量voidvalueUnbound(HttpSessionBindingEventevent){}//已經解綁了Session范圍的對象或者變量HttpSessionActivationListenerHttpSessionActivationListener是“HttpSession對象轉移監聽器”,HttpSessionActivationListener的實現類也必須實現Serializable接口voidsessionWillPassivate(HttpSessionEventse){}//session中的對象持久化到存儲設備時調用voidsessionDidActivate(HttpSessionEventse){}//對象被重新加載時執行該方法7.2.3監聽Session對象狀態變化的監聽器應用實例創建類MyHttpSessionBindingActivationListenerpublicclassMyHttpSessionBindingActivationListenerimplementsHttpSessionBindingListener,
HttpSessionActivationListener,Serializable{
@Override
publicvoidsessionWillPassivate(Ht
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 計算機控制技術與系統 課件 04 過程通道與人機接口
- 四川國際標榜職業學院《計算機組成及系統結構》2023-2024學年第二學期期末試卷
- 三亞學院《中國近現代藝術思潮》2023-2024學年第一學期期末試卷
- 唐山市遷西縣2024-2025學年四年級數學第二學期期末監測模擬試題含解析
- 蘇州新區一中2025屆高三下學期期末質量調研生物試題含解析
- 上海出版印刷高等專科學校《大學生核心就業能力提升》2023-2024學年第二學期期末試卷
- 湖北城市建設職業技術學院《漢字與中國文化》2023-2024學年第一學期期末試卷
- 河南開封科技傳媒學院《Matlab程序設計與應用》2023-2024學年第二學期期末試卷
- 新疆體育職業技術學院《漢語言文學導論》2023-2024學年第二學期期末試卷
- 重慶郵電大學《燃燒與爆炸理論》2023-2024學年第二學期期末試卷
- 上海市第一至十八屆高一物理基礎知識競賽試題及答案
- 《建筑工程設計文件編制深度規定》(2022年版)
- 病例報告表(CRF)模板
- C語言程序設計題庫習集帶答案(128p最全版)
- 高爐布袋除塵的MCGS-PLC控制系統
- 反三違培訓課件
- 創傷骨科患者術后疼痛影響因素評估及護理策略論文
- 評標方法課件
- 泵送混凝土測區強度換算表(完整版)
- 基于PLC的電梯控制系統設計報告(共15頁)
- 最新人教版九年級下冊化學全冊知識點大全(精華版)
評論
0/150
提交評論