Listener
Listener 的作用是用于監聽 web應用的建立和銷毀,以及在其上attribute發生的變化。
web應用即ServletContext對象(jsp的隐式對象application)
除了對web應用的監聽外,還能監聽session和request的生命周期,以及他們的attribute發生的變化。
對Context的監聽
分為兩種,一是生命周期的監聽,也就是建立和銷毀。二是attribute發生變化的監聽,分為屬性的增加,移除,替換。
生命周期的監聽:
package listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ContextListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("web 應用銷毀 ");
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("web 應用初始化 ");
}
}
Attribute的監聽:
package listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class ContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent e) {
System.out.println("增加屬性 ");
System.out.println("屬性是" + e.getName());
System.out.println("值是" + e.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent e) {
// TODO Auto-generated method stub
System.out.println("移除屬性 ");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent e) {
// TODO Auto-generated method stub
System.out.println("替換屬性");
}
}
此外呢。還有對session的監聽,request的監聽,對應之前學過的作用域不同,需要就用啥,就是參數名,方法名和上面的Context監聽有差別,其他地方都相同,比如都有對生命周期的監聽、Attribute變化的監聽,用到的時候再查。
用Session監聽統計線上人數
HTTP協定是短連結的,是以無法在服務端根據建立了多少連接配接來統計目前有多少人線上。 不過可以通過統計session有多少來估計線上人數。
一旦一個使用者通路伺服器,就會建立一個session. 如果該使用者持續通路,那麼該session會持續有效。
如果經曆了30分鐘,該使用者也沒有做任何操作,就表示該使用者“下線” 了,其對應的session也會被銷毀。
是以可以通過統計有多少session被保留來估計目前線上人數。
package listener;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class OnlineNumberListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent e) {
ServletContext application = e.getSession().getServletContext();
Integer online_number = (Integer) application.getAttribute("online_number");
if (null == online_number)
online_number = 0;
online_number++;
application.setAttribute("online_number", online_number);
System.out.println("新增一位線上使用者");
}
@Override
public void sessionDestroyed(HttpSessionEvent e) {
ServletContext application = e.getSession().getServletContext();
Integer online_number = (Integer) application.getAttribute("online_number");
if(null==online_number){
online_number = 0;
}
else
online_number--;
application.setAttribute("online_number", online_number);
System.out.println("一位使用者離線");
}
}
學習網站:https://how2j.cn/p/4660