Java 監聽器
阿新 • • 發佈:2019-02-02
1: 監聽器的定義
2:監聽器的用途
3:例項
4:監聽器分類
5:Servlet3.0下監聽器的使用
6:實際專案常用的案例
1: 監聽器的定義:
監聽器實際上是一個類,這個類實現了特定的介面,然後將這個類在 web.xml 檔案中進行描述,這樣伺服器在啟動的時候就可以例項化這個類,啟動監聽器。當範圍物件的狀態發生變化的時候,伺服器自動呼叫監聽器物件中的方法。例如統計使用者線上人數。
web監聽器是Servlet規範中定義的一種特殊類,用於監聽ServletContext,HttpSession,ServletRequest等域物件的建立、銷燬、以及屬性的變化等,可以在事件發生前、發生後進行一些處理。
2、監聽器的用途
- 1、統計線上人數和線上使用者
- 2、系統載入時進行資訊的初始化工作
- 3、統計網站的訪問量
- 4、跟Spring結合
3、例項
在web.xml檔案中進行配置
listenr-class中是自己定義的Listener的類路徑
1 2 3 4 5 6 7 8 9 |
public
class MyRequestListener implements ServletContextListener{
public
void contextInitialized(ServletContextEvent
event ){
System. out .println( "啟動監聽器" );
} public
void contextDestroy(ServletContextEvent
event ){
System. out .println( "結束監聽器" );
}
}
|
編譯器會為我們自動生成contextInitialized和contextDestroy兩個函式
監聽器>過濾器>serlvet,在 web.xml 檔案中配置的時候注意順序
4 監聽器的分類
按監聽的物件劃分,可以分為監聽
- ServletContext物件
- HttpSession物件
- ServletRequest物件
按監聽的事件劃分
- 域物件自身的建立和銷燬
- 域物件中屬性的建立和消除
- 繫結到session中的某個物件的狀態
由於很多監聽的方式一致,因此我們只考慮其中的HttpSession物件:
在web.xml中配置session超時
1 2 3 |
<session-config>
<session-timeout> 30 </session-timeout>
</session-config>
|
當超過30秒後,session會自動過期
1 2 3 4 5 6 7 8 9 |
public
class MyRequestListener implements HttpSessionListener{
public
void sessionCreate(HttpSessionEvent
event ){
System. out .println( "event 建立:" );
}
public
void sessionDestroy(HttpSessionEvent
event ){
System. out .println( "event 銷燬:" );
}
}
|
另外,我們可以實現HttpSessionAttributeListener來實現session物件屬性的增加(added)、刪除(removed)、替換(replaced)的功能
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public
class MyRequestListener implements HttpSessionAttributeListener{
public
void attributeAdded(HttpSessionBindEvent
event ){
}
public
void attributeRemoved(HttpSessionBindEvent
event ){
}
public
void attributeReplaced(HttpSessionBindEvent
event ){
}
}
|
5、Servlte3.0下的使用
在Servlet3.0下通過註解@WebListener("")就可以實現了,不需要在web.xml中進行配置
6、實戰
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public
class MyRequestListener implements HttpSessionListener{
private
int counts = 0; //用於統計線上人數
public
void sessionCreate(HttpSessionEvent
event ){
counts++;
event .getSession().getServletContext.setAttribute( "name" ,counts);
//使用者人數+1
}
public
void sessionDestroy(HttpSessionEvent
event ){
counts--;
event .getSession().getServletContext.setAttribute( "name" ,counts); //使用者人數-1
}
}
@WebListener
public
class MyRequestListener2 implements ServletRequestListener{
private
ArrayList<User>list; //建立一個線上使用者的列表
public
void requestCreate(ServletRequestEvent
event ){
HttpServletRequest request = (HttpServletRequest) request.getServletContext();
String sessionId = request.getSession().getSessionId();
if (sessionId ...){
....
list.add(...);
}
}
public
void requestDestroy(ServletRequestEvent
event ){
}
}
public
class User{
private
int sessionId;
}
|
注意,以上程式碼只是大致的程式碼,並不全面和正確。