Listener & Filter

Kunaly發表於2017-09-07

1.1 Listener:監聽器:

1.1.1 Listener的概述:

什麼是監聽器:

    * 監聽器就是一個Java類用來監聽其他的JavaBean的變化.

 

監聽器和過濾器屬於Servlet中的高階技術.

 

監聽器的應用:

* 主要在Swing程式設計.

* Android大量應用.

 

* 監聽器的術語:

    * 事件源:被監聽的物件.汽車

    * 監聽器物件:監聽的物件.汽車上報警器

    * 事件源與監聽器繫結:

    * 事件:指的是事件源的改變.

        * 獲得事件源物件.

1.1.2 Servlet的監聽器:

Servlet的監聽器:

* 監聽ServletContext,HttpSession,ServletRequest

* 事件源和監聽器繫結的過程:通過配置完成.

 

Servlet中的監聽器:提供了8個監聽器.

一類:監聽三個域物件的建立和銷燬的監聽器.3

二類:監聽三個域物件的屬性變更的監聽器.(屬性新增,屬性移除,屬性替換)3.

三類:監聽HttpSession物件中的JavaBean的狀態的改變.(繫結,解除繫結,鈍化和活化)2

1.1.3 一類監聽器:監聽三個域物件的建立和銷燬的監聽器:

1.1.3.1 ServletContextListener:監聽ServletContext物件的建立和銷燬.

【方法】

 

 

【問題】

* ServletContext物件何時建立和銷燬:

    * 建立:伺服器啟動時候,伺服器可以為每個WEB應用建立一個單獨的ServletContext.

    * 銷燬:伺服器關閉的時候,或者專案從伺服器中移除.

 

【入門案例】

1.編寫一個類實現監聽器的介面.

public class MyServletContextListener implements ServletContextListener{

	@Override
	/**
	 * 監聽ServletContext物件的建立的方法:
	 * @param sce
	 */
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("ServletContext物件被建立了...");
	}

	@Override
	/**
	 * 監聽ServletContext物件的銷燬的方法:
	 * @param sce
	 */
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("ServletContext物件被銷燬了...");
	}

}

2.通過配置完成監聽器和事件源的繫結.

  <!-- 配置監聽器 -->

  <listener>

  <listener-class>com.itheima.weblistener.MyServletContextListener</listener-class>

  </listener>

 

企業中應用

* 初始化工作.

* 載入配置檔案:Spring框架.

    * ContextLoaderListener:

* 定時任務排程:

    * Timer,TimerTask.


1.1.1.1 HttpSessionListener:監聽HttpSession物件的建立和銷燬的監聽器.

【方法】

 sessionCreated(HttpSessionEvent se)

 sessionDestroyed(HttpSessionEvent se)

 

【問題】

* HttpSession物件何時建立和銷燬的?

    * 建立:伺服器第一次呼叫getSession()方法的時候.

    * 銷燬:

        * 非正常關閉伺服器(正常關閉序列化到硬碟)

        * session過期了(預設30分鐘)

        * session.invalidate()

 

【入門】

1.編寫監聽器:

public class MyHttpSessionListener implements HttpSessionListener {

	@Override
	public void sessionCreated(HttpSessionEvent se) {
		System.out.println("HttpSession物件被建立了...");
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		System.out.println("HttpSession物件被銷燬了...");
	}

}

2.配置監聽器:

  <listener>

  <listener-class>com.itheima.weblistener.MyHttpSessionListener</listener-class>

  </listener>

 

【問題】

1.訪問html是否建立session物件?:不會

2.訪問一個Servlet是否建立session物件?:不會

3.訪問一個jsp是否建立session物件?:


1.1.1.1 ServletRequestListener:監聽ServletRequest物件的建立和銷燬的監聽器:

【方法】

 

 

【問題】

ServletRequest物件何時建立和銷燬?

    * 建立:客戶端向伺服器傳送請求的時候.

    * 銷燬:伺服器為這次請求作出了響應時候.

 

【入門】

1.編寫一個監聽器

public class MyServletRequestListener implements ServletRequestListener {
    public void requestInitialized(ServletRequestEvent sre)  { 
    	System.out.println("ServletRequest被建立了...");
    }
    public void requestDestroyed(ServletRequestEvent sre)  { 
    	System.out.println("ServletRequest被銷燬了...");
    }
	
}

2.配置監聽器

  <listener>

    <listener-class>com.itheima.weblistener.MyServletRequestListener</listener-class>

  </listener>

 

問題

1.訪問html是否建立request物件?:

2.訪問一個Servlet是否建立request物件?:

3.訪問一個jsp是否建立request物件?:





利用Cookie記住使用者名稱和密碼.

Filter的概述】

Ø 什麼是過濾器Filter:

Filter:一個實現了特殊介面的Java.實現對請求資源的過濾的功能.

* 過濾器是Servlet技術中最為實用的技術.

Ø 過濾器的作用:

對目標資源進行過濾.

* 自動登入,解決網站亂碼,進行頁面靜態化,進行響應壓縮...

Ø 使用過濾器:

1.編寫一個類實現過濾器的介面.

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() {
}
 
}


2.對過濾器進行配置.

  <filter>

  <filter-name>FilterDemo1</filter-name>

  <filter-class>com.filter.FilterDemo1</filter-class>

  </filter>

  

  <filter-mapping>

  <filter-name>FilterDemo1</filter-name>

  <url-pattern>/*</url-pattern>

  </filter-mapping>

【過濾器的生命週期】(瞭解)

* Servlet的生命週期(*****)

* Filter生命週期:過濾器從建立到銷燬的過程.

    * 伺服器啟動的時候,伺服器就會建立過濾器的物件,每次訪問被攔截目標資源,過濾器中的doFilter的方法就會執行.當伺服器關閉的時候,伺服器就會銷燬Filter物件.

FilterConfig的作用】

【方法】

 

 

// 獲得初始化引數:過濾器的初始化引數.

String username = fConfig.getInitParameter("username");

String password = fConfig.getInitParameter("password");

System.out.println("初始化引數"+username+"   "+password);

// 獲得所有的初始化引數的名稱:

Enumeration<String> names = fConfig.getInitParameterNames();

while(names.hasMoreElements()){

String name = names.nextElement();

String value = fConfig.getInitParameter(name);

System.out.println(name+"    "+value);

}

// 獲得過濾器的配置的名稱:

String filterName = fConfig.getFilterName();

System.out.println("過濾器名稱"+filterName);

 

【FilterChain:過濾器鏈

過濾器鏈中的過濾器的執行的順序跟<filter-mapping>的配置順序有關.

【方法】

 

Filter的配置】

url-pattern的配置】與servlet中的配置一樣:

* 三種配置:

    * 完全路徑匹配:以 /開始   /aaa /aaa/bbb

    * 目錄匹配:     / 開始   /*  /aaa/*

    * 副檔名匹配:  不能以 /開始  *.do  *.jsp  *.action

 

servlet-name的配置】通過url-pattern攔截一個Servlet的資源.也可以通過servlet-name標籤進行攔截.

 

dispatcher的配置】

* REQUEST:預設值.

* FORWARD:攔截轉發

* ERROR:攔截跳轉到錯誤頁面.全域性錯誤頁面.  

* INCLUDE:攔截在一個頁面中包含另一個頁面.






相關文章