Java(三)------Servlet、过滤器、监听器、拦截器理解

本文深入介绍了Servlet容器如Tomcat的工作原理,包括Servlet的生命周期、过滤器的使用场景以及监听器的应用。过滤器在Web资源请求前和响应后进行拦截处理,用于身份验证、编码设置等。监听器则是对对象状态变化的监听,如页面访问量统计。拦截器基于Java反射,用于Action调用的动态拦截,常见于AOP实现。过滤器和拦截器的主要区别在于调用机制、依赖性、作用范围及生命周期等方面。
摘要由CSDN通过智能技术生成

一、servlet

servlet容器

Tomcat 是典型的servlet容器

在这里插入图片描述

Tomcat 分为四个等级,其中Context 容器是真正管理Servlet 的,一个 Context 对应一个 Web 工程。

Context 容器并不是直接管理Servlet,而是管理servlet的包装类:StandardWrapper。

为什么要将 Servlet 包装成 StandardWrapper 而不直接是 Servlet 对象。因为StandardWrapper 是 Tomcat 容器中的一部分,它具有容器的特征,而 Servlet 为一个独立的 web 开发标准,不应该强耦合在 Tomcat 中。

除了将 Servlet 包装成 StandardWrapper 并作为子容器添加到 Context 中,其它的所有 web.xml 属性都被解析到 Context 中,所以说 Context 容器才是真正运行 Servlet 的 Servlet 容器。一个 Web 应用对应一个 Context 容器,容器的配置属性由应用的 web.xml 指定,这样我们就能理解 web.xml 到底起到什么作用了。

servlet的工作工程

  • 客户端浏览器向服务器发送http请求
  • 服务器接收请求,发送给servlet处理
  • servlet容器创建servlet实例处理请求,将请求响应结果返回给服务器
  • 服务器收到响应结果后,发送给客户端

servlet的生命周期

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:

  • Servlet 通过调用 init () 方法进行初始化。
  • Servlet 调用 service() 方法来处理客户端的请求。
  • Servlet 通过调用 destroy() 方法终止(结束)。
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

init ()

init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一样。

Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。

<loadon-startup>1</loadon-startup> 

当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。

service()

service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

destroy()

destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。

二、过滤器

过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理

通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理

  • 在客户端的请求访问后端资源之前,拦截这些请求。
  • 在服务器的响应发送回客户端之前,处理这些响应。

在这里插入图片描述
应用场景

身份验证

统一设置编码格式

访问权限控制

敏感字符过滤

过滤器是在容器启动时就会创建的,只会创建一个实例,常驻内存,也就是说服务器一启动就会执行Filter的init(FilterConfig config)方法。当Filter被移除或容器正常关闭时,会执行destroy方法

public class LoginFilter implements Filter {
   
   // 初始化方法  接收一个FilterConfig类型的参数 该参数是对Filter的一些配置
    public void init(FilterConfig config) throws ServletException {
		// 获取初始化参数
        String name= config.getInitParameter("name"); 

    }
    // 在 Filter 实例被 Web 容器从服务移除之前调用
    public void destroy() {
    
    }

    // 过滤方法 主要是对request和response进行一些处理,然后交给下一个过滤器或Servlet处理
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        
        // 把请求传回过滤链,交给下一个过滤器或servlet处理
        chain.doFilter(req, resp);
    }

}
<web-app>  
<filter>
  <filter-name>LoginFilter </filter-name>
  <filter-class>com.LoginFilter</filter-class>
  <init-param>
    <param-name>name</param-name>
    <param-value>过滤器</param-value>
  </init-param>
</filter>
</web-app>  

使用多个过滤器

Web 应用程序可以根据特定的目的定义若干个不同的过滤器

  • 在web.xml中,filter执行顺序跟的顺序有关,先声明的先执行
  • 使用注解配置的话,filter的执行顺序跟名称的字母顺序有关,例如AFilter会比BFilter先执行
  • 如果既有在web.xml中声明的Filter,也有通过注解配置的Filter,那么会优先执行web.xml中配置的Filter
@WebFilter(filterName = "LoginFilter",urlPatterns = "/*")
public class LoginFilter implements Filter {
}

三、监听器

监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。

不同功能的Listener 需要实现不同的 Listener 接口,一个Listener也可以实现多个接口,这样就可以多种功能的监听器一起工作

监听器的相关概念

事件源:被监听的对象 ----- 三个域对象 request session servletContext

监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器 ----

注册监听器:将监听器与事件源进行绑定

响应行为:监听器监听到事件源的状态变化时 所涉及的功能代码 ---- 代码

应用场景

页面访问量

统计在线人数

应用启动时做一些初始化工作

监听器有哪些

按照被监听的对象划分:

ServletRequest域 HttpSession域 ServletContext域

监听的内容划分:

监听域对象的创建与销毁的 监听域对象的属性变化的

八种类型监听器

其中:监听对象的创建与销毁监听器:3种

ServletContextListener:监听ServletContext域的创建与销毁的监听器

HttpSessionListener:监听Httpsession域的创建于销毁的监听器

ServletRequestListener:监听ServletRequest域创建与销毁的监听器

其中:监听三大域对象的属性变化的监听器:3种

HttpSessionAttributeLister

ServletContextAttributeListener

ServletRequestAttributeListener

其中:监听Session 内的对象:2种

HttpSessionBindingListener

HttpSessionActivationListener

与上面六类不同,这两类 Listener 监听的是Session 内的对象,而非 Session 本身,不需要在 web.xml中配置。

钝化:本质是把内存中的session对象序列化到存储设备中

活化:通过反序列化将session对象从存储恢复到内存中

session作用域只有实现了java.io.Serializable接口才能被

钝化,否则将丢失数据

实现

public class MyListener implements ServletContextListener {  
  
    public void contextDestroyed(ServletContextEvent sce) {  
          
    }  
  
    public void contextInitialized(ServletContextEvent sce) {  
          
    }  
}  
<!--监听器 -->  
<listener>  
    <listener-class>servlet.listener.MyListener</listener-class>  
</listener>  

四、拦截器

java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截然后再之前或者之后加入某些操作。

大部分时候,拦截器方法都是通过代理的方式来调用的。拦截器是AOP的一个实现。

五、过滤器和拦截器的区别

  • ①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  • ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
  • ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  • ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  • ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
  • ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值