Listener--------监听器
Listener:監(jiān)聽(tīng)器的原理和實(shí)例
八大監(jiān)聽(tīng)器:
????? ServletRequest對(duì)象:
???????? 生命周期監(jiān)聽(tīng):ServletRequestListener
???????? 屬性監(jiān)聽(tīng):ServletRequestAttributeListener
????? HttpSession對(duì)象:
???????? 生命周期監(jiān)聽(tīng):HttpSessionListener
???????? 屬性監(jiān)聽(tīng):HttpSessionAttributeListener
???????? 對(duì)象綁定監(jiān)聽(tīng)1:HttpSessionBindingListener
???????? 對(duì)象鈍化活化監(jiān)聽(tīng)2:HttpSessionActivationListener
????? ServletContext對(duì)象:
???????? 生命周期監(jiān)聽(tīng):ServletContextListener
???????? 屬性監(jiān)聽(tīng):ServletContextAttributeListener
一、監(jiān)聽(tīng)對(duì)象,主要監(jiān)聽(tīng)servlet的三大域?qū)ο髍equest,session,application(ServletRequest,HttpSession,ServletContext)
??? 監(jiān)聽(tīng)內(nèi)容:
??????? A:監(jiān)聽(tīng)域?qū)ο蟮膭?chuàng)建和銷毀,也就是生命周期的監(jiān)聽(tīng)
??????? B:監(jiān)聽(tīng)域?qū)ο蟮膶傩蕴砑?#xff0c;移除和更改
??????? C:監(jiān)聽(tīng)被加入域?qū)ο笾械膶?duì)象
二、三大域?qū)ο蟮纳芷?br />??? ServletRequest 什么時(shí)候被創(chuàng)建:
??????? A: 請(qǐng)求一個(gè)jsp頁(yè)面時(shí),tomcat 翻譯jsp頁(yè)面為一個(gè)servlet類,執(zhí)行servlet 類中的service()方法是,tomcat幫我們創(chuàng)建了9大內(nèi)置對(duì)象,其中就有request。
??????? B: 請(qǐng)求一個(gè)servlet時(shí),doGet() 或者是doPost()方法,tomcat 自動(dòng)也會(huì)幫我們創(chuàng)建request,
?? ServletRequest 什么時(shí)候被銷毀:
??????? 執(zhí)行完service()方法或者 doGet()方法,doPost()方法即銷毀
??? HttSesssion 什么時(shí)候被創(chuàng)建:
??????? Request.getSession():? 先判斷是否存在session對(duì)象,如果存在就直接返回,如果不存在就幫我們創(chuàng)建一個(gè)session,然后返回。
??? HttSesssion 什么時(shí)候被銷毀:
?????? 是根據(jù)cookie的生命周期來(lái)判斷的,如果cookie是瀏覽器生命周期的話,那么瀏覽器關(guān)閉后,session即銷毀;如果cookie是保存到文件中的,那么就具體情況,具體對(duì)待。
?
??? ServletContext 什么時(shí)候被創(chuàng)建:
?????? Tomcat啟動(dòng)項(xiàng)目,即創(chuàng)建了application對(duì)象。
??? ServletContext 什么時(shí)候被銷毀:
?????? Tomcat關(guān)閉項(xiàng)目,即銷毀了application對(duì)象。
三、【實(shí)例】
?? 創(chuàng)建一個(gè)監(jiān)聽(tīng)器
? A:選擇一個(gè)接口,根據(jù)監(jiān)聽(tīng)對(duì)象,監(jiān)聽(tīng)內(nèi)容的不同選擇不同的接口
? B:在web.xml中添加監(jiān)聽(tīng)器的配置信息
????? <listener>
????????? <listener-class>監(jiān)聽(tīng)器文件的相對(duì)路徑</listener-class>
????? </listener>
監(jiān)聽(tīng)器: HttpSessionAttributeListener
??? 【原理】
??? HttpSessionAttributeListener是對(duì)SessionAttribute的監(jiān)聽(tīng),當(dāng)在會(huì)話對(duì)象中加入屬性,移除屬性和替換屬性時(shí)就會(huì)觸發(fā)HttpSessionAttributeListener監(jiān)
聽(tīng)器。
??? 接口HttpSessionAttributeListener有3個(gè)方法:
??? 1、public void attributeAdded(HttpSessionBindingEvent sbe){}:該方法在session添加對(duì)象是觸發(fā)
??? 2、public void attributeRemoved(HttpSessionBindingEvent sbe){}:該方法是在session移除對(duì)象時(shí)觸發(fā)的
??? 3、public voidattributeReplaced(HttpSessionBindingEvent se):在Session屬性被重新設(shè)置時(shí)
?? 【實(shí)例】統(tǒng)計(jì)一下系統(tǒng)的登錄人數(shù)
package com.aaa.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionBindingEvent;
@WebListener()
public class Listener2 implements ServletContextListener,
??????? HttpSessionListener, HttpSessionAttributeListener {
????? public int count=0;//統(tǒng)計(jì)登錄的人數(shù)
??? // Public constructor is required by servlet spec
??? public Listener2() {
??? }
??? // -------------------------------------------------------
??? // ServletContextListener implementation
??? // -------------------------------------------------------
??? public void contextInitialized(ServletContextEvent sce) {
????? /* This method is called when the servlet context is
???????? initialized(when the Web application is deployed).
???????? You can initialize servlet context related data here.
????? */
??? }
??? public void contextDestroyed(ServletContextEvent sce) {
????? /* This method is invoked when the Servlet Context
???????? (the Web application) is undeployed or
???????? Application Server shuts down.
????? */
??? }
??? // -------------------------------------------------------
??? // HttpSessionListener implementation
??? // -------------------------------------------------------
??? public void sessionCreated(HttpSessionEvent se) {
??????? /* Session is created. */
??? }
??? public void sessionDestroyed(HttpSessionEvent se) {
??????? /* Session is destroyed. */
??? }
??? // -------------------------------------------------------
??? // HttpSessionAttributeListener implementation
??? // -------------------------------------------------------
??? public void attributeAdded(HttpSessionBindingEvent sbe) {
????? /* This method is called when an attribute
???????? is added to a session.
????? */
???? //session對(duì)象中加入屬性了觸發(fā)此方法
???? //sbe.getName()得到session里的屬性名
????? if(sbe.getName().equals("user")){
???????? count++;
???????? //將count放在全局域?qū)ο骃ervletContext里
???????? sbe.getSession().getServletContext().setAttribute("count",count);
???????? System.out.println("現(xiàn)在系統(tǒng)登錄的用戶人數(shù)"+count);
?????? }
????? ?
??? }
??? public void attributeRemoved(HttpSessionBindingEvent sbe) {
????? /* This method is called when an attribute
???????? is removed from a session.
????? */
????? //session對(duì)象中刪除屬性時(shí)觸發(fā)此方法
????? if(sbe.getName().equals("user")){
?????????? count--;
?????????? sbe.getSession().getServletContext().setAttribute("count",count);
?????????? System.out.println("現(xiàn)在系統(tǒng)登錄的用戶人數(shù)"+count);
?????? }
??? }
??? public void attributeReplaced(HttpSessionBindingEvent sbe) {
????? /* This method is invoked when an attibute
???????? is replaced in a session.
????? */
??? }
}
轉(zhuǎn)載于:https://www.cnblogs.com/fbbg/p/11099169.html
總結(jié)
以上是生活随笔為你收集整理的Listener--------监听器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: P1262_美帝的间谍网络被我部捕获!
- 下一篇: 清明出游,在高速上堵了16个小时。