J2EE監聽器Listener基礎

做軟件也兩年了,但一直有種知其然不知其所以然的感覺,接下來希望自己能夠堅持下去多看看一些深層的東西,今天是一個開始。


Servlet程序由Servlet,Filter和Listener組成,其中監聽器用來監聽Servlet容器上下文。

監聽器通常分三類:基於Servlet上下文的ServletContex監聽,基於會話的HttpSession監聽和基於請求的ServletRequest監聽。

  • ServletContex監聽器
ServletContex又叫application,存在範圍是整個Servlet容器生命週期,當系統啓動時就會創建,系統關閉時會銷燬,該對象通常存放一些非常通用的數據,但是不推薦存放太多,否則長期佔據內存空間會影響服務器性能。
基於ServletContex的監聽器可以繼承兩個接口並實現接口中相應的方法:
ServletContextListener接口定義了兩個方法contextInitialized和contextDestroyed,分別在ServletContex創建和銷燬時觸發;
ServletContextAttributeListener接口定義了三個方法attributeAdded,attributeRemoved和attributeReplaced,分別在給ServletContex添加屬性值,刪除屬性值和替換屬性值時觸發。
下面創建了一個基於Application的監聽器:
 
 /**
 * Application監聽器,Servlet中的Application即ServletContext
 * @author Administrator
 */
public class ApplicationListener implements ServletContextListener,
		ServletContextAttributeListener {
	
	/**
	 * application銷燬時觸發的事件
	 */
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		System.out.println("Application銷燬:"+arg0.getServletContext());
	}
	
	/**
	 * application初始化時觸發的方法
	 */
	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		System.out.println("Application創建:"+arg0.getServletContext());
	}
	
	/**
	 * application中添加屬性值時觸發的方法
	 */
	@Override
	public void attributeAdded(ServletContextAttributeEvent arg0) {
		System.out.println("Application添加新屬性:key="+arg0.getName()+"  value="+arg0.getValue());
	}
	
	/**
	 * application中刪除屬性值時觸發的方法
	 */
	@Override
	public void attributeRemoved(ServletContextAttributeEvent arg0) {
		System.out.println("Application移除屬性:key="+arg0.getName()+"  value="+arg0.getValue());
	}
	
	/**
	 * application中替換屬性值時觸發的方法
	 */
	@Override
	public void attributeReplaced(ServletContextAttributeEvent arg0) {
		System.out.println("Application替換屬性:key="+arg0.getName()+"  value="+arg0.getValue());
	}

}
最後在web.xml需要註冊監聽器,註冊方式非常簡單,注意標籤<description>和<display-name>不是必須的
  <listener>
  	<description>application listener</description>
  	<display-name>application_listener</display-name>
  	<listener-class>com.bless.listener.application.ApplicationListener</listener-class>
  </listener>

隨後啓動java web項目,監聽器就會運行。

 

  • Session監聽器
Session對於做web項目的人來說應該非常熟悉了,Session的生命週期是一個用戶的一次會話,簡單的說當一個用戶進入某個網站,在該網站服務器就已經爲用戶創建了一個Session對象,用戶在網站內的任何操作都是在session週期內。
誤區:某些人認爲我進入某網站,隨後關閉瀏覽器,我的session就已經銷燬了。其實不然,因爲session存儲在服務器端,服務器並不能主動捕獲到瀏覽器關閉的事件,即使關閉瀏覽器,Session對象依然存在服務器中。所以如果編寫web應用時一定要考慮session什麼時候銷燬,銷燬session對象的方式有兩種:一種是調用session的invalidate方法,另一種是在web.xml中定義session失效時間session-timeout。
Session監聽器也有兩個接口,其功能與前面介紹的ServletContex類似:HttpSessionListener用於監聽Session創建和銷燬的事件,HttpSessionAttributeListener用於監聽Session屬性賦值,刪除和替換的事件:
/**
 * Session監聽器
 * @author Administrator
 */
public class SessionListener implements HttpSessionListener,
		HttpSessionAttributeListener {
	Vector<HttpSession> listSession = null;
	
	/**
	 * 創建Session調用的方法
	 * 將session對象放入listSession集合中
	 */
	@Override
	public void sessionCreated(HttpSessionEvent arg0) {
		synchronized (this) {
			if(listSession == null){
				listSession = new Vector<HttpSession>();
			}
		}
		listSession.add(arg0.getSession());
		System.out.println("\n\n創建一個Session:"+arg0.getSession());
		System.out.println("[當前存在的Session:]");
		for (HttpSession session : listSession) {
			System.out.println("--->"+session);
		}
	}
	
	/**
	 * 銷燬Session調用的方法
	 * 移除listSession集合對應session值
	 */
	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
		listSession.remove(arg0.getSession());
		System.out.println("\n\n銷燬一個Session:"+arg0.getSession());
		System.out.println("[當前存在的Session:]");
		for (HttpSession session : listSession) {
			System.out.println("--->"+session);
		}
	}
	
	/**
	 * session屬性添加時調用的方法
	 */
	@Override
	public void attributeAdded(HttpSessionBindingEvent arg0) {
		System.out.println("\n\n添加一條Session-->key:"+arg0.getName()+"    屬性value:"+arg0.getValue());
	}
	
	/**
	 * session屬性移除時調用的方法
	 */
	@Override
	public void attributeRemoved(HttpSessionBindingEvent arg0) {
		System.out.println("\n\n刪除一條Session-->key:"+arg0.getName()+"    屬性value:"+arg0.getValue());
	}
	
	/**
	 * session屬性替代時調用的方法
	 */
	@Override
	public void attributeReplaced(HttpSessionBindingEvent arg0) {
		System.out.println("\n\n覆蓋一條Session-->key:"+arg0.getName()+"    屬性value:"+arg0.getValue());
	}

}


在web.xml中定義相應監聽器配置:在web.xml中定義相應監聽器配置:

<listener>
  	<listener-class>com.bless.listener.session.SessionListener</listener-class>
  </listener>
<!-- Session超時配置 -->
  <session-config>
  	<session-timeout>1</session-timeout>
  </session-config>

 

  • Request監聽器
request監聽器使用方法跟前面也是非常類似的,一個request生命週期是向服務器發送請求到服務器響應最後反應到頁面的整個過程。Request監聽器對應ServletRequestListener,ServletRequestAttributeListener接口,根據不同需求實現相應接口就行了。
/**
 * Request事件監聽器
 * @author Administrator
 */
public class RequestListener implements ServletRequestListener,
		ServletRequestAttributeListener {

	@Override
	public void requestDestroyed(ServletRequestEvent arg0) {
		System.out.println("request銷燬:"+arg0.getServletRequest());
	}

	@Override
	public void requestInitialized(ServletRequestEvent arg0) {
		System.out.println("request創建:"+arg0.getServletRequest());
	}

	@Override
	public void attributeAdded(ServletRequestAttributeEvent arg0) {
		System.out.println("request屬性添加   key="+arg0.getName()+"   value="+arg0.getValue());
	}

	@Override
	public void attributeRemoved(ServletRequestAttributeEvent arg0) {
		System.out.println("request屬性刪除   key="+arg0.getName()+"   value="+arg0.getValue());
	}

	@Override
	public void attributeReplaced(ServletRequestAttributeEvent arg0) {
		System.out.println("request屬性替換   key="+arg0.getName()+"   value="+arg0.getValue());
	}

}

web.xml配置:
<listener>
  	<listener-class>com.bless.listener.request.RequestListener</listener-class>
  </listener>

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章