概念
概念
静态Web: 数据不会改变,已经很少使用
动态Web:数据动态改变,几乎所有现代网站都是动态的,需要Servlet/Jsp、Asp、PHP等技术支持
JavaWeb是动态Web开发技术的统称
Web应用由html、css、js、jsp/servlet、java程序、jar/war包、配置文件等组成,由服务器统一管理
静态Web
文件类型
.html、.htm
特点
页面内容固定不变
无法与数据库交互(数据无法持久化)
可以通过 JavaScript 实现伪动态效果
动态Web
技术支撑
Servlet、JSP、PHP、ASP、Node.js 等
特点
页面内容可根据用户请求动态变化
支持与数据库交互,实现数据持久化
后台更新后需重新部署
支持复杂功能(登录、权限控制、支付等)
常见Web技术
ASP | 微软 | 微软开发、在HTML脚本中嵌入VB脚本,代码量庞大,页面混乱,难以维护 |
PHP | 开源 | 快速开发、语法灵活、跨平台,适合中小型网站、无法承载大流量访问 |
JSP/Servlet | Sun / Oracle | 基于 Java,支持高并发、可扩展性强,适合大型项目 |
常见Web服务器
IIS | 微软 | 支持 ASP,Windows 系统常用 |
Apache HTTP Server | Apache 基金会 | 主要用于静态资源服务,常配合 Tomcat 使用 |
Tomcat | Apache 基金会 | 轻量级 Servlet 容器,免费开源,适合中小型 JavaWeb 项目 |
Jetty | Eclipse 基金会 | 更轻量,嵌入式部署友好 |
WebLogic | Oracle | 重量级 Java EE 服务器,企业级应用 |
Nginx | 开源 | 高性能反向代理服务器,常用于负载均衡和静态资源服务 |
服务器是被动操作的,处理用户请求并返回响应信息
Web架构
C/S 架构 | Client/Server | 客户端+服务器,需要安装客户端软件(如 QQ、微信) |
B/S 架构 | Browser/Server | 浏览器+服务器,无需安装客户端,通过浏览器访问(如淘宝、百度) |
B/S 架构是当前主流 Web 应用架构
网络协议
HTTP
超文本传输协议,是一个简单的请求响应型应用层协议,基于TCP(传输控制协议),数据明文传输,默认端口为80
HTTPS
HTTPS 是 HTTP 的安全版本,通过 SSL(Secure Sockets Layer)或 TLS(Transport Layer Security)加密技术为网络通信提供安全保障,默认端口为443
HTTP/1.0
短连接:每个HTTP请求都需要单独建立TCP连接,完成之后立即关闭连接。这种方式增加了网络延迟,因为每次请求都需要经历三次握手过程。
HTTP/1.1
长连接:引入了持久连接(Persistent Connection),允许在一个TCP连接上发送多个请求和接收多个响应,从而减少了重复建立连接的时间消耗。 管道化:支持请求管道化,即客户端可以在不等待前一个响应的情况下连续发送多个请求,不过服务器仍然按顺序响应这些请求。
HTTP请求
请求行 | 包括请求方法(如GET, POST)、请求URI、HTTP版本 | GET /index.html HTTP/1.1 |
请求头 | 提供关于请求的元数据,如客户端类型、可接受的内容类型等 | Host: www.example.com , User-Agent: Mozilla/5.0 等 |
空行 | 标识头部结束,消息体开始 | (\r\n ) |
消息体 | 可选,通常用于POST或PUT请求中携带的数据 | 表单数据、JSON、XML等 |
请求头
Accept |
客户端可处理的内容类型(如 text/html , application/json )。 |
Accept-Charset |
客户端接受的字符集编码(如 utf-8 , iso-8859-1 )。 |
Accept-Encoding |
指定客户端能够理解的内容编码方式(如 gzip , deflate )。 |
Accept-Language |
客户端希望接收的语言版本(如 en-US , zh-CN )。 |
Authorization |
用于身份验证的信息(通常配合服务端的认证机制使用)。 |
Cache-Control |
控制缓存的行为(如 no-cache , max-age=3600 )。 |
Connection |
控制网络连接的行为(如 keep-alive , close )。 |
Content-Length |
请求体的长度(字节)。 |
Content-Type |
请求体的数据类型(如 application/x-www-form-urlencoded , multipart/form-data )。 |
Cookie |
存储在客户端并随请求发送到服务器的cookie数据。 |
Host |
目标主机和端口号。 |
If-Modified-Since |
只有当资源自指定日期以来被修改时才返回资源内容。 |
Referer |
发出请求的页面URL。 |
User-Agent |
发送请求的客户端信息(包括浏览器类型、操作系统等)。 |
HTTP响应
状态行 | 包括HTTP版本、状态码及描述 | HTTP/1.1 200 OK |
响应头 | 提供关于响应的元数据,如内容类型、长度、缓存控制等 | Content-Type: text/html; charset=UTF-8 , Content-Length: 1024等 |
空行 | 标识头部结束,消息体开始 | (\r\n ) |
消息体 | 可选,通常包含返回给客户端的实际内容 | HTML文档、图片、JSON数据等 |
响应头
Content-Length |
响应体的大小(字节)。 |
Content-Type |
响应体的数据类型(如 text/html; charset=UTF-8 , application/json )。 |
Content-Encoding |
内容编码格式(如 gzip , deflate )。 |
Content-Disposition |
提供有关如何处理响应内容的建议(如 attachment; filename="filename.jpg" )。 |
Cache-Control |
指示是否可以缓存响应及如何缓存(如 public , private , no-store )。 |
Expires |
设置响应被认为过期的时间点。 |
Set-Cookie |
向客户端设置一个cookie。 |
Access-Control-Allow-Origin |
指定哪些域可以访问资源(CORS机制的一部分)。 |
Age |
资源在代理缓存中存在的时间(秒)。 |
Content-Language |
内容的语言类型(如 en , zh )。 |
Date |
响应生成的日期和时间。 |
ETag |
标识特定版本的资源,以便检测更新或避免重复获取相同内容。 |
Last-Modified |
所请求资源最后一次修改的时间。 |
Location |
重定向的目标地址(通常用于 3xx 状态码)。 |
Server |
发送响应的服务器软件信息。 |
HTTP状态码
信息性响应 (100–199)
100 | Continue | 客户端应继续其请求。 |
101 | Switching Protocols | 服务器理解并正在切换到客户端请求的新协议。 |
102 | Processing | 请求将被处理,但需要一些时间完成。 |
103 | Early Hints | 提供一些关于最终响应的信息提示。 |
成功响应 (200–299)
200 | OK | 请求成功。 |
201 | Created | 请求成功并且服务器创建了新的资源。 |
202 | Accepted | 已接受请求,但尚未处理完成。 |
203 | Non-Authoritative Information | 返回的信息不是原始服务器确定的有效表示。 |
204 | No Content | 请求成功,但没有返回任何内容。 |
205 | Reset Content | 请求成功,但用户代理应重置视图。 |
206 | Partial Content | 服务器正在发送部分数据。 |
207 | Multi-Status | 可能包含多个单独响应的代码。 |
208 | Already Reported | DASL中定义,指示绑定已经报告过。 |
226 | IM Used | 服务器已完成对资源的请求,并且响应是对所请求实例的表示。 |
重定向消息 (300–399)
300 | Multiple Choices | 针对请求存在多个可能的响应。 |
301 | Moved Permanently | 所请求的页面已经永久移动到新位置。 |
302 | Found | 所请求的页面临时移到另一个位置。 |
303 | See Other | 应该通过GET方法来定位资源。 |
304 | Not Modified | 资源未被修改,可以使用缓存。 |
305 | Use Proxy | 请求的资源必须通过指定的代理访问。 |
307 | Temporary Redirect | 页面临时移到另一个位置,不改变请求方法。 |
308 | Permanent Redirect | 页面永久移到另一个位置,不改变请求方法。 |
客户端错误响应 (400–499)
400 | Bad Request | 因为语法无效,服务器无法理解此请求。 |
401 | Unauthorized | 当前请求需要用户验证。 |
402 | Payment Required | 此响应代码保留以备将来使用。 |
403 | Forbidden | 服务器拒绝执行所请求的操作。 |
404 | Not Found | 服务器找不到请求的网页。 |
405 | Method Not Allowed | 禁用请求中指定的方法。 |
406 | Not Acceptable | 服务器只能生成不被请求头接受的响应。 |
407 | Proxy Authentication Required | 类似于401,但要求先通过代理服务器的身份验证。 |
408 | Request Timeout | 服务器等待客户端发送请求的时间过长。 |
409 | Conflict | 由于与资源当前状态冲突,请求无法完成。 |
410 | Gone | 所请求的资源不再可用且无更多信息。 |
411 | Length Required | 服务器不接受不含实体长度的有效请求。 |
412 | Precondition Failed | 前提条件失败导致请求失败。 |
413 | Payload Too Large | 请求实体过大,超出了服务器处理能力。 |
414 | URI Too Long | 请求URI过长,服务器无法处理。 |
415 | Unsupported Media Type | 不支持的媒体类型。 |
416 | Range Not Satisfiable | 客户端请求的部分范围不在有效范围内。 |
417 | Expectation Failed | 服务器无法满足Expect请求头字段的要求。 |
418 | I'm a teapot | 这是一个愚人节笑话RFC中的状态码。 |
421 | Misdirected Request | 服务器无法产生响应。 |
422 | Unprocessable Entity | 请求格式正确,但由于含有语义错误而无法响应。 |
424 | Failed Dependency | 由于之前的请求失败,导致当前请求失败。 |
425 | Too Early | 表示服务器不愿意冒险处理一个可能被重放的请求。 |
426 | Upgrade Required | 客户端应当切换到TLS/1.0。 |
428 | Precondition Required | 原始服务器要求请求是条件性的。 |
429 | Too Many Requests | 用户在给定时间内发送了太多请求。 |
431 | Request Header Fields Too Large | 请求头字段太大。 |
451 | Unavailable For Legal Reasons | 由于法律原因不可用。 |
服务器错误响应 (500–599)
500 | Internal Server Error | 服务器遇到未知情况,阻止其完成请求。 |
501 | Not Implemented | 服务器不具备完成请求的功能。 |
502 | Bad Gateway | 作为网关或代理服务器,从上游服务器收到无效响应。 |
503 | Service Unavailable | 服务器暂时无法使用(可能是过载或维护)。 |
504 | Gateway Timeout | 作为网关或代理服务器,未能及时收到上游服务器的响应。 |
505 | HTTP Version Not Supported | 服务器不支持请求中使用的HTTP版本。 |
506 | Variant Also Negotiates | 内部配置错误。 |
507 | Insufficient Storage | 服务器无法存储完成请求所需的内容。 |
508 | Loop Detected | 服务器检测到请求处理中出现无限循环。 |
510 | Not Extended | 需要进一步扩展才能完成请求。 |
511 | Network Authentication Required | 客户端需要进行身份验证才能获得网络访问权限。 |
HTTP方法
GET | 获取资源,参数在 URL 中可见 |
POST | 提交数据,参数在请求体中,更安全 |
PUT | 更新资源(整个替换) |
PATCH | 更新资源(局部更新) |
DELETE | 删除资源 |
HEAD | 获取资源头部信息 |
OPTIONS | 获取服务器支持的方法 |
当用户在浏览器输入域名并回车后发生了什么?
首先,浏览器会检查其内部的DNS缓存(如果有的话)以寻找之前访问该域名时存储的IP地址。
如果未找到,系统还会检查本机的hosts文件(Windows路径为C:\Windows\System32\drivers\etc\hosts,Linux/macOS路径为/etc/hosts)。如果在此文件中找到了对应的域名和IP地址映射,则直接使用该IP地址进行连接。
如果未找到,操作系统将查询自身的DNS缓存。这包括了最近解析过的域名及其对应的IP地址记录。
如果未找到,计算机会联系预设的DNS服务器(通常是您的ISP提供的,也可以是自定义的如Google的8.8.8.8或Cloudflare的1.1.1.1等公共DNS服务)。这个DNS服务器可能会执行递归查询,这意味着它会代替客户端向其他DNS服务器询问直到找到正确的答案。 DNS递归查询: DNS查询可能涉及多个步骤,包括查询根DNS服务器、顶级域(TLD)DNS服务器(例如.com、.org等),以及最终的目标域名的权威DNS服务器。 一旦找到匹配的IP地址,这个信息会被返回给用户的计算机,并且通常也会被缓存起来以便未来的请求使用。
如果以上步骤均未获得IP地址,浏览器会返回错误
浏览器根据获得的IP地址尝试与目标服务器建立TCP连接(如果是HTTPS还需完成SSL/TLS握手)。 建立连接成功后,浏览器发送HTTP请求(对于现代网站,通常是HTTPS请求),请求页面的内容。
服务器处理请求并返回HTTP响应,包含HTML文档、CSS样式表、JavaScript脚本等资源。
浏览器开始解析这些资源,并逐步构建DOM树、加载图片、执行脚本等,直至网页完全呈现给用户。
为什么还要学习 Servlet/Jsp ?
学习基本的 Servlet 有助于理解 Spring MVC(Spring MVC 的核心是 DispatcherServlet) 等高级Java框架的底层原理,进而掌握高级框架的使用方法。
此外其也有助于掌握 Tomcat 的使用方法(部署、调优等)。
不必在 Servlet/Jsp 中太过深入学习,理解其总体原理即可,毕竟现在主流是 前后端分离 + 模板引擎
Servlet 生命周期(init/doGet/doPost/destroy) | ✅ 必须掌握 |
请求和响应对象(HttpServletRequest / HttpServletResponse) | ✅ 必须掌握 |
过滤器(Filter) | ✅ 掌握基本用法(如编码处理、权限验证) |
监听器(Listener) | ✅ 了解监听事件类型 |
JSP 的执行过程和 EL 表达式 | ✅ 了解即可 |
Session 和 Cookie | ✅ 必须掌握,尤其是 Session 机制 |
#java##javaweb##spring#Session 机制不可不品,它解决了 HTTP 协议无状态的问题,实现了用户身份的识别和数据的持久化。