Servlet 中的監聽器和過濾器
Servlet 中的監聽器:
1.監聽ServletContext,HttpSession,ServletRequest狀態
2事件源和監聽繫結的方式:配置
3提供了8種監聽器:監聽3個域物件的建立和銷燬(3種),監聽3個域物件的屬性變更的監聽器(3種), 監聽HttpSession中JavaBean的狀態的變化(繫結,解綁,鈍化,活化 2種)
鈍化:session序列化到磁碟
活化:session從磁碟序列化到記憶體
1 ServletContextListener(介面):監聽ServletContext物件的建立和銷燬.
關於ServletContext建立:伺服器啟動的時候,為每個Web應用建立一個單獨的ServletContext
銷燬:伺服器關閉的時候,或者專案移除的時候
案例:
public class MyServletContextListener implements ServletContextListener{
@Override
/**
* 監聽ServletContext物件的建立的方法:
*/
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext物件被建立了...");
}
@Override
/**
* 監聽ServletContext物件的銷燬的方法:
*/
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext物件被銷燬了...");
}
}
通過配置:將事件源和監聽器繫結(在web.xml中)<!-- 配置監聽器-->
<listener>
<listener-class>MyServletContextListener的全限定名</listener-class>
</listener>
HttpSessionListener(和上面的步驟一致):監聽HttpSession物件的建立和銷燬的監聽器.
關於HttpSession建立:伺服器第一次呼叫getSession()方法的時候
銷燬:非正常關閉伺服器(正常關閉序列化到磁碟)
session過期(預設30分鐘)
session.invalidate()//手動過期
注意:
1.訪問html是否建立session物件?:不會
2.訪問一個Servlet是否建立session物件?:不會
3.訪問一個jsp是否建立session物件?:會,jsp的內建物件
ServletRequestListener:監聽ServletRequest物件的建立和銷燬的監聽器(步驟同上)
每次請求伺服器都會建立request物件和做出響應後respond後都會銷燬2.ServletContextAttributeListener:監聽ServletContext物件中的屬性變更的監聽器
HttpSessionAttributeListener:監聽HttpSession物件中的屬性變更的監聽器
ServletRequestAttributeListener:監聽ServletRequest物件中的屬性變更的監聽器
(步驟都一樣)3監聽HttpSession中的JavaBean的狀態改變的監聽器.(繫結,解決繫結,鈍化,活化)
HttpSessionBindingListener:監聽HttpSession中的JavaBean的繫結和解除繫結的狀態.(setAttribute())
HttpSessionActivationListener:監聽HttpSession中的JavaBean的鈍化和活化的狀態.()
監聽器介面中的方法
sessionDidActivate(HttpSessionEvent se); --活化
SessionWillPassivate(HttpSessionEvent se); --鈍化
通過配置序列化session:
context.xml
* tomcat/conf/context.xml:對tomcat中的所有虛擬主機和虛擬路徑生效.
* tomcat/conf/Catalina/localhost/context.xml:對tomcat下的localhost虛擬主機中的所有路徑生效.
* 工程的META-INF/context.xml:對當前的工程生效.
<?xml version="1.0" encoding="UTF-8"?>
<!--
maxIdleSwap:1分鐘 如果session不使用就會序列化到硬碟.
directory:itheima序列化到硬碟的檔案存放的位置.
-->
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="itheima"/>
</Manager>
</Context>
過濾器含義和作用:實現特殊介面的java類,實現對請求資源的過濾功能(自動登入,進行頁面的靜態化,進行響應壓縮)
編寫一個過濾器案例:
public class FilterDemo1 implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("FilterDemo1...");
//放行
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
1.對過濾器進行配置.(在web.xml中進行配置)
<filter>
<filter-name>FilterDemo1</filter-name>
<filter-class>FilterDemo1的全限定名</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
方法引數:FilterConfig的作用
Filter生命週期:伺服器啟動的時候,伺服器就會建立過濾器的物件,每次訪問被攔截目標資源,過濾器中的doFilter的方法就會執行.當伺服器關閉的時候,伺服器就會銷燬Filter物件.
FilterChain過濾器鏈:鏈中的過濾器的執行的順序跟<filter-mapping>的配置順序有關.
配置中注意事項:url-pattern的配置與servlet中的配置一樣:
* 三種配置:
* 完全路徑匹配:以/ 開始 /aaa /aaa/bbb
* 目錄匹配: 以/ 開始 /* /aaa/*
* 副檔名匹配: 不能以/ 開始 *.do *.jsp *.action
【servlet-name的配置】通過url-pattern攔截一個Servlet的資源.也可以通過servlet-name標籤進行攔截.
【dispatcher的配置】
* REQUEST:預設值.
* FORWARD:攔截轉發
* ERROR:攔截跳轉到錯誤頁面.全域性錯誤頁面.
* INCLUDE:攔截在一個頁面中包含另一個頁面.