当前位置: 首页 > article >正文

Servlet 快速入门

文章目录

    • 概念
    • SpringBoot 测试案例
    • 执行原理
      • 传统 Servlet
      • 在 SpringBoot (嵌入式 Tomcat + Spring MVC) 中请求从浏览器到业务代码的完整步骤
        • 关键点
        • 流程图
    • 参考

概念

运行在服务器端的小程序, Servlet 就是一个接口,定义 Java 类被浏览器访问到(Tomcat识别)的规则

SpringBoot 测试案例

创建简单的 SpringBoot 项目进行测试,首先创建 Java 空项目,根据 POM 配置文件构建简单的 SpringBoot 项目

    <dependencies><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.0.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>3.5.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>3.5.0</version></dependency></dependencies>

需要注意的是,如果是 Servlet5.0 以上需要 Jakarta EE 依赖,而 Servlet 4.0 及以下则需要 Java EE 依赖

Jakarta EE 依赖

<dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.0.0</version><scope>provided</scope>
</dependency>

Java EE 依赖

<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope>
</dependency>

创建 Servlet 测试类,抽象实现 Servlet 接口,添加 @WebServlet 注解并指定 URL 映射,使用 @WebServlet 注解声明了这个类为 Servlet,该注解会在部署时被容器处理,容器根据其具体的属性配置将相应的类部署为 Servlet。

@WebServlet 是 Servlet 3.0(Jakarta Servlet 3.0) 引入的注解,用来在 不写 web.xml 的情况下向 Servlet 容器注册一个 HttpServlet 子类。它与早期基于 web.xml 的 <servlet> / <servlet-mapping> 配置功能等价,但更符合 “约定优于配置” 的理念,能让一个普通 Java 类 就地声明 自己的元数据(名称、URL 映射、初始化参数等)并立刻生效。

@WebServlet("/demo")
public class ServletDemo implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}// 提供服务的方法@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("Hello Servlet!");}@Overridepublic String getServletInfo() {return "";}@Overridepublic void destroy() {}
}

在 SpringBoot 启动类中新增 @ServletComponentScan 注解,SpringBoot 会把所有带 @WebServlet@WebFilter@WebListener 的组件交给内置容器(Tomcat/Jetty/Undertow)自动注册。

@SpringBootApplication
@ServletComponentScan
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

当访问 /demo 接口时,会输出 Hello Servlet!

2025-06-03T14:59:21.629+08:00  INFO 76957 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path '/'
2025-06-03T14:59:21.633+08:00  INFO 76957 --- [           main] web.servlet.DemoApplication              : Started DemoApplication in 0.525 seconds (process running for 0.696)
Hello Servlet!

执行原理

传统 Servlet

  • 当服务器接收到客户端浏览器的请求后,会解析请求 URL 路径,获取访问 Servlet 的资源路径
  • 查找 web.xml 文件,是否找到对应的 <url-pattern> 标签体内容
  • 如果有,则在找到对应的 <servlet-class> 全类名
  • Tomcat 会将字节码文件加载到内容,并创建其对象
  • 调用其对应 service 方法

在 SpringBoot (嵌入式 Tomcat + Spring MVC) 中请求从浏览器到业务代码的完整步骤

  • 嵌入式 Tomcat 解析 HTTP 报文。RequestResponse 对象在 Tomcat 层创建后,仍按 Servlet 规范传递给下游组件
  • SpringBoot 没有 web.xml,在启动时自动向容器注册一个核心 Servlet —— DispatcherServlet,并将所有路径(/)映射给它(DispatcherServletRegistrationBean 完成注册)
  • DispatcherServlet 统一接管,后续 URL 再由 Spring 框架内部解析,而不是 Tomcat 直接查找其他 Servlet
  • Spring 容器在启动阶段就把 DispatcherServlet 作为 Bean 创建并交给 Tomcat;若使用 @WebServletServletRegistrationBean 等方式,还能额外注册自定义原生 Servlet
  • Tomcat 把 HttpServletRequest/Response 交给 DispatcherServlet.service()
  • 之后进入 Spring MVC 专属流程
    • HandlerMapping:根据 URI、HTTP 方法匹配到具体 @Controller / @RestController 的方法(Handler)
    • HandlerAdapter:选用合适的适配器(通常是 RequestMappingHandlerAdapter)调用该方法
    • 调用业务方法:参数解析、依赖注入、校验、AOP 切面等在这一层生效;方法返回值随后被包装成 ModelAndView 或直接写回 JSON
    • ViewResolver / HttpMessageConverter:将返回值渲染成 HTML、JSON、XML 等;最后写入 HttpServletResponse
关键点
  • 自动装配,DispatcherServletAutoConfiguration 在 SpringBoot 启动时运行
    • 创建 DispatcherServlet Bean
    • 把其 URL 映射(默认为 /)注册到嵌入式 Tomcat(或 Jetty/Undertow)
    • 允许通过 spring.mvc.servlet.path 修改前缀,或定义多个 ServletRegistrationBean 手动注册其他 Servlet
  • 过滤器与监听器
    • 使用 FilterRegistrationBean@WebFilter@ServletComponentScan 或 Spring Security 的 FilterChain 定义过滤器
    • 容器仍按 Servlet 规范的 FilterServletListener 次序执行,只是对象由 Spring 托管并可享受依赖注入与配置属性。
流程图
浏览器│
HTTP 请求│
嵌入式 Tomcat (解析协议、线程池)│
DispatcherServlet (统一入口)│
HandlerMapping → 找控制器│
HandlerAdapter → 解析参数 + AOP│
Controller 方法(业务逻辑)│
HttpMessageConverter / ViewResolver│
DispatcherServlet│
Tomcat 写回 HTTP 响应▼
浏览器

参考

  • Title Unavailable | Site Unreachable
http://www.lryc.cn/news/2398750.html

相关文章:

  • 【前端】CSS面试八股
  • [蓝桥杯]找到给定字符串中的不同字符
  • Redis底层数据结构之字典(Dict)
  • 佰力博科技与您探讨低温介电温谱测试仪的应用领域
  • ubuntu之开机自启frpc
  • 【办公类-48-04】202506每月电子屏台账汇总成docx-5(问卷星下载5月范围内容,自动获取excel文件名,并转移处理)
  • 对 `llamafactory-cli api -h` 输出的详细解读
  • 基于 ZYNQ UltraScale+ OV5640的高速图像传输系统设计,支持国产替代
  • demo_win10配置WSL、DockerDesktop环境,本地部署Dify,ngrok公网测试
  • TablePlus:一个跨平台的数据库管理工具
  • SQL Indexes(索引)
  • Axure 基础入门
  • 结构型设计模式之Decorator(装饰器)
  • HCIP-Datacom Core Technology V1.0_3 OSPF基础
  • 工作自动化——工作自动提炼--智能编程——仙盟创梦IDE
  • go语言学习 第 2 章:变量与数据类型
  • 大语言模型评测体系全解析(上篇):基础框架与综合评测平台
  • Spring Event(事件驱动机制)
  • Fisher准则例题——给定类内散度矩阵和类样本均值
  • MySQL数据库中INNODB表数据的备份与恢复
  • 振动分析师(ISO18436-2)四级能力矩阵 - 简介
  • 生产环境MYSQL常见锁表场景
  • 结构性设计模式之Composite(组合)
  • Java面试八股--04-MySQL
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(31):そう
  • 设计模式——访问者设计模式(行为型)
  • 实验设计与分析(第6版,Montgomery著,傅珏生译) 第10章拟合回归模型10.9节思考题10.1 R语言解题
  • 《对象创建的秘密:Java 内存布局、逃逸分析与 TLAB 优化详解》
  • LeetCode 高频 SQL 50 题(基础版) 之 【高级查询和连接】· 下
  • Java并发编程:读写锁与普通互斥锁的深度对比