HTTP协议是JavaWeb开发的核心基础,Servlet/JSP的本质就是按照HTTP协议规范,处理客户端的HTTP请求、生成HTTP响应。掌握HTTP协议,是理解Web交互逻辑、排查Web程序报错的核心前提,也是后续学习Servlet、Cookie/Session的必备基础。
1 HTTP协议简介
1.1 核心定义
HTTP(HyperText Transfer Protocol,超文本传输协议)是应用层的标准化通信协议,规范了浏览器(客户端)与Web服务器(Servlet容器,如Tomcat)之间的通信规则,核心是约定了客户端与服务端之间传输数据的格式(即HTTP报文格式)。
其中,客户端发送给服务器的称为请求报文,服务器返回给客户端的称为响应报文。
1.2 发展历程(JavaWeb开发核心关注HTTP/1.1)
HTTP/0.9(1991):HTTP原型版本,仅支持GET请求,仅能传输HTML文本,已完全淘汰。
HTTP/1.0(1996):新增POST、HEAD请求方法,支持请求/响应头、多类型内容传输;核心缺陷是每次请求都需新建TCP连接,性能低下。
HTTP/1.1(1997,RFC 2616,JavaWeb开发主流标准):
是Tomcat等Servlet容器默认支持的核心版本,核心改进如下:
持久连接(keep-alive):单个TCP连接可处理多个HTTP请求/响应,大幅降低连接开销;
虚拟主机支持:单IP可部署多个Web应用,对应Tomcat的Host配置;
完善的缓存控制机制;
新增OPTIONS、PUT、DELETE等标准请求方法,适配后续RESTful开发。
HTTP/2(2015):基于二进制帧,支持多路复用、头部压缩,性能大幅优化,Servlet 4.0+规范已兼容。
HTTP/3(2021):基于QUIC协议(UDP传输),进一步降低延迟、提升可靠性,主流云厂商与浏览器已支持。
1.3 HTTP协议核心特性(JavaWeb开发必须掌握)
这部分是后续Servlet、Cookie/Session技术的前置理论,为核心重点:
请求-响应模型:一次完整的HTTP通信,必须由客户端主动发起请求,服务器接收后处理并返回响应,无请求则无响应。
无连接特性:HTTP/1.0默认每次请求新建连接,处理完成立即断开;HTTP/1.1默认开启持久连接,可配置连接超时时间。
无状态特性:协议本身不记录客户端的历史请求信息,每次请求都是完全独立的。这是JavaWeb中Cookie、Session技术的核心设计背景——用于解决HTTP无状态带来的会话保持问题。
1.4 HTTP通信完整流程
简化为4个核心步骤,贴合Tomcat与JavaWeb的实际运行逻辑:
建立TCP连接:客户端根据URL的IP+端口,与服务器(Tomcat)建立TCP连接(HTTP默认端口80,Tomcat默认端口8080);
发送请求报文:客户端按照HTTP规范,向服务器发送请求报文;
处理请求并返回响应:Tomcat接收请求,交由对应Servlet处理业务逻辑,生成并返回响应报文;
关闭/复用连接:HTTP/1.1默认复用持久连接,超时后自动断开。
3.1.5 调试工具:浏览器F12开发者工具
所有主流浏览器均支持F12开发者工具,其中【网络(Network)】面板是JavaWeb开发调试的核心工具,可抓取、查看完整的请求/响应报文、状态码、请求参数、响应内容等。
例如:访问http://localhost:8080/05_web_tomcat/login.html出现“URL拼写可能存在错误”报错时,可通过该面板查看请求URL是否正确、响应状态码是否为404,快速定位问题。
2 HTTP请求与响应报文(核心重点,对应Servlet API)
【前置说明】JavaWeb中,HttpServletRequest对象就是对HTTP请求报文的完整封装,HttpServletResponse对象就是对HTTP响应报文的完整封装。掌握报文结构,就能直接理解Servlet中对应API的设计逻辑。
2.1 报文通用结构
HTTP报文分为报文首部和报文主体,两者通过一个空行分隔:
报文首部:包含请求/响应的控制信息,分为「行」和「头」两部分;
报文主体:传输的业务数据(如表单参数、HTML页面、JSON数据等)。
2.2 请求报文(客户端→服务器,对应HttpServletRequest)
1. 请求报文完整结构
请求行
请求头
空行
请求体
2. 各部分详解(绑定Servlet对应API)
-
① 请求行:请求报文的第一行,固定格式为
请求方式 资源路径 协议/版本
示例:GET /05_web_tomcat/login.html HTTP/1.1
核心字段与Servlet API对应关系:
请求方式:
request.getMethod()资源路径:
request.getRequestURI()/request.getRequestURL()协议版本:
request.getProtocol()② 请求头:键值对格式,携带客户端环境信息、请求配置等,每行一个头信息
仅保留JavaWeb开发高频使用的请求头,如下表:
| 请求头 | 核心含义 | 对应Servlet API |
|---|---|---|
| Host | 请求的服务器域名/IP+端口 |
request.getServerName() / request.getServerPort()
|
| Connection | 连接控制(keep-alive/close) | request.getHeader("Connection") |
| Content-Type | 请求体的数据类型(POST请求必填) | request.getContentType() |
| Content-Length | 请求体的字节长度 | request.getContentLength() |
| Referer | 请求的来源页面地址(防盗链、跳转回退) | request.getHeader("Referer") |
| User-Agent | 客户端(浏览器)的系统、版本信息 | request.getHeader("User-Agent") |
| Cookie | 客户端携带的Cookie数据 | request.getCookies() |
③ 空行:分隔请求头与请求体,标识请求头传输结束
④ 请求体:仅POST/PUT等请求存在,GET请求无请求体;用于传输客户端提交的业务数据(如表单参数、文件、JSON等)
对应Servlet API:request.getInputStream() / request.getReader() / request.getParameter()
3. 核心请求方式:GET与POST(JavaWeb开发最常用,表单提交核心)
| 特性 | GET请求 | POST请求 |
|---|---|---|
| 参数位置 | 拼接在URL后,格式为url?name1=value1&name2=value2,地址栏可见 |
放在请求体中,地址栏不可见 |
| 安全性 | 低,参数直接暴露,不可传输敏感数据 | 相对更高,参数不直接暴露 |
| 数据限制 | 受浏览器地址栏长度限制(一般约4KB),仅能传输文本 | 无长度限制,支持文本、二进制文件等 |
| 请求体 | 无请求体 | 有请求体,需配合Content-Type指定数据格式 |
| 缓存特性 | 浏览器默认会缓存 | 浏览器默认不缓存 |
| 开发场景 | 页面跳转、数据查询、无敏感信息的简单参数传递 | 表单提交、文件上传、敏感数据传输、数据增删改操作 |
提示:HTML表单默认提交方式为GET,需手动设置method="post"才会使用POST请求;Servlet中需通过doGet()/doPost()方法分别处理对应请求,方法不匹配会抛出405状态码错误。
2.3 响应报文(服务器→客户端,对应HttpServletResponse)
1. 响应报文完整结构
响应行
响应头
空行
响应体
2. 各部分详解(绑定Servlet对应API)
-
① 响应行:响应报文的第一行,固定格式为
协议/版本 状态码 状态描述
示例:HTTP/1.1 200 OK
核心字段与Servlet API对应关系:
状态码:
response.setStatus(int sc)协议版本:由Servlet容器自动设置,可通过
response.getProtocol()获取② 响应头:键值对格式,携带服务器的响应配置、数据信息等,每行一个头信息
仅保留JavaWeb开发高频使用的响应头,如下表:
| 响应头 | 核心含义 | 对应Servlet API |
|---|---|---|
| Content-Type | 响应体的数据类型与编码(浏览器据此解析内容) | response.setContentType() |
| Content-Length | 响应体的字节长度 | response.setContentLength() |
| Location | 重定向的目标地址(配合302状态码使用) |
response.sendRedirect() 底层依赖此头 |
| Set-Cookie | 服务器向客户端写入Cookie | response.addCookie() |
| Cache-Control | 缓存控制策略 | response.setHeader("Cache-Control", "...") |
| Server | 服务器信息(如Tomcat版本) | 由Servlet容器自动设置 |
③ 空行:分隔响应头与响应体,标识响应头传输结束
④ 响应体:服务器返回的核心数据,浏览器会根据Content-Type解析渲染,如HTML页面、图片、JSON、文件等
对应Servlet API:response.getOutputStream() / response.getWriter()
3. 核心响应状态码(JavaWeb开发高频必掌握)
HTTP状态码为3位数字,首位代表响应类别,高频核心状态码如下:
| 状态码 | 核心含义 | 开发场景说明 |
|---|---|---|
| 200 OK | 请求成功 | 正常访问页面、接口成功,服务器已正常返回数据 |
| 302 Found | 临时重定向 | Servlet中response.sendRedirect()的默认状态码,服务器要求客户端发起新的请求 |
| 304 Not Modified | 资源未修改 | 客户端使用本地缓存的资源,服务器未返回新内容 |
| 400 Bad Request | 请求语法错误 | 请求参数格式错误、请求体格式异常,服务器无法解析 |
| 404 Not Found | 请求资源不存在 | 最常见报错之一,如URL拼写错误、项目未部署、资源路径错误、Servlet路径配置错误,对应本次案例中“URL拼写可能存在错误”的报错 |
| 405 Method Not Allowed | 请求方法不允许 | Servlet中未实现对应请求方法(如表单用POST提交,但Servlet仅重写了doGet()) |
| 500 Internal Server Error | 服务器内部错误 | 服务器端代码运行异常,如Servlet中抛出空指针、SQL异常等,是后端代码报错的核心标识 |
提示:其他状态码可在开发中按需查阅,入门阶段优先掌握以上高频状态码,即可解决绝大多数Web程序调试问题。
【本章与后续JavaWeb内容的衔接】
后续学习的Servlet,本质就是Tomcat完成以下流程:
接收客户端的HTTP请求报文,封装为
HttpServletRequest对象;根据请求路径,调用对应Servlet的
doGet()/doPost()方法处理业务逻辑;开发者通过
HttpServletResponse对象,封装生成符合HTTP规范的响应报文,由Tomcat返回给客户端。
(注: )