27、監聽器學習
監聽器
監聽器:
* Java Web的三大元件:Servlet、Listener、Filter.
* 注意:
* listener的觸發或呼叫,是不需要我們關注的.(Tomcat伺服器)
* Tomcat與JavaEE的版本是有對應的.
* Tomcat 7.0版本 - Servlet 3.0
* Tomcat 6.0版本 - Servlet 2.5
* 開發原則:不要追新.
* Listener對於我們來講:如何編寫.
* 八大監聽器:
* 第一組:用於監聽Servlet三個域物件的建立與銷燬
* ServletRequestListner
* HttpSessionListener
* ServletContextListener
* 第二組:用於監聽Servlet三個域物件的屬性變化(設定、刪除、修改)
* ServletRequestAttributeListener
* HttpSessionAttributeListener
* ServletContextAttributeListener
* 第三組:用於通知被繫結到Session物件的屬性.
* HttpSessionBindingListener
* 第四組:用於監聽Session的鈍化與活化
* HttpSessionActivationListener
* 第一組:
* 作用:用於監聽Servlet三個域物件的建立與銷燬.
* 三個域物件的建立與銷燬:
* Request物件:
* 建立:發生請求時.
* 銷燬:請求完成時.
* Session物件:
* 建立:發生請求時,並且執行getSession()語句.
* 銷燬:執行Session的銷燬方法invalidate().
* ServletContext物件:
* 建立:Tomcat啟動時.
* 銷燬:Tomcat關閉時.
* 如何自定義監聽器:
* 第一步:
* 建立Java類,實現上述八個監聽器介面之一.
* 重寫該介面提供的所有方法.
* 第二步:
* 在web.xml檔案中配置Listener.
<listener>
<listener-class>自定義Listener的完整路徑</listener-class>
</listener>
* 第三組:HttpSessionBindingListener
* 注意:
* 該監聽器應該由JavaBean類實現.(可以將JavaBean繫結到Session上)
* 誰被繫結到Session上,誰就實現該監聽器.
* 該監聽器的作用:通知被繫結到Session的JavaBean物件.
* 使用該監聽器時,不需要在web.xml檔案中進行配置的.
* 第四組:HttpSessionActivationListener
* Session的序列化
* 當Tomcat伺服器正常關閉後,Session會自動被儲存到本地硬碟中.
* 在Tomcat伺服器的安裝目錄:%Catalina_HOME%\work\Catalina\localhost\Web工程名目錄中.
* 當Tomcat伺服器正常啟動後,Session會自動從本地硬碟中讀取到記憶體中.
* 儲存在本地硬碟中的序列化檔案,自動銷燬.
* 問題:
* Tomcat伺服器為什麼提供這麼一個機制?
* Session的鈍化與活化
* 實現步驟:
* 編寫Servlet設定Session.
* 在Tomcat安裝目錄%Catalina_HOME%\conf\Catalina\localhost目錄中,建立一個名為Web工程名的xml檔案.
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- maxIdleSwap:指定多長時間後Session會被鈍化.(單位為分鐘) -->
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1" >
<!--
directory:指定鈍化檔案的儲存目錄.
鈍化檔案儲存路徑:${CATALINA_HOME}\work\Catalina\localhost\Web工程名\${sessionid}.session
-->
<Store className="org.apache.catalina.session.FileStore" directory="mysession" />
</Manager>
</Context>
* 建立JavaBean,用於繫結到Session中.
* 該JavaBean實現了HttpSessionActivationListener介面,並且重寫該介面提供的所有方法.
* 該JavaBean實現了Serializable(序列化)介面(Session的鈍化與活化是基於Session的序列化實現的)
* Session鈍化與活化和序列化的區別:
* Session序列化:
* Tomcat提供的自動機制.
* Session的序列化檔案在重新被使用時,消失.
* Session鈍化與活化:
* 手動實現.
* Session的鈍化檔案並不消失.
* 擴充套件:
* Servlet的三大域物件:
* Request物件 - 一次請求
* Session物件 - 一次會話
* ServletContext物件 - Tomcat從啟動到關閉
* JSP的四大域物件:
* page物件 - 當前頁面
* Request物件
* Session物件
* ServletContext物件
使用案例:
配置:
<!-- session的最大活躍時間 -->
<session-config>
<session-timeout>60</session-timeout>
</session-config>
<!-- 監聽request物件建立、銷燬 -->
<listener>
<listener-class>cn.itcast.a_life.MyRequestListener</listener-class>
</listener>
<!-- 監聽session物件建立、銷燬 -->
<listener>
<listener-class>cn.itcast.a_life.MySessionListener</listener-class>
</listener>
<!-- 監聽servletContext物件建立、銷燬 -->
<listener>
<listener-class>cn.itcast.a_life.MyServletContextListener</listener-class>
</listener>
<!-- 屬性監聽器 -->
<listener>
<listener-class>cn.itcast.b_attr.MySessionAttrListener</listener-class>
</listener>
/**
* 監聽request物件的建立或銷燬
* @author Jie.Yuan
*
*/
public class MyRequestListener implements ServletRequestListener{
// 物件銷燬
@Override
public void requestDestroyed(ServletRequestEvent sre) {
// 獲取request中存放的資料
Object obj = sre.getServletRequest().getAttribute("cn");
System.out.println(obj);
System.out.println("MyRequestListener.requestDestroyed()");
}
// 物件建立
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("MyRequestListener.requestInitialized()");
}
}
/**
* 監聽ServletContext物件建立或銷燬
* @author Jie.Yuan
*
*/
public class MyServletContextListener implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("MyServletContextListener.contextDestroyed()");
}
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("1..........MyServletContextListener.contextInitialized()");
}
}
/**
* 監聽Session物件建立、銷燬
* @author Jie.Yuan
*
*/
public class MySessionListener implements HttpSessionListener{
// 建立
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("MySessionListener.sessionCreated()");
}
// 銷燬
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("MySessionListener.sessionDestroyed()");
}
}
/**
* 監聽session物件屬性的變化
* @author Jie.Yuan
*
*/
public class MySessionAttrListener implements HttpSessionAttributeListener {
// 屬性新增
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
// 先獲取session物件
HttpSession session = se.getSession();
// 獲取新增的屬性
Object obj = session.getAttribute("userName");
// 測試
System.out.println("新增的屬性:" + obj);
}
// 屬性移除
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("屬性移除");
}
// 屬性被替換
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
// 獲取sesison物件
HttpSession session = se.getSession();
// 獲取替換前的值
Object old = se.getValue();
System.out.println("原來的值:" + old);
// 獲取新值
Object obj_new = session.getAttribute("userName");
System.out.println("新值:" + obj_new);
}
}
相關文章
- oracle 監聽器學習Oracle
- oracle 監聽器配置Oracle
- JS事件監聽器JS事件
- 2 Day DBA-檢視監聽器配置-練習:使用Database Control檢視監聽器資訊Database
- 監聽器和過濾器過濾器
- jmeter學習指南之OOM和監聽器使用JMeterOOM
- JavaScript學習筆記10: 事件繫結&監聽JavaScript筆記事件
- 事件和事件監聽器事件
- javaWeb中的監聽器JavaWeb
- 如何移除事件監聽器事件
- 遠端控制監聽器
- passive 的事件監聽器事件
- 伺服器端監聽器配置伺服器
- (課程學習)Android必學-非同步載入 —— 監聽 ListViewAndroid非同步View
- 監聽網路流量命令tcpdump學習知識?Linux要學習什麼TCPLinux
- 安卓使用物理鍵監聽器安卓
- 說說Oracle監聽器(一)Oracle
- 說說Oracle監聽器(二)Oracle
- Oracle 監聽器日誌解析Oracle
- Web中的監聽器【Listener】Web
- oracle例項和監聽器Oracle
- [摘]Java EE Servlet監聽器JavaServlet
- 記錄下學習筆記(Laravel 中的事件監聽)筆記Laravel事件
- Halo 開源專案學習(六):事件監聽機制事件
- vue原始碼學習:Object.defineProperty 物件屬性監聽Vue原始碼Object物件
- 過濾器和監聽器總結過濾器
- Android Service 服務的應用之電話監聽器以及簡訊監聽器Android
- spring boot學習(3): SpringApplication 事件監聽Spring BootAPP事件
- 監聽 watch props物件屬性監聽 或深度監聽物件
- 【JavaWeb】EL表示式&過濾器&監聽器JavaWeb過濾器
- 【spring原始碼】十二、監聽器Spring原始碼
- Oracle 監聽器日誌解析(續)Oracle
- 【Oracle】修改scan監聽器埠號Oracle
- Android Hook 全面入侵監聽器AndroidHook
- 如何更改oracle監聽器的埠Oracle
- 自定義元件-資料監聽器元件
- 機器學習——監督學習&無監督學習機器學習
- SpringBoot 攔截器、過濾器、監聽器Spring Boot過濾器