servlet/Web/spring容器

servlet/Web/spring容器

servlet容器

主要职责:管理Servlet的生命周期(加载、初始化、服务、销毁),处理HTTP请求并将其路由到相应的Servlet。

实现标准:遵循Java Servlet规范(如Servlet API)。

定义:遵循 Java Servlet 规范(JSR)的运行时环境,核心功能是管理 Servlet 的生命周期(加载、初始化、处理请求、销毁)。

职责:

  1. 解析 HTTP 请求,将其封装为 ServletRequest/ServletResponse 对象。
  2. 加载和实例化 Servlet:根据配置信息加载 Servlet 类,并创建 Servlet 实例。
  3. 管理 Servlet 线程池、会话(Session)等。

代表实现:Tomcat、Jetty、Undertow。

特点:仅处理 Servlet 相关逻辑,不涉及 Spring 或其他框架。

Web容器

定义:Servlet 容器的扩展,在 Servlet 容器基础上增加了对 JSP、WebSocket 等 Web 技术的支持。

与 Servlet 容器的关系:

  • Web 容器 ≈ Servlet 容器(现代 Java Web 开发中两者通常等价)。
  • Web 容器包含并管理 Servlet 容器。
  • Web 容器负责处理 HTTP 请求,将其路由到相应的 Servlet 或 JSP 页面。
  • 严格来说,Web 容器是 Servlet 容器的超集(例如:Tomcat 既是 Servlet 容器也是 Web 容器)。

职责:

  • 包含 Servlet 容器的所有功能
  • 支持 JSP 编译为 Servlet
  • 提供静态资源服务(HTML/CSS/JS)
  • 管理 Web 应用上下文(ServletContext)

特点:

  • 支持 JSP 等 Web 技术。
  • 管理 JSP 生命周期(加载、编译、执行)。
  • 处理 WebSocket 等 Web 协议。
  • 提供了更多的功能,如过滤器、监听器等。
    代表实现:Tomcat、Jetty、WebLogic、WebSphere。

具体来说,Web容器提供完整的 Web 应用运行时环境。

注意:在Java Web开发中,通常所说的Web容器就是Servlet容器。因为Servlet容器是Web容器的核心,
并且现代Java Web容器主要就是Servlet容器,实际开发中两者常被混用。

spring容器

定义: Spring 框架的核心,负责管理应用中所有对象的创建、依赖注入和生命周期。

职责:

  • 通过依赖注入(DI)管理 Bean 及其依赖关系
  • 支持 AOP、事务管理等
  • 读取配置(XML、注解或 Java Config)初始化 Bean

代表实现: BeanFactory(基础接口)、ApplicationContext(高级实现,如 AnnotationConfigApplicationContext 或 XmlWebApplicationContext)

特点: 完全独立于 Web 环境,可在任何 Java 应用中使用(桌面应用、微服务等)。

联系与区别

三者的关系可以简述为:Web容器(Servlet容器)包含并管理Web应用程序,而Web应用程序中运行着Spring IoC容器。

三者的包含关系如层级架构(从底层到上层)图所示:

graph LR A[Servlet 容器] --> B[Web 容器] B --> C[Web 应用程序] C --> D[Spring IoC 容器]

详细说明:

  1. Web 容器包含 Servlet 容器

    • Web 容器(如 Tomcat)内置了 Servlet 容器功能。
    • 启动时加载 web.xml(或 Servlet 3.0+ 注解),初始化 ServletContext。
  2. Web 容器托管 Spring Web 应用

    • 当部署 Spring Web 应用时,Web 容器会:
      1. 通过 ContextLoaderListener 初始化 根 Spring IoC 容器(管理 Service、DAO 等非 Web 组件)。
      2. 通过 DispatcherServlet 初始化 子 Spring IoC 容器(管理 Controller、拦截器等 Web 组件)。
  3. Spring IoC 容器运行在 Web 容器内

    • Spring 容器由 Web 容器触发启动(例如通过 ContextLoaderListener)。
    • Spring Bean 无法直接访问 Servlet API,但可通过 WebApplicationContext 获取 ServletContext。

交互流程示例
以 Tomcat 运行 Spring MVC 应用为例:

  1. Tomcat(Web 容器)启动时加载加载 WAR 文件,解析 web.xml,初始化 ServletContext。
  2. 初始化 Spring:ContextLoaderListener初始化 根Spring IoC容器(WebApplicationContext),加载 applicationContext.xml,管理 Service、DAO 等非 Web 组件。
  3. 初始化 DispatcherServlet:Tomcat 创建 DispatcherServlet 实例。 DispatcherServlet 初始化 子Spring IoC容器,加载 spring-mvc.xml,并关联根容器,管理 Controller、拦截器等 Web 组件。
  4. 当 Tomcat 接收到 HTTP 请求时,Servlet 容器(如 Tomcat)会将请求转发给 DispatcherServlet。
  5. DispatcherServlet 处理请求,查找并调用相应的 Controller 方法。
  6. Controller 方法中可能需要访问 Service 层,Service 层通过 WebApplicationContext 获取 Spring IoC 容器,调用相应的 Bean。
  7. 处理完成后,DispatcherServlet返回响应给 Servlet 容器。
  8. Servlet 容器将响应返回给客户端。
sequenceDiagram Tomcat->>DispatcherServlet: HTTP 请求 DispatcherServlet->>Controller: 调用匹配的 @Controller Controller->>Service: 业务逻辑处理 Service->>DAO: 访问数据库 DAO-->>Controller: 返回数据 Controller-->>DispatcherServlet: 返回 ModelAndView DispatcherServlet-->>Tomcat: 生成响应

注意:

  • Servlet 由 Web 容器管理,Spring 只能通过 ServletContext 间接交互。
  • Web 容器可独立运行纯 Servlet/JSP 应用,Spring 只是可选框架。

参考链接:

  1. Servlet/Tomcat/ Spring 之间的关系
posted @ 2025-07-05 00:01  joudys  阅读(48)  评论(0)    收藏  举报