一.Filter(过滤器)
1.基本概念
1.1.Filter本意为”过滤“的含义,是JavaWeb的三大组件之一,三大组件为:Servlet、Filter、Listener。
1.2.过滤器是向 Web 应用程序的请求和响应处理添加功能的 Web 服务组件。
1.3过滤器相当于浏览器与Web资源之间的一道过滤网,在访问资源之前通过一系列的过滤器对请求进行修改、判断以及拦截等,也可以对响应进行修改、判断以及拦截等。
2.工作方式
3.使用方式
3.1自定义类实现Filter接口并重写doFilter方法。
public class LoginFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException { //TODO 处理逻辑,必须调用下面的方法 chain.doFilter(request,response); } }
|
3.2在web.xml文件中配置过滤器
filter> <filter-name>LoginFilter</filter-name> <filter-class>com.yangshen.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
二.监听器
1.基本概念
Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理。
容器产生的事件分类如下:
生命周期相关的事件。 属性状态相关的事件。 存值状态相关的事件。底层原理是采用接口回调的方式实现。
2.基本分类
监听器类型 | 功能介绍 |
javax.servlet.ServletRequestListener | 监听request作用域的创建和销毁 |
javax.servlet.ServletRequestAttributeListener | 监听request作用域的属性状态变化 |
javax.servlet.http.HttpSessionListener | 监听session作用域的创建和销毁 |
javax.servlet.http.HttpSessionAttributeListener | 监听session作用域的属性状态变化 |
javax.servlet.ServletContextListener | 监听application作用域的创建和销毁 |
javax.servlet.ServletContextAttributeListener | 监听application作用域的属性状态变化 |
javax.servlet.http.HttpSessionBindingListener | 监听对象与session的绑定和解除 |
javax.servlet.http.HttpSessionActivationListener | 监听session数值的钝化和活化 |
3.代码案例
3.1自定义类实现监听器接口并重写相关的方法
package com.yangshen.demo04;
import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener;
public class OnlineUser implements HttpSessionListener, ServletContextListener { // 声明一个ServletContex类型的引用负责作为全局对象来记录当前在线用户的数量,通过属性记录 private ServletContext servletContext = null;
@Override public void contextInitialized(ServletContextEvent servletContextEvent) { servletContext = servletContextEvent.getServletContext(); }
@Override public void contextDestroyed(ServletContextEvent servletContextEvent) { servletContext = null; }
@Override public void sessionCreated(HttpSessionEvent httpSessionEvent) { System.out.println("有新用户上线了..."); Object count = servletContext.getAttribute("count"); // 若当前用户为第一个用户,则将全局对象中的属性值设置为即可 if (null == count) { servletContext.setAttribute("count", 1); } // 若当前用户不是第一个用户,则将全局对象中原有的数据取出来加后再设置进去 else { Integer integer = (Integer)count; integer++; servletContext.setAttribute("count", integer); } System.out.println("当前在线用户数量为:" + servletContext.getAttribute("count")); }
@Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { System.out.println("有用户已下线..."); } }
|
3.2在web.xml中配置监听器
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
<listener> <listener-class>com.yangshen.demo04.OnlineUser</listener-class> </listener> </web-app> |
3.3在jsp页面显示
<%-- Created by IntelliJ IDEA. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>实现当前在线的用户数量</title> </head> <body> <h1>当前在线用户人数为:${applicationScope.count}</h1> </body> </html>
|