java中Servlet監(jiān)聽器的工作原理及示例詳解
監(jiān)聽器就是一個實現(xiàn)特定接口的普通java程序,這個程序?qū)iT用于監(jiān)聽另一個java對象的方法調(diào)用或?qū)傩愿淖?,當被監(jiān)聽對象發(fā)生上述事件后,監(jiān)聽器某個方法將立即被執(zhí)行。
監(jiān)聽器原理
監(jiān)聽原理
1、存在事件源
2、提供監(jiān)聽器
3、為事件源注冊監(jiān)聽器
4、操作事件源,產(chǎn)生事件對象,將事件對象傳遞給監(jiān)聽器,并且執(zhí)行監(jiān)聽器相應監(jiān)聽方法
監(jiān)聽器典型案例:監(jiān)聽window窗口的事件監(jiān)聽器
例如:swing開發(fā)首先制造Frame**窗體**,窗體本身也是一個顯示空間,對窗體提供監(jiān)聽器,監(jiān)聽窗體方法調(diào)用或者屬性改變:
* 關閉窗體時,調(diào)用windowListener 的windowclosing() , 傳遞windowEvent參數(shù),表示窗體關閉事件對象
* 事件對象操作事件源,獲得事件源狀態(tài)
自定義監(jiān)聽器
以上內(nèi)容可以用下圖解釋:
通過person.addPersonListener(new PersonListener(){})使事件源與監(jiān)聽器間產(chǎn)生聯(lián)系。
事件源(在事件源方法中創(chuàng)建事件對象):
監(jiān)聽器(參數(shù)是事件對象)
事件對象(通過事件對象可以獲得事件源)
測試方法
對上的匿名類補充:匿名內(nèi)部類的作用是創(chuàng)建一個實現(xiàn)接口的匿名類對象,含義是創(chuàng)建一個繼承自PersonListener的匿名類的對象),通過new表達式返回的引用被自動向上轉(zhuǎn)型為對PersonListener的引用
Servlet監(jiān)聽器
(不需要配置,但是監(jiān)聽器仍需要進行注冊)
在Servlet規(guī)范中定義了多種類型的監(jiān)聽器,它們用于監(jiān)聽的事件源分別為 ServletContext, HttpSession 和 ServletRequest 這三個域?qū)ο蟆?/p>
Servlet監(jiān)聽器分為三大類
1、數(shù)據(jù)域?qū)ο髣?chuàng)建和銷毀監(jiān)聽器
2、數(shù)據(jù)域?qū)ο蠛蛯傩宰兏O(jiān)聽器
3、綁定到 HttpSession 域中的某個對象的狀態(tài)的事件監(jiān)聽器
(一)數(shù)據(jù)域?qū)ο髣?chuàng)建銷毀監(jiān)聽器 — 監(jiān)聽三個與對象 (三個監(jiān)聽器)
1、ServletContextListener : 用來監(jiān)聽ServletContext對象的創(chuàng)建和銷毀
監(jiān)聽創(chuàng)建
監(jiān)聽銷毀
* ServletContext對象代表全局唯一對象,每個web工程會產(chǎn)生一個ServletContext,服務器啟動創(chuàng)建,服務器關閉銷毀
編寫監(jiān)聽器
步驟一:編寫類實現(xiàn)特定監(jiān)聽器接口
步驟二:注冊監(jiān)聽器,不是通過事件源,而是在web.xml 進行配置
(監(jiān)聽器和Servlet、Filter不同,不需要url配置,監(jiān)聽器執(zhí)行不是由用戶訪問的,監(jiān)聽器 是由事件源自動調(diào)用的)
servletContext域?qū)ο蠛螘r創(chuàng)建和銷毀:
- 創(chuàng)建:服務器啟動針對每一個web應用創(chuàng)建servletcontext
- 銷毀:服務器關閉前先關閉代表每一個web應用的servletContext
ServletContextListener主流應用:
第一個:在服務器啟動時,對一些對象進行初始化,并且將對象保存ServletContext數(shù)據(jù)范圍內(nèi)(因為在監(jiān)聽器內(nèi)可以獲得事件源對象) — 全局數(shù)據(jù)
- 例如:創(chuàng)建數(shù)據(jù)庫連接池
第二個:對框架進行初始化 例如:Spring框架初始化通過ServletContextListener (因為監(jiān)聽器代碼在服務器啟動時執(zhí)行)
- Spring框架(配置文件隨服務器啟動加載) org.springframework.web.context.ContextLoaderListener
第三個:實現(xiàn)任務調(diào)度,啟動定時程序 (Timer、TimerTask) 使一個程序,定時執(zhí)行
比如說每天晚上十二點給過生日的人進行生日祝福,中國移動對賬戶進行同步,會在服務器使用較少的時間,例如凌晨之類,啟動一段程序,進行同步
java.util.Timer 一種線程設施,用于安排以后在后臺線程中執(zhí)行的任務??砂才湃蝿請?zhí)行一次,或者定期重復執(zhí)行。
Timer提供了啟動定時任務方法 schedule
* schedule(TimerTask task, Date firstTime, long period) 用來在指定一個時間啟動定時器,定期循環(huán)執(zhí)行
* schedule(TimerTask task, long delay, long period) 用來在當前時間delay多少毫秒后啟動定時器
停止定時器,timer.cancel取消任務
2、HttpSession 數(shù)據(jù)對象創(chuàng)建和銷毀監(jiān)聽器 —– HttpSessionListener
監(jiān)聽Session對象創(chuàng)建
監(jiān)聽Session對象銷毀
Session何時創(chuàng)建:request.getSession()
Session何時銷毀:關閉服務器,Session過期,session.invalidate
*Session過期時間通過web.xml配置(tomcat配置文件中),默認時間30分鐘
配置:
HttpSession監(jiān)聽器
現(xiàn)有如下JSP頁面:
1.jsp
2.jsp
訪問1.jsp時會執(zhí)行監(jiān)聽器原因:因為如果觀察jsp的源碼,封閉式英語培訓jsp會被預處理成.java代碼(在tomcat中work文件夾下,參見http://blog.csdn.net/megustas_jjc/article/details/53462025),我們打開這個.java代碼的源碼:
其中的getSession的實現(xiàn)實際就是request.getSession()
3、HttpServletRequest對象的創(chuàng)建和銷毀監(jiān)聽器 —- ServletRequestListener
—-監(jiān)聽request對象創(chuàng)建
監(jiān)聽request對象銷毀
Request何時創(chuàng)建:請求發(fā)起時創(chuàng)建
Request何時銷毀:響應結束時銷毀
例如:每次刷新界面都會創(chuàng)建銷毀一次
注意(創(chuàng)建銷毀次數(shù)由請求次數(shù)決定):
使用forward —- request創(chuàng)建銷毀幾次 —– 一次
使用sendRedirect —- request創(chuàng)建銷毀兩次 (兩次請求)
(二)ServletContext/HttpSession/ServletRequest中保存數(shù)據(jù) 創(chuàng)建、修改、移除監(jiān)聽器
ServletContextAttributeListener 監(jiān)聽ServletContext中屬性變化
HttpSessionAttributeListener 監(jiān)聽HttpSession中屬性變化
ServletRequestAttributeListener 監(jiān)聽ServletRequest中屬性變化
attributeAdded 監(jiān)聽屬性添加 —- 當數(shù)據(jù)范圍對象沒有該屬性,第一次添加時調(diào)用執(zhí)行
attributeRemoved 監(jiān)聽屬性移除 —- 從一個數(shù)據(jù)范圍對象刪除一個已經(jīng)存在屬性執(zhí)行
attributeReplaced 監(jiān)聽屬性替換 —– 當一個數(shù)據(jù)范圍已經(jīng)存在一個屬性,向數(shù)據(jù)范圍添加相同名稱屬性觸發(fā)替換方法
例如,此處我們用HttpSessionAttributeListener舉例(ServletContextListener與ServletRequestListener同理):
JSP頁面
監(jiān)聽器
注冊
注意:獲得返回值通過session.getAttribute(se.getName())
(三)被綁定Session對象,自我狀態(tài)感知監(jiān)聽器
保存在 Session 域中的對象可以有多種狀態(tài):綁定到 Session 中;從 Session 域中解除綁定;隨 Session 對象持久化到一個存儲設備中(鈍化);隨 Session 對象從一個存儲設備中恢復(活化)
被存放Session的Java對象,感知自我四種狀態(tài)變化
1、被綁定
2、被解除綁定
3、被鈍化 —– 數(shù)據(jù)從內(nèi)存序列化硬盤
4、被活化 —- 數(shù)據(jù)從硬盤重新加載回內(nèi)存
HttpSessionBindingListener實現(xiàn)接口的java對象,感知自己被綁定到Session或者從Session中解除綁定
HttpSessionActivationListener實現(xiàn)接口的java對象,感知從內(nèi)存被鈍化硬盤上,雅思托福的區(qū)別從硬盤活化到內(nèi)存中
實現(xiàn)這兩個接口的類不需要 web.xml 文件中進行注冊,都是由Session自主完成的,例如在存儲對象的時候會自動調(diào)用綁定
HttpSessionBindingListener
* 綁定對象方法 —-
* 解除綁定方法 —–、當Session對象銷毀時,當中所有綁定對象解除綁定
JSP頁面:
HttpSessionActivationListener
* 感知對象被活化
* 感知對象被鈍化
使用場景:Session保存數(shù)據(jù),很長一段時間沒用,但是不能銷毀Session對象,不想占用服務器內(nèi)存資源 —– 鈍化(將服務器內(nèi)存中數(shù)據(jù)序列化硬盤上)
JSP界面
讀取數(shù)據(jù)
注意
鈍化和活化應該由tomcat服務器 自動進行 —- 配置tomcat
配置context有幾個位置?
1、tomcat/conf/context.xml 對所有虛擬主機 所有web工程生效
2、tomcat/conf/Catalina/localhost/context.xml 對當前虛擬主機所有web工程生效
3、當前工程/META-INF/context.xml 對當前工程有效
鈍化后 it315目錄在哪里?在“tomcat/work/Catalina/localhost/項目名”目錄中
java對象如果想實現(xiàn)序列化,需要實現(xiàn)Serializable接口(因此上述Bean2實現(xiàn)Serializable接口,才可以被鈍化,并之后進行活化并讀?。?/p>
到此這篇關于java中Servlet監(jiān)聽器的工作原理及示例詳解的文章就介紹到這了,更多相關java Servlet監(jiān)聽器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- IntelliJ IDEA里找不到javax.servlet的jar包的解決方法
- Servlet開發(fā)JavaWeb工程示例詳解
- JAVA WEB中Servlet和Servlet容器的區(qū)別
- Java ServletContext對象原理及功能解析
- Java Servlet輸出中文亂碼問題解決方案
- JavaWeb servlet實現(xiàn)下載與上傳功能的方法詳解
- Java基于ServletContextListener實現(xiàn)UDP監(jiān)聽
- JavaWeb項目Servlet無法訪問問題解決
- 使用Java servlet實現(xiàn)自動登錄退出功能
- Java Servlet 運行原理分析
相關文章
Spring boot2+jpa+thymeleaf實現(xiàn)增刪改查
這篇文章主要介紹了Spring boot2+jpa+thymeleaf實現(xiàn)增刪改查,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04Spring?Security實現(xiàn)分布式系統(tǒng)授權方案詳解
這篇文章主要介紹了Spring?Security實現(xiàn)分布式系統(tǒng)授權,本節(jié)完成注冊中心的搭建,注冊中心采用Eureka,本文通過示例代碼圖文相結合給大家介紹的非常詳細,需要的朋友可以參考下2022-02-02SpringBoot環(huán)境屬性占位符解析和類型轉(zhuǎn)換方式
這篇文章主要介紹了SpringBoot環(huán)境屬性占位符解析和類型轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11解決mybatis plus報錯com.microsoft.sqlserver.jdbc.SQLServerE
這篇文章主要介紹了解決mybatis plus報錯com.microsoft.sqlserver.jdbc.SQLServerException:必須執(zhí)行該語句才能獲得結果,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05SpringBoot項目部署時application.yml文件的加載優(yōu)先級和啟動腳本問題
Spring Boot在啟動時會根據(jù)一定的優(yōu)先級順序加載配置文件,優(yōu)先級從高到低依次是:命令行參數(shù)、Jar包外部config目錄下的配置文件、Jar包同級目錄下的配置文件、classpath下的/config目錄、classpath根路徑2024-09-09