Tomcat由浅入深:从零搭建Spring Boot内嵌Tomcat应用(附避坑指南)

视频看了几百小时还迷糊?关注我,几分钟让你秒懂!


一、为什么我们要学 Tomcat?

在 Java Web 开发中,Tomcat 是最常用、最轻量的 Servlet 容器。它不仅能独立运行 Web 应用,还能被Spring Boot 内嵌使用,省去部署 WAR 包的繁琐步骤。

📌 真实需求场景

假设你正在开发一个后台管理系统,需要提供 RESTful 接口供前端调用。你不想花时间配置 Nginx + 外部 Tomcat,只想“写完代码直接运行”,那么 Spring Boot + 内嵌 Tomcat 就是你的最佳选择!


二、Tomcat 是什么?能干啥?

  • 本质:一个开源的Java HTTP 服务器 + Servlet 容器
  • 作用
    • 接收 HTTP 请求(如GET /api/user
    • 调用对应的 Java 类(Servlet 或 Controller)
    • 返回响应(JSON、HTML 等)
  • Spring Boot 默认内嵌 Tomcat,启动时自动启动 Web 服务

✅ 优势:无需单独安装 Tomcat,打包成 JAR 直接运行!


三、动手实战:用 Spring Boot 快速跑起一个内嵌 Tomcat 服务

1️⃣ 创建 Spring Boot 项目(Maven)

<!-- pom.xml --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> </parent> <dependencies> <!-- Web Starter 自动引入内嵌 Tomcat --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>

💡 注意:spring-boot-starter-web默认依赖tomcat-embed-core,无需额外配置!


2️⃣ 编写一个简单 Controller

// UserController.java package com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @GetMapping("/hello") public String sayHello() { return "Hello from embedded Tomcat!"; } }

3️⃣ 启动主类

// DemoApplication.java package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }

4️⃣ 运行 & 测试

终端执行:

mvn spring-boot:run

浏览器访问:
👉 http://localhost:8080/hello

✅ 输出:Hello from embedded Tomcat!

🎉 恭喜!你已经成功运行了一个基于内嵌 Tomcat 的 Spring Boot 应用!


四、自定义 Tomcat 配置(端口、线程数等)

虽然默认配置够用,但生产环境常需调整。

✅ 正确做法:通过application.yml配置

# application.yml server: port: 9090 # 修改端口 tomcat: max-threads: 200 # 最大工作线程数 min-spare-threads: 10 # 最小空闲线程 connection-timeout: 5000 # 连接超时(毫秒)

🔍 原理:Spring Boot 会自动将这些配置注入到内嵌的 Tomcat 实例中。


五、反例警告 ❌ —— 新手常犯的错误

❌ 反例1:手动 new Tomcat 实例(完全没必要!)

// 错误示范!不要这样做! public class BadExample { public static void main(String[] args) throws Exception { Tomcat tomcat = new Tomcat(); tomcat.setPort(8080); // ... 手动添加 Context、Servlet... tomcat.start(); tomcat.getServer().await(); } }

⚠️ 问题:绕过 Spring Boot 自动配置,失去 AOP、事务、Bean 管理等核心能力!


❌ 反例2:在webapps目录放文件(内嵌模式不生效!)

很多教程教你在外部 Tomcat 的webapps放 WAR 包,但在Spring Boot 内嵌模式下,这个目录根本不存在

✅ 正确做法:所有资源通过 Spring 的@RestControllerstatic/目录提供。


❌ 反例3:试图修改server.xml(内嵌 Tomcat 没有这个文件!)

内嵌 Tomcat 的配置全部通过 Java 或 YAML 完成,没有conf/server.xml

若真需深度定制(如加 Valve),应通过TomcatServletWebServerFactory编程式配置。


六、高级技巧:如何替换内嵌 Tomcat?

虽然 Tomcat 是默认容器,但你也可以换成 Jetty 或 Undertow:

<!-- 排除 Tomcat,引入 Jetty --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>

💡 适用场景:微服务追求极致启动速度(Jetty 更轻量)


七、注意事项总结 ⚠️

事项说明
不要混用外部 Tomcat 和内嵌 TomcatSpring Boot 默认内嵌,除非明确要打 WAR 部署
静态资源放src/main/resources/static/不要试图模仿传统webapps结构
配置优先用application.yml而非硬编码或 XML
生产环境务必调优线程池默认max-threads=200,高并发需评估
日志看logs/spring.log或控制台内嵌 Tomcat 不生成catalina.out

八、结语

Tomcat 并不神秘——在 Spring Boot 时代,它只是一个“藏在背后的引擎”。你只需专注业务逻辑,剩下的交给框架!

视频看了几百小时还迷糊?关注我,几分钟让你秒懂!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1154402.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI骨骼检测用于体感游戏?交互系统搭建部署案例

AI骨骼检测用于体感游戏&#xff1f;交互系统搭建部署案例 1. 技术背景与应用场景 随着人工智能在计算机视觉领域的深入发展&#xff0c;人体姿态估计&#xff08;Human Pose Estimation&#xff09;已成为智能交互、虚拟现实、健身指导和体感游戏等场景的核心技术之一。传统…

基于SpringBoot的高校疫情防控web系统毕设

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在开发并实现一个基于SpringBoot的高校疫情防控Web系统&#xff0c;以满足当前疫情防控背景下高校管理工作的实际需求。具体研究目的如下&#xff1a;提…

AI人体骨骼检测精度测试:不同光照条件下的表现对比

AI人体骨骼检测精度测试&#xff1a;不同光照条件下的表现对比 1. 引言&#xff1a;AI 人体骨骼关键点检测的现实挑战 随着计算机视觉技术的快速发展&#xff0c;人体骨骼关键点检测&#xff08;Human Pose Estimation&#xff09;已成为智能健身、动作捕捉、虚拟试衣、安防监…

基于Matlab的音乐数字均衡器设计设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)

基于Matlab的音乐数字均衡器设计设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09; Matlab源文件设计报告

惊艳!用腾讯混元模型实现的实时会议同传案例展示

惊艳&#xff01;用腾讯混元模型实现的实时会议同传案例展示 1. 引言 在全球化协作日益紧密的今天&#xff0c;跨语言沟通已成为企业、教育机构和国际组织的核心需求。尤其是在远程会议、跨国直播和学术交流等场景中&#xff0c;传统的人工同声传译成本高昂、资源稀缺&#x…

基于SpringBoot的高校科研信息管理系统毕业设计

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于SpringBoot的高校科研信息管理系统&#xff0c;以满足高校科研工作的信息化需求。具体研究目的如下&#xff1a; 首先&#xff0c;…

UDS协议基础概念图解说明:小白也能看懂的教程

UDS协议入门图解&#xff1a;从零理解汽车诊断通信你有没有想过&#xff0c;当你的爱车仪表盘亮起“发动机故障灯”&#xff0c;4S店的技师是如何在几分钟内精准定位问题的&#xff1f;背后支撑这套高效诊断系统的&#xff0c;正是我们今天要讲的主角——UDS协议。别被名字吓到…

人脸识别打码一体化:AI卫士完整解决方案

人脸识别打码一体化&#xff1a;AI卫士完整解决方案 1. 引言&#xff1a;隐私保护的智能防线 随着社交媒体和数字影像的普及&#xff0c;个人面部信息暴露的风险日益加剧。一张未经处理的合照可能在不经意间泄露多人的生物特征数据&#xff0c;带来潜在的隐私安全隐患。传统的…

AI骨骼关键点检测如何提升精度?33关节点定位调优实战

AI骨骼关键点检测如何提升精度&#xff1f;33关节点定位调优实战 1. 引言&#xff1a;AI人体骨骼关键点检测的挑战与价值 随着计算机视觉技术的快速发展&#xff0c;人体骨骼关键点检测&#xff08;Human Pose Estimation&#xff09;已成为智能健身、动作捕捉、虚拟试衣、康…

ES集群健康状态维护:运维日常检查操作指南

Elasticsearch集群健康维护实战&#xff1a;从日常巡检到面试应对的完整指南你有没有遇到过这样的场景&#xff1f;凌晨三点&#xff0c;监控系统突然弹出一条红色告警——Elasticsearch 集群状态变红。登录 Kibana 一看&#xff0c;几十个分片未分配&#xff0c;搜索请求开始超…

【CMAQ 模型 UG_ch13】WRF-CMAQ 模型概述

WRF-CMAQ 模型概述-目录13.1 简介&#xff1a;WRF-CMAQ模型的动机与设计13.2 气溶胶的直接辐射反馈作用13.3 应用与评估&#xff1a;模型验证与长期趋势模拟13.4 最新版 WRF-CMAQ 信息13.5 WRF-CMAQ 基准测试案例13.6 WRF-CMAQ 配置参数&#xff08;namelist&#xff09;详解参…

基于SpringBoot的高校竞赛管理系统毕业设计源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于SpringBoot的高校竞赛管理系统&#xff0c;以满足高校竞赛活动的管理需求。具体研究目的如下&#xff1a;提高竞赛管理效率&#x…

基于LCL型三相并网逆变器的准PR控制Simulink仿真代做(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)

simulink仿真代做(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09; 基于LCL型三相并网逆变器的准PR控制Simulink仿真代做(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09; 本人985博士&#xff0c;全职接单&#xf…

Multisim下载后仿真运行卡顿?教学环境调优建议

Multisim卡顿别头疼&#xff0c;教学机房调优实战指南 你是不是也遇到过这种情况&#xff1a;好不容易在教学机房统一完成了 Multisim下载 安装&#xff0c;结果一打开软件&#xff0c;启动慢得像老牛拉车&#xff1b;学生刚画完一个RC电路&#xff0c;点“仿真”按钮却卡住不…

Realtek音频驱动无法启动?操作指南详解

Realtek音频驱动启动失败&#xff1f;一文搞懂底层机制与实战修复 你有没有遇到过这样的情况&#xff1a;电脑突然没声音了&#xff0c;设备管理器里“Realtek High Definition Audio”旁边挂着个黄色感叹号&#xff0c;提示“这个设备不能启动&#xff08;代码10&#xff09;…

从0开始学AI编程:IQuest-Coder-V1新手入门教程

从0开始学AI编程&#xff1a;IQuest-Coder-V1新手入门教程 随着大模型在代码生成与软件工程领域的深入应用&#xff0c;新一代代码大语言模型 IQuest-Coder-V1 正在成为开发者手中的“智能编程助手”。本文将带你从零开始&#xff0c;全面掌握如何部署和使用 IQuest-Coder-V1-…

MediaPipe Pose性能优化:毫秒级处理背后的算力适配逻辑

MediaPipe Pose性能优化&#xff1a;毫秒级处理背后的算力适配逻辑 1. 引言&#xff1a;AI人体骨骼关键点检测的现实挑战 随着AI在健身指导、虚拟试衣、动作捕捉等场景中的广泛应用&#xff0c;实时人体姿态估计已成为智能交互系统的核心能力之一。然而&#xff0c;在边缘设备…

默认参数与解构赋值结合用法:操作指南

如何优雅地处理复杂参数&#xff1f;JavaScript 中默认值与解构的黄金组合你有没有写过这样的代码&#xff1f;function createModal(options) {const title options.title || 提示;const content options.content || ;const showClose options.showClose undefined ? tru…

单相二重化逆变电路(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)

单相二重化逆变电路(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09; 仿真原理图波形图 Matlab设计报告资料

MediaPipe Pose部署指南:WebUI开发与集成教程

MediaPipe Pose部署指南&#xff1a;WebUI开发与集成教程 1. 引言 1.1 AI 人体骨骼关键点检测的现实需求 在智能健身、虚拟试衣、动作捕捉与人机交互等前沿应用中&#xff0c;人体姿态估计&#xff08;Human Pose Estimation&#xff09;已成为不可或缺的核心技术。传统的姿…