SpringMVC 解析(二)DispatcherServlet

本文深入探讨了Spring Web应用中的核心组件DispatcherServlet,包括Servlet容器、Servlet的基本概念、DispatcherServlet的处理流程、组件配置及其在Web应用中的角色。重点讲解了DispatcherServlet如何处理请求,如何与Servlet容器交互,并介绍了其路径匹配、拦截器和异常处理机制。
摘要由CSDN通过智能技术生成

在我的关于Tomcat容器介绍的文章中,介绍了Tomcat容器的工作原理,我们知道Tomcat容器在收到请求之后,会把请求处理为Request/Response对象,交给Servlet实例处理。对于Spring的Web应用,得到Tomcat容器的请求之后会交给DispatcherServlet去处理。DispatcherServlet是Spring Web应用处理请求的核心组件,本文会介绍DispatcherServlet的工作原理及关键源码,本文主要参考了Spring的官方文档

Servlet简介

什么是Servlet容器

首先我们需要知道什么是Web服务器,Web 服务器使用 HTTP 协议传输数据。在一般情况下,用户在浏览器(客户端)中键入 URL(例如www.baidu.com/static.html ), 并获取要读取的网页。所以服务器所做的就是向客户机发送一个网页。信息的交换采用指定请求和响应消息的格式的 HTTP 协议。

正如我们看到的,用户/客户端只能从服务器请求静态网页。如果用户希望根据自己的输入阅读网页,那么这还不够好。Servlet 容器的基本思想是使用 Java 动态生成服务器端的网页。所以 Servlet 容器本质上是与 Servlet 交互的 Web 服务器的一部分。


Servlet容器的实现往往比较复杂,以典型的Tomcat容器为例,容器内包含连接器和Container两大组件,以及类加载器、服务组件、服务器组件等多种组件。Servlet容器会复杂把请求打包为标准的Request/Response,然后交个Servlet实例进行处理,下图为Tomcat容器的结构图。

什么是Servlet?

Servelt容器会负责处理请求并把请求转为Request/Response对象,但是Servlet容器不会实际处理业务逻辑,而是交给Servlet处理。Servlet 是 javax.servlet 包中定义的接口。它声明了 Servlet 生命周期的三个基本方法:init()、service() 和 destroy()。它们由每个 Servlet Class(在 SDK 中定义或自定义)实现,并由服务器在特定时机调用。

  • init() 方法在 Servlet 生命周期的初始化阶段调用。它被传递一个实现 javax.servlet.ServletConfig 接口的对象,该接口允许 Servlet 从 Web 应用程序访问初始化参数。
  • service() 方法在初始化后对每个请求进行调用。每个请求都在自己的独立线程中提供服务。Web容器为每个请求调用 Servlet 的 service() 方法。service() 方法确认请求的类型,并将其分派给适当的方法来处理该请求。
  • destroy() 方法在销毁 Servlet 对象时调用,用来释放所持有的资源。

从 Servlet 对象的生命周期中,我们可以看到 Servlet 类是由类加载器动态加载到容器中的。每个请求都在自己的线程中,Servlet 对象可以同时服务多个线程(线程不安全的)。当它不再被使用时,会被 JVM 垃圾收集。像任何Java程序一样,Servlet 在 JVM 中运行。为了处理复杂的 HTTP 请求,Servlet 容器出现了。Servlet 容器负责 Servlet 的创建、执行和销毁。

Servlet请求处理

那么Servlet容器是如何处理一个Http请求的呢?在我的另外一篇关于Tomcat容器中介绍了Tomcat容器处理Http请求的详细流程,此处就简单介绍一下逻辑:

  1. Web服务器接收HTTP请求。
  2. Web服务器将请求转发到Servlet容器。
  3. 如果对应的Servlet不在容器中,那么将被动态检索并加载到容器的JVM中。
  4. 容器调用init()方法进行初始化(仅在第一次加载 Servlet 时调用一次)。
  5. 容器调用Servlet的service()方法来处理HTTP请求,即读取请求中的数据并构建响应。
  6. Web 服务器将动态生成的结果返回到浏览器/客户端。

javax包中关于Servlet的接口定义如下所示:


public interface Servlet {
    
    void init(ServletConfig var1) throws ServletException;
    
    ServletConfig getServletConfig();
    
    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
    
    String getServletInfo()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值