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

Tomcat工作机制与Servlet流程详解

由于之前没有专门学过Tomcat,导致一直对前后端数据传输的过程不了解,最近的云图库项目正好多次用到了HttpServletRequest,就简单讲解一下Tomcat 的工作机制和 Servlet 规范。

我们举一个例子讲解整个流程:

示例场景

用户访问登录页面,输入用户名/密码后点击提交:

前端页面:http://localhost:8080/myapp/login.html 
后端接口:http://localhost:8080/myapp/login (POST)

完整流程详解

第一步:前端发起请求 (浏览器)
  1. 用户在浏览器填写表单:
   <form action="/myapp/login" method="POST"><input name="username" value="alice"><input name="password" type="password" value="p@ssw0rd"><button type="submit">登录</button></form>

  1. 点击提交按钮时,浏览器:
    • 构造 HTTP POST 请求
    • 请求行:POST /myapp/login HTTP/1.1
    • 请求头:
     Host: localhost:8080Content-Type: application/x-www-form-urlencodedCookie: JSESSIONID=1234abcd (如果存在)

  • 请求体:username=alice&password=p%40ssw0rd (URL编码)
第二步:Tomcat 接收请求 (网络层)
  • Tomcat 的 NIO 线程接收 TCP 数据包
  • 连接器(Http11NioProtocol)解析原始HTTP报文
  • 验证Host头匹配虚拟主机配置
第三步:创建 Servlet 容器对象

Tomcat 内部创建的关键对象

  • RequestFacade (HttpServletRequest实现类)
  • ResponseFacade (HttpServletResponse实现类)
第四步:路由到对应 Servlet

映射规则

  1. 匹配 Context Path:/myapp
  2. 映射 Servlet Path:/login → LoginServlet.class
第五步:Servlet 处理请求 (业务逻辑)
// 后端Servlet代码示例
public class LoginServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) {// 1. 获取请求参数String username = request.getParameter("username"); // "alice"String password = request.getParameter("password"); // "p@ssw0rd"// 2. 业务处理(数据库验证等)UserService userService = new UserService();boolean isValid = userService.authenticate(username, password);// 3. 构造响应if(isValid) {// 设置会话HttpSession session = request.getSession();session.setAttribute("user", username);// 重定向到主页response.sendRedirect("/myapp/home");} else {// 返回错误JSONresponse.setContentType("application/json");PrintWriter out = response.getWriter();out.print("{\"error\":\"无效凭证\"}");}}
}

第六步:Tomcat 发送响应

实际发送的响应示例:

HTTP/1.1 302 Found
Location: http://localhost:8080/myapp/home
Set-Cookie: JSESSIONID=5678efgh; Path=/myapp; HttpOnly
Content-Length: 0

第七步:浏览器处理响应
  1. 收到302重定向响应:
    • 自动发起新请求:GET /myapp/home
  2. 存储Cookie:
    • 后续请求自动携带:Cookie: JSESSIONID=5678efgh
  3. 渲染最终页面

关键对象在内存中的状态

阶段HttpServletRequest 内容HttpServletResponse 内容
创建后method="POST"parameters={username:"alice",...}cookies=[...]status=200headers={}
Servlet处理中新增:request.getSession()设置:status=302header[Location]="/myapp/home"
响应前所有数据冻结转换为字节流

完整流程总结

  1. 前端:构造HTTP请求(含表单数据)
  2. Tomcat网络层:接收并解析原始字节流
  3. Tomcat容器:创建Request/Response对象
  4. 路由:根据URL映射到对应Servlet
  5. Servlet:执行业务逻辑(核心处理阶段)
  6. 响应构建:设置状态码/头信息/响应体
  7. Tomcat:转换对象为HTTP响应报文
  8. 浏览器:处理响应并渲染结果
精确表述就是:

Tomcat 是一个实现了 Java Servlet 规范的 Servlet 容器。当客户端发送一个 HTTP 请求到部署在 Tomcat 上的 Web 应用时,Tomcat 解析该请求,创建代表该请求的 HttpServletRequest 对象和代表响应的 HttpServletResponse 对象。然后,Tomcat 根据配置找到负责处理该请求的 Servlet(或 Filter 链),并调用其 service() 方法(或相应的 doXxx() 方法),将 HttpServletRequestHttpServletResponse 对象作为参数传递进去。

关键点澄清:
  • “后端”是谁? 在 Servlet 模型中,处理请求的核心业务逻辑(你编写的 Java 代码)就是运行在 Servlet 容器(Tomcat)内部的 Servlet。Tomcat 本身既是容器也是运行环境。所以“传递给后端”实质上是传递给容器内由你编写的特定 Servlet 实例。
  • ServletRequest vs HttpServletRequest: HttpServletRequest 是 ServletRequest 的子接口,专门用于 HTTP 协议。Tomcat 创建并提供的是 HttpServletRequest 对象。
  • Tomcat 不止是容器: 虽然 Servlet 容器是其核心,现代的 Tomcat 也内置了一个功能完善的 HTTP Web 服务器,能够直接处理 HTTP(S) 连接。它还支持 JSP 等其他规范。

💡 关键点:Tomcat作为桥梁将原始网络请求转化为Java对象(HttpServletRequest),业务处理完成后,再将Java对象(HttpServletResponse)转化回网络响应。

http://www.dtcms.com/a/392765.html

相关文章:

  • Netty从0到1系列之Recycler对象池技术【1】
  • 开始 ComfyUI 的 AI 绘图之旅-SD3.5文生图和图生图(全网首发,官网都没有更新)(十五)
  • [数理逻辑] 决定性公理与勒贝格可测性 (III) 有限维情况
  • 浅谈 “混合检索”和“重排”
  • 计算机视觉与深度学习 | 基于Matlab的雾霾天气和夜间车牌识别系统关键技术与架构设计
  • 二、PyTorch张量学习教程:从小白到高手的实战之旅
  • 名字空间,异常与匿名函数
  • DCM项目wan 1.3b T2V模型comfyui改造流程尝试
  • python编写的第一个appium自动化测试脚本
  • 道客巴巴文库资料免费下载的方法(不需要第三方软件)
  • 【C++】STL详解(九)—priority_queue的使用与模拟实现
  • 【车载开发系列】了解FlashDriver
  • 轻量化 AI 算法:开启边缘智能新时代
  • sward入门到实战(3) - 如何管理文档
  • 贝叶斯优化(Bayesian Optimization)实战:超参数自动搜索的黑科技
  • CSP-S2025 第一轮试题(附答案)
  • python ipynb中运行 报错rpy2 UsageError: Cell magic `%%R` not found.,原因是命令行要用raw的格式
  • 蓝耘智算与DeepSeekR1:低成本高能AI模型
  • Shimmy,超越ollama?
  • LeetCode:36.二叉树的中序遍历
  • python开发环境VSCode中隐藏“__pycache__”目录实践
  • Chrome View渲染机制学习小记
  • C# Protobuf oneof、包装器类型、枚举命名与服务支持
  • 智慧消防:科技赋能,重塑消防安全新生态
  • AI人工智能训练师五级(初级)实操模拟题
  • [数理逻辑] 决定性公理与勒贝格可测性(I) 基础知识
  • Java面向对象之多态
  • 量子计算学习续(第十五周周报)
  • Docker 入门与实践:从零开始掌握容器化技术
  • 个人用户无公网 IP 访问群晖 NAS:神卓 N600 的安全便捷方案(附踩坑经验)