第1章:JavaWeb基础概念

什么是JavaWeb?架构之间有哪些区别?

Java Web 定义:

  • JavaWeb是基于Java技术栈开发的Web应用的总称;
  • Web(World Wide Web,中文为万维网)是一种基于互联网的信息服务系统;
  • 核心是通过浏览器访问全球各地服务器上的资源;
  • 我们日常用浏览器刷网页,看新闻,在线工具都是用的web服务器;
  • 本质是java技术与web架构的结合,是企业级web应用开发的主流方向之一;
  • SpringMVC是基于Javaweb实现的。

|----------|-------------------------|------------------------|
| 对比维度 | C/S 架构(客户端 / 服务器) | B/S 架构(浏览器 / 服务器) |
| 客户端形式 | 专用软件(需安装,适配特定系统) | 通用浏览器(无需安装,跨设备兼容) |
| 开发维护成本 | 高(多平台开发,客户端逐个升级) | 低(仅维护服务器,升级同步所有用户) |
| 响应速度 | 快(本地处理部分逻辑,减少网络传输) | 较慢(依赖网络与服务器,高并发易卡顿) |
| 跨平台能力 | 差(不同系统需单独开发客户端) | 好(支持所有带浏览器的设备) |
| 典型应用 | 游戏客户端、专业工具(如 Photoshop) | 电商网站、在线文档、政务平台 |
| 用户使用门槛 | 高(需安装,对设备配置有要求) | 低(输入 URL 即可访问,低配置设备可用) |

Web工作的原理

第1步:用户发起请求(输入URL):在浏览器输入访问地址

  • 浏览器解析URL核心信息,协议,域名,资源路径。

第2步:域名解析(将域名转为IP地址):依赖DNS(域名系统)

  • 优先查询浏览器本地DNS缓存;
  • 如果本地没有缓存,查询路由器DNS缓存;
  • 仍无结果则向运营商DNS服务器发起查询;
  • 运营商DNS服务器向DNS服务器查询;

第3步:建立TPC连接:通过TPC协议建立可靠网络连接(三次握手 🤝

  • 客户端(浏览器)向服务器发生"请求连接"数据包;
  • 服务器接受后,返回"同意连接"数据包;
  • 客户端确认收到响应,发送"连接确认"数据包,TCP连接正式建立;

第4步:发送HTTP请求

  • 请求内容组成:
    • 请求方法:GET(获取首页 HTML 等资源)、POST(提交登录表单等数据);
    • 请求头:包含浏览器信息(如 Chrome 版本)、Cookie(登录状态)、期望响应格式(如 HTML、JSON);
    • 请求体:仅 POST 请求包含(如加密后的用户名、密码)。
  • HTTP定义
    • HTTP(HyperText Transfer Protocol,超文本传输协议)是应用层的核心协议
    • 用于客户端(如浏览器、Postman)与服务器之间传输超文本数据(HTML、图片、视频、JSON 等)
    • 是万维网(WWW)服务的基础。
    • 浏览器与服务器的通信全依赖 HTTP 协议
    • 它定义了 "请求该发什么""响应该怎么回" 的规则。

第5步:服务器处理请求并返回响应

  • 服务器协同处理流程:
    • 应用服务器(如 Nginx)解析请求(识别需返回首页资源);
    • 若需数据支撑(如首页推荐内容),应用服务器向数据库服务器发起查询;
    • 数据库服务器返回数据(如推荐新闻、图片链接);
    • 应用服务器生成响应内容(HTML 代码、CSS 样式、JS 脚本),经 HTTPS 加密后返回浏览器;
  • 响应内容组成:
    • 响应状态码:200(成功)、404(资源不存在)、500(服务器错误)等;
    • 响应头:包含服务器信息(如 Nginx 版本)、数据类型(text/html表示 HTML 页面)、缓存规则;
    • 响应体:核心资源(HTML 代码、图片二进制数据等)。

第6步:关闭TCP连接:浏览器没有请求其他资源,会发生四次挥手

  • 客户端发生"关闭连接"请求;
  • 服务器放回"准备关闭"响应,等待剩余数据传输;
  • 服务器确认无剩余数据,发生"关闭连接"请求;
  • 客户端返回"确认关闭"响应。TCP连接正式关闭;

第7步:浏览器解析并渲染页面

  • 解析 HTML:生成 DOM 树(描述页面结构,如标题、按钮位置);
  • 解析 CSS:生成 CSSOM 树(定义页面样式,如字体大小、颜色);
  • 结合 DOM 树与 CSSOM 树,生成渲染树(仅包含需显示的元素及样式);
  • 布局(Layout):计算渲染树中元素的位置和大小;
  • 绘制(Paint):根据布局结果将元素绘制到浏览器窗口(填充颜色、渲染图片);
  • 执行 JavaScript:运行页面 JS 脚本(如搜索框自动补全功能),动态修改页面内容(更新 DOM 树、发送异步请求)。

HTTP和HTTPS核心区别

HTTP 的明文传输存在 "窃听、篡改、伪造" 风险,HTTPS 通过 "TLS/SSL 加密" 解决此问题,两者核心区别如下:

|----------|-------------------|----------------------------|
| 对比维度 | HTTP | HTTPS |
| 默认端口 | 80 | 443 |
| 数据传输 | 明文(可被抓包工具直接查看) | TLS/SSL 加密(抓包仅见密文) |
| 安全性 | 低(无加密、无身份验证) | 高(加密 + 服务器身份验证,需 CA 证书) |
| 性能开销 | 无加密 / 解密开销,速度快 | 需 TLS 握手、加密 / 解密,性能略低(可优化) |
| 证书要求 | 无需证书 | 需 CA 机构颁发的 SSL 证书(免费 / 付费) |
| 适用场景 | 非敏感数据(如静态文档、内部系统) | 敏感数据(如登录、支付、电商、个人信息) |

HTTP消息结构-请求

什么是http消息结构?

  • HTTP 消息是客户端与服务器通信的 "数据载体"
  • 遵循 "起始行 + 头部字段 + 空行 + 消息体" 的格式(空行是必需的,用于分隔头部和消息体)

请求报文结构

  • 请求报文由客户端发送给服务器,格式如下:
    • 请求行(必需):定义请求方法、目标资源、HTTP版本
    • 请求头(可选):描述请求的元数据(键值对形式)
    • 空行(必需):标识请求头结束
    • 请求体(可选):携带请求数据(如表单、JSON,但get方法不推荐携带请求体,却没有严格禁止)

请求行详解

  • 格式:请求方法 + 请求URI + HTTP版本

  • 请求方法:定义对资源的操作(如 GET = 查询、POST = 提交);

  • 请求 URI:目标资源路径(如/api/user/index.html);

  • HTTP 版本:如HTTP/1.1(最常用)、HTTP/2、HTTP/3。

  • 示例:

    GET /user?page=1&size=10 HTTP/1.1 # GET请求:查询第1页用户,每页10条
    POST /api/login HTTP/1.1 # POST请求:提交登录数据

  • 使用浏览器开发者工具查看结构信息

常见请求头(核心元数据)

|------------------|---------------------------------------|--------------------------------------------------|
| 请求头字段 | 作用说明 | 示例 |
| Host | 服务器域名 + 端口(HTTP/1.1 必需,区分虚拟主机) | Host: example.com:8080 |
| User-Agent | 客户端身份(浏览器 / 设备信息,用于服务器适配) | User-Agent: Mozilla/5.0 (Windows NT 10.0; ...) |
| Accept | 客户端可接受的响应数据类型 | Accept: text/html, application/json |
| Content-Type | 请求体的数据类型(POST/PUT 时必需) | Content-Type: application/json |
| Content-Length | 请求体的字节长度(帮助服务器接收完整数据) | Content-Length: 56 |
| Cookie | 客户端存储的 Cookie(用于会话管理) | Cookie: sessionId=abc123; username=test |
| Connection | 是否复用 TCP 连接(HTTP/1.1 默认keep-alive ) | Connection: keep-alive |

请求体示例(POST/PUT 方法)

  • 表单数据格式(

    Content-Type: application/x-www-form-urlencoded

):text

复制代码
username=admin&password=123456&remember=true
  • JSON 格式(

    Content-Type: application/json

):json

复制代码
{
  "username": "admin",
  "password": "123456",
  "remember": true
}

HTTP消息结构-响应

响应报文结构

  • 响应报文由服务器返回给客户端,格式如下:text
    • 响应行(必需):定义HTTP版本、状态码、原因短语
    • 响应头(可选):描述响应的元数据(键值对形式)
    • 空行(必需):标识响应头结束
    • 响应体(可选):服务器返回的实际数据(如HTML、JSON)

响应行详解

  • 格式:HTTP版本 + 状态码 + 原因短语

  • 状态码:3 位数字,标识请求处理结果(如 200 = 成功、404 = 资源不存在);

  • 原因短语:状态码的文字描述(仅辅助理解,程序不依赖)。

  • 示例:text

    HTTP/1.1 200 OK # 请求成功
    HTTP/1.1 404 Not Found # 资源不存在
    HTTP/1.1 500 Internal Server Error # 服务器内部错误

常见响应头(核心元数据)

|------------------|--------------------------|----------------------------------------------|
| 响应头字段 | 作用说明 | 示例 |
| Content-Type | 响应体的数据类型 + 编码(客户端解析依据) | Content-Type: text/html; charset=UTF-8 |
| Content-Length | 响应体的字节长度 | Content-Length: 2048 |
| Server | 服务器软件信息(如 Web 服务器类型) | Server: Nginx/1.21.0 |
| Set-Cookie | 服务器向客户端写入 Cookie(会话管理) | Set-Cookie: sessionId=xyz789; Max-Age=3600 |
| Location | 重定向的目标 URL(配合 3xx 状态码使用) | Location: /login |
| Cache-Control | 缓存控制策略(如缓存有效期) | Cache-Control: max-age=86400 |
| Retry-After | 服务不可用时,建议重试的时间(秒,配合 503) | Retry-After: 3600 |

响应体示例

  • HTML 格式(

    Content-Type: text/html

):html

复制代码
<!DOCTYPE html>
<html>
  <head>
    <title>首页</title>
  </head>
  <body>
    <h1>欢迎访问HTTP协议讲解页面!</h1>
    <p>当前时间:2024-01-01 12:00:00</p>
  </body>
</html>
  • JSON 格式(

    Content-Type: application/json

):json

复制代码
{
  "code": 200,
  "message": "请求成功",
  "data": {
    "username": "admin",
    "role": "admin",
    "createTime": "2024-01-01"
  }
}

HTTP请求方法

HTTP 请求方法定义

  • HTTP 请求方法是客户端(如浏览器、APP、接口调用工具)向服务器发送请求时,声明 "请求目的" 的标准化指令
  • 它定义了客户端希望服务器对目标资源执行的操作(如 "获取资源""提交数据""更新信息")。
  • 作为 HTTP 协议的核心组成部分,请求方法的设计遵循 "语义化" 原则
    • 不同方法对应明确的操作含义,确保客户端与服务器之间的沟通统一、无歧义
    • 同时也影响服务器的处理逻辑(如缓存策略、数据修改权限)。

核心方法如下:

|------------|----------|-------------------------------------------------------|------------------------------|
| 请求方法 | 核心语义 | 关键特点 | 典型应用场景 |
| GET | 查询资源 | 1. 请求参数在 URL 中(可见);2. 无请求体;3. 幂等;4. 有 URL 长度限制(约 2KB) | 访问页面、查询列表(如/user?page=1 ) |
| POST | 提交资源(创建) | 1. 请求参数在请求体中(不可见);2. 非幂等;3. 无长度限制 | 表单提交、用户注册、登录 |
| PUT | 全量更新资源 | 1. 需提供资源的完整信息;2. 幂等;3. 覆盖式更新 | 全量修改用户信息(如PUT /user/1 ) |
| DELETE | 删除资源 | 1. 无请求体(或仅传辅助参数);2. 幂等 | 删除用户(DELETE /user/1 )、删除文章 |
| PATCH | 部分更新资源 | 1. 仅需提供需修改的字段;2. 幂等 | 仅更新用户手机号(PATCH /user/1 ) |
| HEAD | 获取资源头部 | 与 GET 一致,但无响应体(仅返回头信息) | 检查资源是否存在、获取缓存信息 |

关键概念:幂等性

  • 指 "多次执行相同请求,结果完全一致(无副作用)"。例如:GET 查询 100 次,结果相同;DELETE 删除 100 次,第一次删完后,后续 99 次仍返回 "删除成功"(无额外副作用)。

重点:GET 与 POST 的核心区别

|----------|-----------------------|------------------------|
| 对比维度 | GET | POST |
| 数据位置 | URL 参数(?key=value ) | 请求体(Form/JSON) |
| 安全性 | 明文传输(不安全,易被抓包) | 数据在请求体(相对安全,需配合 HTTPS) |
| 幂等性 | 幂等(适合查询) | 非幂等(适合提交) |
| 缓存支持 | 浏览器默认缓存(可通过头控制) | 默认不缓存 |
| 长度限制 | 受 URL 长度限制(约 2KB) | 无限制 |

HTTP状态码

什么是HTTP状态码?

  • HTTP 状态码(HTTP Status Code)是服务器对客户端(如浏览器、APP)发送的 HTTP 请求的响应状态标识
  • 由 3 位数字组成(范围 100-599)
  • 它的核心作用是:让客户端快速判断请求的处理结果(成功、失败、需要进一步操作等)
  • 无需解析响应体内容即可了解基本状态,同时为问题排查(如 "为什么页面打不开""为什么登录失败")提供明确方向。

HTTP 状态码分为 5 大类,每类代表不同的 "请求处理状态",开发中需重点掌握常用状态码:

|-----------|------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 状态码分类 | 核心含义 | 常用状态码及说明 |
| 1xx | 信息性(临时响应) | 100 Continue:服务器已接收请求头,客户端可继续发送请求体(多用于大文件 POST) |
| 2xx | 成功 | 200 OK:请求成功(最常用);201 Created:资源创建成功(如 POST 新增用户);204 No Content:请求成功但无响应体(如 DELETE) |
| 3xx | 重定向(需额外操作) | 301 Moved Permanently:永久重定向(如域名变更);302 Found:临时重定向(如未登录跳登录页);304 Not Modified:资源未修改,使用本地缓存 |
| 4xx | 客户端错误 | 400 Bad Request:请求语法错误(如 JSON 格式错);401 Unauthorized:未认证(未登录);403 Forbidden:权限不足(如普通用户访问管理员接口);404 Not Found:资源不存在(URL 错);405 Method Not Allowed:请求方法不允许(如用 POST 访问 GET 接口) |
| 5xx | 服务器错误 | 500 Internal Server Error:服务器内部错误(如代码 BUG);502 Bad Gateway:网关错误(如 Nginx 连不上 Tomcat);503 Service Unavailable:服务暂时不可用(如维护、负载过高);504 Gateway Timeout:网关超时(如 Tomcat 处理太慢) |

HTPP版本演进

HTTP 协议不断迭代,核心目标是 "提升性能、优化体验",各 HTTP 版本核心差异对比:

|----------|----------|-----------|-------------------------------------------------------------|------------|------------------|
| 版本 | 发布时间 | 核心传输层 | 关键特性 | 主要痛点 | 当前应用占比(2025) |
| HTTP/0.9 | 1991 | TCP | 仅 GET、纯 HTML、短连接 | 功能极简,无错误处理 | 0%(淘汰) |
| HTTP/1.0 | 1996 | TCP | 多方法、HTTP 头部、多媒体 | 短连接默认,无缓存 | <1%(老旧设备) |
| HTTP/1.1 | 1999 | TCP | 长连接、管道化、缓存机制 | 队头阻塞、头部冗余 | 40%-50% |
| HTTP/2 | 2015 | TCP | 二进制帧(拆分消息为二进制格式的小块)、多路复用(同时传输多个 HTTP 请求 / 响应)、HPACK(头部压缩算法) | TCP 队头阻塞 | 45%-55% |
| HTTP/3 | 2022 | UDP(QUIC) | 无队头阻塞、0-RTT、连接迁移 | 兼容性需完善 | 10%-20% |

关键问题:HTTP/1.1 的 "队头阻塞"

  • 指 "同一 TCP 连接中,前一个请求未完成,后续请求必须排队等待"------ 若前一个请求超时,后续所有请求都卡住。HTTP/2 的多路复用通过 "二进制帧拆分" 解决此问题。
相关推荐
郑洁文3 天前
基于Javaweb的高校网上订餐系统
javaweb·毕设·高校网上订餐系统
初学小白...1 个月前
JavaWeb
javaweb·web
一只大袋鼠1 个月前
SpringMVC 框架中的拦截器
java·springmvc·javaweb·拦截器
一只大袋鼠1 个月前
SpringMVC全局异常处理
java·开发语言·springmvc·javaweb
一只大袋鼠1 个月前
JavaWeb四种文件上传方式(下篇)
java·开发语言·springmvc·javaweb
一只大袋鼠1 个月前
JavaWeb四种文件上传方式(上篇)
java·开发语言·servlet·javaweb
abcnull1 个月前
传统的JavaWeb项目Demo快速学习!
java·servlet·elementui·vue·javaweb
float_com1 个月前
【JavaWeb】----- 登录认证 与 统一拦截架构详解
javaweb
float_com2 个月前
【JavaWeb】----- Linux基础入门
linux·javaweb
夹芯饼干2 个月前
JavaWeb 核心:Request 与 Response 对象全解析与实战
javaweb·重定向·request对象·response对象