Java Web 网络基础问答
整理 Web 基础中的高频面试题:XML 与 HTML 的区别、XML 约束、HTTP 协议、请求响应结构、GET/POST 如何选择、服务器的组成。每题先给出面试标准回答,再用人话解释一遍,方便理解记忆。
1. XML 和 HTML 有什么区别?
面试回答:
HTML(超文本标记语言)和 XML(可扩展标记语言)的核心区别在于设计目的不同:
- HTML:标签是预定义、固定的(如
<div>、<p>、<table>),语义是"如何展示",浏览器负责把标签渲染成页面效果。 - XML:标签可以自定义,语义是"如何描述数据",常用于配置文件存储和系统间数据传输(在 JSON 普及之前是主流的数据交换格式)。
- 语法严格度不同:XML 文档必须有且只有一个根标签,标签必须正确嵌套、成对闭合,文件头部要有
<?xml version="1.0"?>声明;HTML(尤其 HTML5)语法宽松得多,浏览器会自动纠错容错。
一句话总结:HTML 关注展示,XML 关注数据结构。两者都是标记语言,区别在于标签是否固定、用途是展示还是携带数据。
补充纠正:常见说法"HTML = XML + DTD"并不准确。HTML 源自 SGML,和 XML 是平行发展的两套标记语言标准;真正"用 XML 语法规则重写 HTML"的产物叫 XHTML,它才是 HTML 与 XML 语法结合的结果。
人话解释:
HTML 就像一套装修图纸的固定模板,墙、门、窗户的画法都是定死的,浏览器一看就知道怎么画出页面。XML 是一张空白图纸,标签含义你自己定义,比较适合用来存数据、或者在不同系统之间传数据(后来这个活儿基本被更轻量的 JSON 抢走了)。
2. XML 约束有什么作用?约束类型和引入方式?
面试回答:
XML 标签可以自定义,如果没有任何限制,同一份数据每个人都能写出不同的标签结构,无法互相解析。XML 约束就是用来规定一份 XML 文档"允许出现哪些标签、标签的顺序、属性、内容格式",作用有三点:
- 限制标签的书写规则,防止乱写
- 开发工具能据此提供自动补全和校验提示
- 不同系统之间约定好格式后,配置传递更可靠
约束分为两类:DTD 和 Schema(XSD)。
DTD(文档类型定义):语法简单,但不支持数据类型校验,无命名空间机制,引入方式:
xml<?xml version="1.0"?> <!DOCTYPE 根标签 SYSTEM "xx.dtd"> <根标签>...</根标签>Schema(XSD):本身也是一份 XML 文档,支持数据类型、命名空间,是 DTD 的替代方案,引入方式:
xml<?xml version="1.0"?> <根标签 xmlns="默认命名空间" xmlns:别名="其他命名空间" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="命名空间1 xxx1.xsd 命名空间2 xxx2.xsd"> <标签名/> <!-- 属于默认命名空间 xmlns --> <别名:标签名/> <!-- 属于别名对应的命名空间 --> </根标签>
人话解释:
约束就是给 XML 定"格式规范",好比公司统一的合同模板:字段名、顺序、类型都提前约定好,别人不能随便乱填。DTD 是老式的简单模板,只能限制标签结构;Schema 是升级版,还能限制数据类型(比如某个字段必须是数字),并支持"命名空间"来区分不同来源的标签(类似 Java 里用包名 com.xxx.User 区分不同包下同名的类)。
3. 什么是 HTTP 协议?主要有什么作用?
面试回答:
HTTP(超文本传输协议)是应用层协议,规定了客户端和服务器之间请求与响应的数据格式。它底层依赖 TCP/IP 提供可靠的字节流传输:
- 建立连接时经历 TCP 三次握手(SYN → SYN+ACK → ACK)
- 断开连接时经历 TCP 四次挥手(FIN/ACK 交换,因为 TCP 是全双工,两个方向要分别关闭)
HTTP 本身是无状态、基于请求-响应模型的协议:客户端发起一次请求,服务器返回一次响应,双方不会主动记住上一次交互的状态(这也是后来需要 Cookie/Session/Token 来维持状态的原因)。目前主流版本是 HTTP/1.1(默认长连接)、HTTP/2(多路复用)、HTTP/3(基于 UDP 的 QUIC)。
人话解释:
HTTP 就是浏览器和服务器"打电话"时用的通话格式规范:先约定好怎么开头、怎么说重点、怎么挂电话。这次通话本身依赖 TCP 这条稳定的"电话线"(三次握手相当于打电话前先确认"你能听到我吗""能""那我们开始说";四次挥手是挂电话时双方都说一次"没有话要说了"才真正挂断)。HTTP "无状态"指的是:这次通话挂了之后,下次再打电话,对方完全不记得你是谁,除非你主动带上"身份证"(Cookie/Token)。
4. 请求和响应数据包的结构是什么?
面试回答:
请求(Request)报文结构:
请求行 GET /index.html HTTP/1.1
请求头 Host: example.com
User-Agent: ...
Content-Type: application/json
请求空行 (CRLF,标志头部结束)
请求体 {"key": "value"} (GET 一般没有请求体)响应(Response)报文结构:
状态行 HTTP/1.1 200 OK
响应头 Content-Type: text/html
Content-Length: 1234
响应空行 (CRLF)
响应体 <html>...</html> (实际返回的数据,字节流)要点:请求行三部分是方法、URL、协议版本;状态行三部分是协议版本、状态码、状态描述;头部和主体之间必须有一个空行分隔,这是 HTTP 报文解析的关键分界点。
人话解释:
请求报文就像寄快递的运单:第一行写清楚"寄什么方式、寄到哪、用哪个协议"(请求行),中间贴一堆标签写备注信息(请求头),空一行后面才是真正要寄的东西(请求体)。响应报文是收件人回你的单子:第一行告诉你"处理结果是成功还是失败"(状态行 200/404/500),后面同样是备注信息加实际内容。这个"空行"很关键,程序解析报文时就是靠这个空行来判断"头部读完了,接下来是正文"。
5. GET 和 POST 有什么区别?如何选择?
面试回答:
| 维度 | GET | POST |
|---|---|---|
| 语义 | 获取资源 | 提交/创建资源 |
| 参数位置 | 拼接在 URL 后(?key=value),无请求体 | 放在请求体中 |
| 数据大小 | 受 URL 长度限制(浏览器/服务器通常限制在几 KB) | 理论上无限制 |
| 安全性 | 参数暴露在 URL、浏览器历史、日志中 | 相对不暴露在 URL,但仍非加密,需配合 HTTPS |
| 幂等性 | 幂等(多次请求结果一致),可被浏览器缓存 | 非幂等,不会被缓存 |
选择原则: 优先用 GET;当出现以下情况之一时改用 POST:
- 传递的数据量较大(一般以 2KB 作为经验分界线)
- 传递敏感/隐私数据(如密码)
- 是新增、修改等有副作用的操作(不满足幂等语义)
人话解释:
GET 相当于"我要看看这个东西",参数写在网址栏里,谁都能看到(就像把收货地址写在快递盒外面),而且浏览器会记住这次请求方便你重复访问或缓存。POST 相当于"我要交个东西给你",内容装在包裹内部(请求体),网址栏看不到,适合传密码、传大文件、或者传"会改变服务器数据"的操作(比如注册、下单)。经验法则:能用 GET 就用 GET,涉密或数据量大就换 POST。
6. 什么是服务器?服务器由哪三部分组成?
面试回答:
在一个 Web 项目中,架构分为**客户端(Client)和服务端(Server)**两侧:
- 客户端:负责界面展示和用户交互,形式多样 —— 浏览器(HTML/CSS/JS + 前端工程化:Vue/Node/npm/Axios/Pinia/Element Plus)、Android App、iOS App、微信/支付宝小程序、甚至现在的 AI 智能体客户端。
- 服务端(服务器):负责业务逻辑处理,返回数据给客户端(通常以 JSON 格式传输)。
服务器由三部分组成:
- 服务器主机:物理机或云主机,提供硬件资源(CPU、内存、磁盘、网络)
- 服务器软件:能够接收 HTTP 请求并响应的软件环境,如 Tomcat、Nginx、Jetty
- Web 项目:部署在服务器软件上的具体业务应用(如一个 Spring Boot 打的 jar 包)
三者关系:主机提供硬件能力 → 软件提供协议解析和请求调度能力 → Web 项目实现具体业务逻辑,三者叠加才能对外提供完整的 Web 服务。
人话解释:
做一个 Web 系统分两块:客户端负责"给用户看",服务端负责"处理逻辑、存数据",两边通过 JSON 传数据。而"服务器"这个词其实是三层叠加的:最底下是一台电脑(主机),电脑上装了一个能听懂 HTTP 请求的软件(比如 Tomcat,相当于翻译官),软件上再跑着你写的具体项目代码(比如一个电商系统)。所以说"服务器",既可以指那台机器,也可以指跑在机器上的软件,要看上下文。
