javaweb项目添加监听器
监听器,主要是用来监听特定对象的创建、销毁或者属性的新增,覆盖,移除的。
监听器是观察者模式的经典实现!
javaweb中提供了很多监听器接口,主要有以下几个
/** 对象监听器 **/
javax.servlet.ServletContextListener // 监听 servletContext的创建和销毁
javax.servlet.http.HttpSessionListener//监听 session的创建和销毁
javax.servlet.ServletRequestListener //监听request的创建和销毁
/** 属性监听器 **/
javax.servlet.ServletRequestAttributeListener //监听request属性的新增、覆盖、移除
javax.servlet.ServletContextAttributeListener//监听servletContext属性的新增、覆盖、移除
javax.servlet.http.HttpSessionAttributeListener//监听session属性的新增、覆盖、移除
我在这里就不讨论具体在哪个业务场景使用了,直接上代码了
这些功能大概用到如下几个常用场景:
统计在线人数,防止重复登录,黑名单,功能增强,数据统计,日志打印…
package com.cgy.demos.web.listener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class MyRequestAttrListener implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
System.out.println("request属性添加了");
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
System.out.println("request属性移除了");
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
System.out.println("request属性移覆盖了");
}
}
package com.cgy.demos.web.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class MyServletContextAttrListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent event) {
System.out.println("ServletContext 属性新增了");
}
@Override
public void attributeRemoved(ServletContextAttributeEvent event) {
System.out.println("ServletContext 属性移除了");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent event) {
System.out.println("ServletContext 属性替换了");
}
}
package com.cgy.demos.web.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Servlet Context 创建了");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("Servlet Context 销毁了");
}
}
package com.cgy.demos.web.listener;
import com.alibaba.fastjson.JSON;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
/**
* 任何请求的创建和销毁都会回调这个listener 下面是官方注释
* Interface for receiving notification events about requests coming
* into and going out of scope of a web application.
*
*/
@WebListener
public class MyServletRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("request destroyed 事件回调了");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("request 初始化 事件回调了");
}
}
package com.cgy.demos.web.listener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
@WebListener
public class MySessionAttrListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
System.out.println("session 属性新增了");
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
System.out.println("session 属性移除了");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
System.out.println("session 属性覆盖了");
}
}
package com.cgy.demos.web.listener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class MySessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("session创建了,sessionId:" + se.getSession().getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("session销毁了,sessionId:" + se.getSession().getId());
}
}
具体要实现什么功能,请自行研究
至此,javaweb项目也开发的差不多了。后面会继续探讨 spring的相关内容