摘要:本文是一篇面向初学者的 SpringBoot 入门实战指南。文章首先解释了 SpringBoot 作为 Spring 生态“加速器”的定位,通过“约定优于配置”和“起步依赖”两大核心能力,解决了传统 Spring 项目配置繁琐的问题。随后,通过一个“浏览器访问 /hello 返回 Hello World”的明确目标,手把手演示了使用 IDEA 创建 SpringBoot 项目、编写 Controller 和启动应用的完整三步流程。最后,文章深入浅出地剖析了 Web 请求背后的网络三要素(IP、端口、路径)和 HTTP 协议的基本格式(请求/响应行、头、体),帮助读者在动手实践的同时理解其底层原理,为后续学习打下坚实基础。
为什么是 SpringBoot?先讲个背景故事
做 Java 开发,迟早要跟 Spring 打交道。它是什么?官网写得很直白:Spring makes Java simple。翻译过来就是:Java 本身太啰嗦了,Spring 帮你省事。
- 比如你想让 A 类调用 B 类的方法,原生 Java 得自己 new 对象、管生命周期,Spring 说“你别管了,我帮你注入”。
- 你想操作数据库,原生 JDBC 几十行样板代码,Spring 封装成两三行就搞定。
Spring 把这些能力分散在它的子项目里——处理 Web 的有 Spring MVC,管数据的有 Spring Data,做微服务的有 Spring Cloud。统统打包称作 Spring 全家桶。
但这就带来了一个新问题。全家桶的核心叫 Spring Framework,它是整个生态的底座。问题在于,光用它来搭一个能跑的 Web 项目,你就得写一堆 XML 配置、导入一堆依赖、搞清楚组件扫描和自动装配……还没开始写业务代码,一天已经过去了。
于是就有了 SpringBoot。它的设计初衷就是——让跑起来这件事,快到你来不及走神。
两个核心能力:
- 约定优于配置。你不写配置,它就用默认的。你想改,再加。
- 起步依赖。一个 spring-boot-starter-web,自动拽进来 Web 开发需要的所有 jar 包,版本都不用你操心。
一句话:SpringBoot 不是替代 Spring,而是让你更快用上 Spring。
跑起来:第一个 SpringBoot Web 应用
你需要做什么?目标很明确:浏览器访问 /hello,页面显示 "Hello World ~"。这在 SpringBoot 里只需要三步。
第一步:搭骨架
IDEA 里新建 Module,这次不选 Maven,选 Spring Initializr。它会从 Spring 官方拉一个项目模板下来。
填几个基本信息——项目名、Group(一般是域名反写比如 com.itheima)、Java 版本选 11 就行。
然后在依赖选择页勾上 Spring Web,这是关键。点击 Finish 后 IDEA 会联网下载依赖。网速慢的话得等一会儿,但这时间你什么都不用管。
建好之后你拿到的是一个标准结构:
springboot-web-demo
├── src/main/java/com/itheima
│ └── SpringbootWebDemoApplication.java ← 入口,自带 main
├── src/main/resources
│ ├── static/ ← 放静态文件(html、css、图片)
│ └── application.properties ← 配置项全在这
├── src/test/java ← 测试代码
└── pom.xml ← 只引入了一个 starter-web
留意一下:pom.xml 里只有 spring-boot-starter-web 这一个依赖,没有 Tomcat、没有 Jackson、没有日志框架——但启动之后它们全都会在。这就是起步依赖的魔法,后面细说。
第二步:写一个“接客”的方法
在 com.itheima 下新建一个包叫 controller,然后创建 HelloController:
package com.itheima.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
System.out.println("Hello World ~");
return "Hello World ~";
}
}
就十几行代码,两个注解,解释一下:
- @RestController:告诉 SpringBoot,“这个类是用来处理 HTTP 请求的,返回值直接写回浏览器,不跳页面”。
- @RequestMapping("/hello"):把路径 /hello 绑到这个方法上。有人访问这个路径,方法就执行。
System.out.println 那行没什么实际作用,只是让你在控制台看到“有人来过”。
第三步:启动
找到项目里带 main 方法的那个类(名字通常是 xxxApplication),右键 Run。控制台开始刷日志。
看到类似 Tomcat started on port(s): 8080 这句话,应用就跑起来了。
打开浏览器,输入:
http://localhost:8080/hello
页面上出现 Hello World ~。同时 IDEA 控制台也打印了一行同样的文字。
就三步:建项目 → 写类 → 启动。没有一行 XML,没配 Tomcat,没改任何设置——一个 Web 应用已经在跑了。
停下来想一下:刚才到底发生了什么?
http://localhost:8080/hello 这个地址,拆开来看就是 Web 通信的三要素:
| IP | localhost(就是 127.0.0.1) | 找到网络里的哪台机器 |
| 端口 | 8080 | 找到那台机器上的哪个程序 |
| 资源路径 | /hello | 向那个程序要什么东西 |
你之前在 JavaSE 学过网络编程的三要素——IP、端口、协议,这里刚好全用上了。
浏览器根据 IP 找到你的电脑(本机),根据 8080 端口找到正在运行的 SpringBoot 应用,然后说:“我要访问 /hello 这个资源”。
SpringBoot 内部扫描到你的 @RequestMapping("/hello"),找到对应的 hello() 方法,执行它,把返回值 "Hello World ~" 塞进 HTTP 响应里发给浏览器。
那浏览器和服务器之间传数据的格式是什么?这就是 HTTP 协议要讲的事。
📡 HTTP 协议:浏览器和服务器的对话规则
一次请求长什么样?
打开浏览器,按 F12,切到 Network(网络)标签页,然后刷新页面。你会看到一系列请求。点开任意一个,就能看到它内部的结构。
HTTP 规定:一次请求和一次响应,必须按固定格式来。你不需要记住每一条,但你需要知道格式分三块——请求行 / 请求头 / 请求体。
请求:浏览器发给服务器
一个典型的 GET 请求长这样:
GET /brand/findAll?name=OPPO&status=1 HTTP/1.1 ← 请求行
Host: www.example.com ← 请求头
User-Agent: Mozilla/5.0 (Windows NT 10.0) Chrome/…
Accept: text/html, application/json
← 空行(没有请求体)
请求行包含三样东西——用什么方式请求(GET)、要哪个资源(/brand/findAll?name=OPPO&status=1)、用的什么版本的协议(HTTP/1.1)。
注意到资源路径里 ? 后面的部分没有?那是参数。name=OPPO&status=1——多个参数用 & 拼接,key=value 的格式。这就是 GET 传参的方式:参数跟在 URL 后面,能被人直接看到。
请求头是一堆 Key: Value,主要作用是告诉服务器“我是谁、我能接收什么格式的数据、我希望怎么回复”。比如 User-Agent 里写的就是你用的浏览器和操作系统,服务器看到这个就能做兼容处理——IE 浏览器兼容问题就是这么解决的。
POST 的差别
同样的请求如果用 POST:
POST /brand HTTP/1.1 ← 请求行(没有 ? 参数了)
Host: www.example.com
Content-Type: application/json ← 告诉服务器:请求体是 JSON
Content-Length: 85 ← 请求体长度
← 空行(请求头结束的标记)
{"name":"OPPO","status":1} ← 请求体(参数在这里!)
区别一目了然:GET 把参数挂在 URL 后面,POST 把参数藏在请求体里。这也解释了为什么 GET 的 URL 有长度限制(浏览器对地址栏长度有限制)、安全性较低(参数暴露在地址栏);而 POST 没有长度限制、相对安全一点——但不是绝对安全,因为 POST 的请求体同样可以被抓包工具看到。
响应:服务器返回给浏览器
服务器收到请求,处理完,按同样的三段式格式回复:
HTTP/1.1 200 OK ← 响应行
Content-Type: text/html; charset=utf-8 ← 响应头
Content-Length: 582
← 空行
<!DOCTYPE html> ← 响应体(浏览器真正渲染的内容)
<html>…</html>
响应行最重要的是中间那个数字 200——状态码。它用一个数字告诉你这次请求的结果。
日常开发中,你只需要对三个状态码有直觉反应:
| 200 | 一切正常。请求成功,数据拿到了。 |
| 404 | 你访问的路径不存在。检查 URL 拼写,或者看后端有没有写这个接口。 |
| 500 | 服务器崩了。代码抛了异常,去查日志。 |
其他状态码以后再认:1xx 是“等一下,还没处理完”;3xx 是“你要的东西搬到别处了”;4xx 系列里还有 401(未授权)、403(禁止访问);5xx 系列里还有 502/503(网关/服务问题)。
响应头里同样是一堆 Key: Value——Content-Type 告诉浏览器返回的是什么类型(HTML、JSON、图片等),Content-Length 告诉浏览器数据有多大。
响应体就是浏览器真正要渲染或处理的内容,比如 HTML、JSON 数据、图片二进制流。
总结
今天你完成了从零到一的 SpringBoot Web 应用搭建:
下一节,我们会让这个 Hello World 变得更“有用”——接收参数、返回 JSON、连接数据库。但今天,先享受这行字出现在你自己服务器上的成就感吧。




