目录
1、什么是Listener
Listener是计算机科学中的一个重要概念,用于监视和响应特定事件的发生。
在Web中,监听器的作用是在事件发生时触发预先定义的动作或逻辑,实现程序的交互和响应。
Servlet API提供的几种常用的监听器,各自负责监听不同的对象或事件:
- ServletContextListener:Web应用程序的启动和关闭事件
- HttpSessionListener:会话的创建和销毁事件
- ServletRequestListener:请求的创建和销毁事件
此外,还有用于监听特定对象(如Context、Session、Request)的监听器,如ServletContextAttributeListener、HttpSessionAttributeListener等。
2、在Web中的重要作用
监听器能够监听并响应Web应用中的各种事件,从而实现各种功能需求,提高可靠性、安全性和性能:
应用程序生命周期管理:监听器能够监听Web应用程序的启动和销毁事件。在应用程序启动时,监听器可以加载配置文件、初始化数据或执行其他必要的初始化操作。在应用程序销毁时,监听器则可以进行资源清理、断开数据库连接等清理工作。
会话管理:监听器可以监听会话的创建和销毁,以及会话属性的添加、修改和删除。通过监听这些事件,可以实现用户在线状态的监控、会话超时处理、用户行为跟踪等功能。
请求处理:监听器能够监听请求的创建和销毁,以及请求属性的变化。这使得在请求处理过程中,可以执行一些额外的操作,如记录请求信息、验证用户身份、处理异常等。
事件通知与响应:监听器可以与事件通知机制结合,使得在特定事件发生时,能够自动触发相应的处理逻辑。这种机制使得Web应用程序能够更加灵活地响应各种事件,提高了系统的可扩展性和可维护性。
安全性与访问控制:通过监听器,可以实现用户访问权限的控制、安全事件的记录和处理等功能。例如,可以监听用户的登录和注销事件,对非法访问进行拦截和处理。
性能监控与优化:监听器还可以用于收集和分析Web应用程序的性能数据,如请求响应时间、资源使用情况等。通过这些数据,可以找出性能瓶颈并进行优化,提高Web应用程序的运行效率。
3、怎样使用
- 定义一个类,实现相应的监听器接口
- 重写方法
- 用@WebListener:这个注解告诉Servlet容器这个类是一个监听器,并在应用程序启动时自动注册它。
@WebListener
public class ContextLoaderListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
//加载资源
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
//释放资源
}
}
4、在不同层面的应用
1)JavaScript事件监听:
在Web中,最基本的监听器使用方式是通过JavaScript监听DOM元素上的事件。如使用addEventListener方法监听一个按钮的点击事件,并在事件发生时执行特定的回调函数。
var button = document.getElementById('myButton');
button.addEventListener('click', function() {
alert('Button clicked!');
});
这种监听器直接使用了浏览器提供的API。除了DOM事件,浏览器还提供了许多其他API来监听特定事件,如监听窗口大小变化、网络状态变化、设备输入等。
2)Web框架中的监听器:
当使用Web框架(如Spring MVC、Angular、React、Vue等)时,框架通常会提供自己的事件监听机制。这些机制通常用于监听框架内部的状态变化、组件间的通信、路由变化等。在这些框架中,开发者通常会按照框架的约定来注册和监听事件。
以Spring MVC为例,虽然它主要关注于后端MVC架构的实现,但它也提供了对HTTP请求和响应的监听能力,通过实现特定的接口或注解来监听请求的处理过程。
对于前端框架如React或Vue,它们则提供了自己的组件生命周期方法和事件处理机制,允许开发者监听组件的挂载、更新、卸载等事件,以及用户交互事件。
3)应用服务器和容器中的监听器:
在应用服务器和容器中,监听器通常用于监听应用上下文事件(如ServletContext的创建和销毁)、会话事件(如HttpSession的创建和销毁)等。这些监听器是通过实现特定的接口(如ServletContextListener、HttpSessionListener)并使用注解配置。
在Java Web中,监听器是Servlet规范中定义的一种特殊类,用于监听Web应用程序中的ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。当这些事件发生时,监听器可以触发回调函数,反馈给程序去做一些响应的处理。
例如:
- 加载初始化信息:使用ServletContextListener加载初始化信息是一个常见的做法。在Web应用程序启动时,contextInitialized方法会被调用,可以在这个方法中加载配置文件、初始化数据库连接池等。
@WebListener
public class InitializationListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext context = sce.getServletContext();
// 加载配置文件
Properties props = new Properties();
try (InputStream input = context.getResourceAsStream("/WEB-INF/config.properties")) {
props.load(input);
// 将配置信息存储到ServletContext中,供其他组件使用
context.setAttribute("config", props);
} catch (IOException e) {
e.printStackTrace();
}
// 初始化数据库连接池等
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// 在这里执行销毁操作,如关闭数据库连接池等
}
}
- 统计网站的访问量:通过HttpSessionListener监听HttpSession的创建和销毁事件来实现,每次新的会话创建时增加访问计数。
@WebListener
public class AccessCounterListener implements HttpSessionListener {
private AtomicInteger sessionCount = new AtomicInteger(0);
@Override
public void sessionCreated(HttpSessionEvent se) {
sessionCount.incrementAndGet();
// 可以将访问量信息存储到ServletContext或数据库中
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// 在这里可以处理会话销毁时的逻辑,如更新在线人数等
}
public int getSessionCount() {
return sessionCount.get();
}
}
- 实现访问监控:访问监控通常涉及记录用户访问的详细信息,如访问时间、访问页面、用户信息等。可以通过ServletRequestListener或HttpFilter实现。在ServletRequestListener中,可以监听请求的创建和销毁事件,记录相关信息。而
HttpFilter是
在请求处理之前和之后执行代码,非常适合进行访问日志的记录。
使用ServletRequestListener:
@WebListener
public class AccessMonitorListener implements ServletRequestListener {
@Override
public void requestInitialized(ServletRequestEvent sre) {
HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
String ipAddress = request.getRemoteAddr();
String url = request.getRequestURL().toString();
// 记录访问信息到日志或数据库
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
// 在这里可以执行请求销毁时的逻辑,如清理资源等
}
}
使用HttpFilter:
@WebFilter(filterName = "AccessLogFilter", urlPatterns = "/*")
public class AccessLogFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String ipAddress = httpRequest.getRemoteAddr();
String url = httpRequest.getRequestURL().toString();
// 记录访问信息到日志或数据库
chain.doFilter(request, response); // 继续请求处理
}
// 其他Filter方法
}
区别:
Web框架中的监听器:更多地关注于框架内部的状态变化、组件间的通信等。
应用服务器和容器中的监听器:通常是在应用服务器和容器中配置的,它们能够监听整个Web应用程序的生命周期事件,从而实现在应用层面的各种功能。
标签:Web,销毁,监听,Listener,事件,监听器,public From: https://blog.csdn.net/u010852547/article/details/136916365