JavaWeb 三大组件之监听器 Listener
JavaWeb 三大组件之监听器 Listener
1.官方文档
链接:https://pan.baidu.com/s/1Hk8Aq8Nk9_P1ucmaP4g3qA
提取码:5kni
2.Listener 监听器介绍
1.Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程 序、Listener 监听器、Filter 过滤器
2.Listener 是 JavaEE 的规范,就是接口
3.监听器的作用是,监听某种变化(一般就是对象创建/销毁, 属性变化), 触发对应方法完成 相应的任务
4.JavaWeb 中的监听器(共八个), 目前最常用的是 ServletContextListener
3.JavaWeb 的监听器
1.ServletContextListener 监听器
1.作用:监听 ServletContext 创建或销毁(当我们Web 应用启动时,就会创建 ServletContext), 即生命周期监听,
应用场景(1)加载初始化的配置文件;比如 spring 的配置文件 (2)任务调度(配合定时器 Timer/TimerTask)
2.相关方法
void contextInitialized(ServletContextEvent sce) 创建Servletcontext 时触发
void contextDestroyed(ServletContextEvent sce) 销毁 Servletcontext 时
3.应用实例
同样是需要引入servlet-api.jar的依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
/**
* 1. 当一个类实现了 ServletContextListener
* 2. 该类就是一个监听器
* 3. 该类可以监听的事件 由该类实现的监听接口决定 ,比如 实现ServletContextListener
* , 则该类就可以监听 ServletContext对象的创建和销毁, 以此类推
* 4. MyServletContextListener 就是一个监听者
* 5. 当web应用启动时,就会产生 ServletContextEvent 事件, 会调用监听器的对应事件处理方法
* contextInitialized, 同时会传递 事件对象
* 6. 程序员可以通过 ServletContextEvent 事件对象,来获取需要的信息, 然后再进行业务处理
* 7. tomcat怎么知道这个监听器存在 ? 因为我们需要在web.xml中配置
*/
public class MyServletContextListener implements ServletContextListener {
/**
* 监听ServletContext的创建
* @param sce
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("监听到 "+ sce.getServletContext()+"对象被创建");
}
/**
* 监听ServletContext的销毁
* @param sce
*/
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("监听到 "+sce.getServletContext()+"对象被销毁");
}
}
4.配置 web.xml
<!--在web.xml中配置了监听器类的全路径,tomcat可以通过反射的方式获取到监听器对象从而执行监听的方法-->
<listener>
<listener-class>com.llp.MyServletContextListener</listener-class>
</listener>
5.完成测试
2.ServletContextAttributeListener 监听器
1.作用:监听 ServletContext 属性变化
2.相关方法
void attributeAdded(ServletContextAttributeEvent event) 添加属性时调用
void attributeReplaced(ServletContextAttributeEvent event) 替换属性时调用
void attributeRemoved(ServletContextAttributeEvent event) 移除属性时调用
3.应用案例
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
/**
* 监听ServletContext对象属性的添加
* @param event
*/
@Override
public void attributeAdded(ServletContextAttributeEvent event) {
System.out.println("监听到属性名"+event.getName()+"=属性值"+event.getValue()+"被添加到ServletContext中");
}
/**
* 监听ServletContext对象属性的删除
* @param event
*/
@Override
public void attributeRemoved(ServletContextAttributeEvent event) {
System.out.println("监听到属性名"+event.getName()+"=属性值"+event.getValue()+"从ServletContext中删除");
}
/**
* 监听ServletContext对象属性的替换
* @param event
*/
@Override
public void attributeReplaced(ServletContextAttributeEvent event) {
System.out.println("监听到属性名"+event.getName()+"=属性值"+event.getValue()+"从ServletContext中替换");
}
}
4.配置web.xml
<listener>
<listener-class>com.llp.MyServletContextAttributeListener</listener-class>
</listener>
5.完成测试
3.其它监听器-使用较少
1.HttpSessionListener 监听器
1.作用:监听 Session 创建或销毁,即生命周期监听
2.相关方法
void sessionCreated(HttpSessionEvent se) 创建session时调用
void sessionDestroyed(HttpSessionEvent se) 销毁session 时调用
使用方法和前面一样, 可以用于监控用户上线,离线
3.应用实例
public class MyHttpSessionListener implements HttpSessionListener{
/**
* 监听session创建
* @param se
*/
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("监听到session对象:"+se.getSession()+"被创建,SessionId="+se.getSession().getId());
//设置session 30秒过期
se.getSession().setMaxInactiveInterval(20);
}
/**
* 监听session销毁
* @param se
*/
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("监听到session对象:"+se.getSession()+"被销毁,SessionId="+se.getSession().getId());
}
}
@WebServlet(name = "HttpSessionServlet",urlPatterns = {"/session"})
public class HttpSessionServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//如果session会话存在则获取session,如果不存在则创建session
HttpSession session = request.getSession();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
4.web.xml
<listener>
<listener-class>com.llp.MyHttpSessionListener</listener-class>
</listener>
5.测试
2.HttpSessionAttributeListener 监听器
1.作用:监听 Session 属性的变化
2.相关方法
void attributeAdded(ServletRequestAttributeEvent srae) 添加属性时
void attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时
void attributeRemoved(ServletRequestAttributeEvent srae) 移除属性时
3.使用少 , 使用方法和前面一样。
3.ServletRequestListener 监听器
1.ServletRequestListener 监听器
2.作用:监听 Request 创建或销毁,即 Request 生命周期监听相关方法
void requestInitialized(ServletRequestEvent sre) 创建 request 时
void requestDestroyed(ServletRequestEvent sre) 销毁 request 时
3.可以用来监控, 某个 IP 访问我们网站的频率, 日志记录 ,访问资源的情况.
@WebListener()
public class MyRequestListener implements ServletRequestListener {
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("MyRequestListener 监听到 request对象创建");
ServletRequest servletRequest = servletRequestEvent.getServletRequest();
System.out.println("记录访问日志....");
System.out.println("访问IP= " + servletRequest.getRemoteAddr());
System.out.println("访问的资源= " + ((HttpServletRequest)servletRequest).getRequestURL());
}
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
//request在一次请求之后就会被销毁
System.out.println("HspRequestListener 监听到 request对象被销毁");
}
}
4.ServletRequestAttributeListener 监听器
1.作用:监听 Request 属性变化
request.setAttribute("name","gukong");
request.removeAttribute("name");
2.相关方法
void attributeAdded(ServletRequestAttributeEvent srae) 添加属性时
void attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时
void attributeRemoved(ServletRequestAttributeEvent srae)移除属性时
3.使用方法和前面类似
5.HttpSessionBindingListener 感知监听器
HttpSessionBindingListener必须实例化后放入某一个session中(解释:例如
session.setAttribute("onlineUserBindingListener", new OnlineUserBindingListener(username));
把我们自定义的监听类存储到session中,这个监听器就像“寄生虫”一样赋于该session上),才可以进行监听。
从监听范围上比较,HttpSessionListener设置一次就可以监听所有session,HttpSessionBindingListener通常都是一对一的。
6.HttpSessionActivationListener 感知监听器
钝化和活化
1.钝化:就是序列化,把对象转化为字节序列,把Session对象从内存保存到硬盘里。(持久化操作)2.活化:就是反序列化,把字节序列转化为对象,把Session对象从硬盘再读回内存。
HttpSessionActivationListener监控Session时必须把它添加到Session中,
HttpSessionActivation activation = new HttpSessionActivation(); session.setAttribute("Listener",activation);
所以当Session的序列化/反序列化执行的时候它都会监听到。此接口中有两个方法:
sessionWillPassivate(HttpSessionEvent):Session对象钝化之前执行
sessionDidActivate(HttpSessionEvent):Session对象活化后执行