一、学习目标
1、Listener监听器
2、Listener监听器作用
3、Listener监听器的创建与销毁
二、重点知识
1、Listener监听器
Filter和Listener是Servlet规范中的两个高级特性,不同于Servlet,他们不用于处理客户端请求。Filter是用于对request、response对象进行修改,Listener用于对context、session、request事件进行监听。善用Servlet规范中的这两个高级特性能够轻松地解决一些特殊问题。
1.1添加Listener() 方法
在用户点击按钮时触发监听事件:
document.getElementById("myBtn").addEventListener("click", displayDate);
2、 Listener监听三个域对象创建与销毁
2.1 监听ServletContext域对象的创建与销毁:实现ServletContextListener接口
ServletContext域对象的生命周期:
创建:启动服务器时创建
销毁:关闭服务器或者从服务器移除项目
@WebListener
public class MyServletContextListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("初始化");
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("销毁了");
}
}
作用:
利用ServletContextListener监听器在创建ServletContext域对象时完成一些想要初始化的工作或者执行自定义任务调度。
2.2 监听ServletRequest域对象的创建与销毁:实现ServletRequestListener接口。
ServletRequest域对象的生命周期:
创建:访问服务器任何资源都会发送请求(ServletRequest)出现,访问.html和.jsp和.servlet都会创建请求。
销毁:服务器已经对该次请求做出了响应。
@WebListener
public class MyServletRequestListener implements ServletRequestListener{
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("ServletRequest销毁了");
}
@Override
public void requestInitialized(ServletRequestEvent arg0) {
System.out.println("ServletRequest创建了");
}
}
2.3 监听HttpSession域对象的创建与销毁:实现HttpSessionListener接口:
HttpSession域对象的生命周期:
创建:只要调用了getSession()方法就会创建,一次会话只会创建一次,
销毁:1.超时(默认为30分钟)2.非正常关闭,销毁3.正常关闭服务器(序列化)
@WebListener
public class MyHttpSessionListener implements HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("HttpSession创建了");
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("HTTPSession销毁了");
}
}
作用:每位用户登录网站时都会创建一个HTTPSession对象,利用这个统计在线人数。
- Listener监听三个域对象属性状态的改变
监听HttpSession属性的改变:实现HttpSessionAttributeListener接口。
监听ServletContext属性的改变:实现ServletContextAttribute接口。
监听ServletRequest属性的改变:实现ServletRequestAttribute接口。
三、实际运用
1.创建监听器:
在chepter11创建一个chapter11.listener包,编写一个mylistener类,用来实现若干个监听器接口。
代码示例:
mylistener.java
package chapter11.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet