SpringBoot 基础入门:路由、视图、请求与会话详解
介绍 SpringBoot 基础开发,涵盖项目创建、HTTP 状态码、MVC 模式、路由定义(路径变量、请求参数)、视图渲染(Thymeleaf 模板引擎、静态资源、数据绑定、条件渲染、列表渲染、表单校验)、响应处理(ResponseEntity、请求头、请求体、文件上传、下载)、以及会话管理(Cookie、Session)。通过实例演示了从环境搭建到前后端交互的完整流程,适合初学者快速上手。

介绍 SpringBoot 基础开发,涵盖项目创建、HTTP 状态码、MVC 模式、路由定义(路径变量、请求参数)、视图渲染(Thymeleaf 模板引擎、静态资源、数据绑定、条件渲染、列表渲染、表单校验)、响应处理(ResponseEntity、请求头、请求体、文件上传、下载)、以及会话管理(Cookie、Session)。通过实例演示了从环境搭建到前后端交互的完整流程,适合初学者快速上手。

在 IDEA 中创建 SpringBoot 项目,选择 SpringWeb 依赖。

使用 Maven 清理并运行项目(终端执行 mvn clean 或 mvn spring-boot:run)。

若未定义路由,控制台可能无内容输出。
HTTP 状态码由 3 位数字组成,首位代表类别:
| 类别 | 含义 | 核心场景 |
|---|---|---|
| 1xx(信息性) | 请求已接收 | 极少使用 |
| 2xx(成功) | 请求正常处理 | 业务接口正常响应 |
| 3xx(重定向) | 需客户端进一步操作 | 页面跳转、资源重定向 |
| 4xx(客户端错误) | 客户端请求有误 | 参数错误、权限不足 |
| 5xx(服务器错误) | 服务器处理失败 | 代码异常、服务不可用 |
高频常用状态码:
Spring Boot 遵循 MVC 模式,包含 Model、View、Controller 三大组件。

使用注解定义 RESTful 控制器:
| 注解 | 作用 |
|---|---|
@RestController | 表示 RESTful 控制器,返回 JSON/字符串 |
@GetMapping("/hello") | 映射 GET 请求到 /hello 路径 |
@PostMapping, @PutMapping, @DeleteMapping | 分别处理 POST、PUT、DELETE 请求 |
package com.example.demo;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
@RestController
public class Controller {
@GetMapping("")
public String main() {
return "hello Spring";
}
@GetMapping("/user")
public String user() {
return "user";
}
}
也可组合使用:
@RequestMapping("path")
@RestController
class test03 {
@GetMapping("")
@PostMapping("")
public String f1() {
return "hello world";
}
}
路径变量 (@PathVariable):参数嵌入 URL 路径,适用于资源标识。
@GetMapping("/user/{userid}")
public String User(@PathVariable String userid) {
return "hello User" + userid;
}
请求参数 (@RequestParam):从查询列表提取参数。
@GetMapping("query")
public String Query(@RequestParam(value="name", defaultValue="张三") String name) {
return "hello" + name;
}
通过类上和方法上的注解组合实现多级路径:
@RequestMapping("user")
@RestController
class Controller {
@GetMapping("/username")
public String Name(@RequestParam(name="name", defaultValue="无") String name) {
return "姓名:" + name;
}
@GetMapping("/userId/{Id}")
public String Id(@PathVariable String Id) {
return "编号:" + Id;
}
}
Java Web 常用模板引擎:
本教程采用 Thymeleaf。需在 pom.xml 引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
HTML 文件放在 resources/template 下,静态资源(CSS/JS/图片)放在 static 下。
使用 @Controller 返回视图名称:
@Controller
class ShowView {
@GetMapping("/u1")
public String F1() {
return "test01";
}
}
@Controller vs @RestController:
@Controller:默认返回视图(HTML),配合 Model 传递数据。@RestController:默认返回数据(JSON),用于前后端分离。使用 th:href 和 th:src 绑定资源:
<link th:href="@{/test01.css}" type="text/css" rel="stylesheet">
<script th:src="@{/test01.js}" type="text/javascript"></script>
<img th:src="@{/pic.png}">
开发期可禁用模板缓存:
spring.thymeleaf.cache=false
使用 Model 对象传递数据:
@GetMapping("showData")
public String showData(Model model) {
model.addAttribute("name", "张三");
model.addAttribute("score", 85);
model.addAttribute("isMan", true);
return "showData";
}
模板中使用 ${key} 取值:
<span th:text="${name}"></span>
<span th:text="${isMan ? '男' : '女'}"></span>
条件渲染:
<h2 th:if="${isMan}">是纯爷们</h2>
<h2 th:unless="${isMan}">不是纯爷们</h2>
列表渲染 (th:each):
List<String> arr = new ArrayList<>();
arr.add("高等数学");
model.addAttribute("arr", arr);
<li th:each="item,state :${arr}" th:text="|${state.index+1}-----${item}|"></li>
自定义对象渲染: 需确保类有 getter/setter 和无参构造。
<ul th:object="${user}">
<li th:text="${user.name}"></li>
</ul>
GET vs POST:
Bean 校验:
引入 spring-boot-starter-validation 和 lombok。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
实体类添加校验注解:
@Data
public class User {
@NotBlank(message="不能为空")
private String name;
@NotNull(message="不能为空")
private boolean man;
@NotNull(message="不能为空")
private int score;
}
控制器处理校验:
@PostMapping("add")
public String PostAdd(@Valid User user, BindingResult res, Model model) {
if (res.hasErrors()) {
model.addAttribute("user", user);
return "test01111";
} else {
return "redirect:/test02";
}
}
前端绑定:
<form th:action="@{/test02/add}" method="post" th:object="${user}">
<input th:field="*{name}">
<span th:errors="*{name}"></span>
</form>
使用 th:fragment 定义复用片段,th:replace 或 th:insert 引用。
<!-- header.html -->
<div th:fragment="header">...</div>
<!-- 主页面 -->
<div th:replace="header::header"></div>
封装 HTTP 响应的完整工具,可定制状态码、头和体。
@GetMapping("ok")
public ResponseEntity<?> ok() {
return ResponseEntity.ok("Ok");
}
@GetMapping("notFound")
public ResponseEntity<?> notFound() {
return ResponseEntity.notFound().build();
}
使用 @RequestHeader 获取请求头信息:
@GetMapping("header")
public ResponseEntity<?> showHeader(@RequestHeader Map<String, Object> headers) {
return ResponseEntity.ok(headers);
}
常见请求头:
Content-Type:媒体类型。Authorization:身份认证。User-Agent:客户端信息。JSON 数据:使用 @RequestBody。
@PostMapping("body")
public ResponseEntity<?> f3(@RequestBody Person person) {
return ResponseEntity.ok(person);
}
表单数据:使用 @ModelAttribute。
文件上传:使用 MultipartFile。
@PostMapping("file")
public ResponseEntity<?> dealFile(@RequestParam("file") MultipartFile file) {
// 保存文件逻辑
return ResponseEntity.ok("success");
}
使用 HttpHeaders 设置响应头:
@GetMapping("")
public ResponseEntity<?> f1() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return ResponseEntity.ok().headers(headers).body(new HashMap<>());
}
文件下载:
@GetMapping("download/{filename}")
public ResponseEntity<?> download(@PathVariable String filename) {
Path filePath = Paths.get("uploads", filename);
byte[] fileData = Files.readAllBytes(filePath);
Resource resource = new ByteArrayResource(fileData);
HttpHeaders headers = new HttpHeaders();
headers.setContentDisposition(ContentDisposition.attachment().filename(filename).build());
return ResponseEntity.ok().headers(headers).body(resource);
}
使用 HttpServletRequest 和 HttpServletResponse 获取底层信息:
@GetMapping("yuansheng")
public ResponseEntity<?> f1(HttpServletRequest request, HttpServletResponse response) {
String ip = request.getRemoteAddr();
response.setStatus(200);
return ResponseEntity.ok("IP: " + ip);
}
Cookie 是客户端存储的小型键值对数据。
设置 Cookie:
@GetMapping("set")
public ResponseEntity<?> set(HttpServletResponse response) {
Cookie cookie = new Cookie("username", "张三");
cookie.setMaxAge(86400); // 1 天
response.addCookie(cookie);
return ResponseEntity.ok("设置成功");
}
删除 Cookie:
@GetMapping("del")
public ResponseEntity<?> del(HttpServletResponse response) {
Cookie cookie = new Cookie("username", "");
cookie.setMaxAge(0);
response.addCookie(cookie);
return ResponseEntity.ok("删除成功");
}
Session 是服务端存储的用户上下文。
设置 Session:
@GetMapping("set")
public ResponseEntity<?> set(HttpSession session) {
session.setAttribute("key", "value");
return ResponseEntity.ok("设置成功");
}
获取 Session:
@GetMapping("get")
public ResponseEntity<?> get(HttpSession session) {
Object val = session.getAttribute("key");
return ResponseEntity.ok(val);
}
销毁 Session:
@GetMapping("del")
public ResponseEntity<?> del(HttpSession session) {
session.invalidate();
return ResponseEntity.ok("销毁成功");
}

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online