1. 程式人生 > >Servlet 中的監聽器和過濾器

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:攔截在一個頁面中包含另一個頁面.