跳到主要内容SpringBoot 基础入门:路由、视图、请求与会话详解 | 极客日志Javajava
SpringBoot 基础入门:路由、视图、请求与会话详解
综述由AI生成介绍 SpringBoot 基础开发,涵盖项目创建、HTTP 状态码、MVC 模式、路由定义(路径变量、请求参数)、视图渲染(Thymeleaf 模板引擎、静态资源、数据绑定、条件渲染、列表渲染、表单校验)、响应处理(ResponseEntity、请求头、请求体、文件上传、下载)、以及会话管理(Cookie、Session)。通过实例演示了从环境搭建到前后端交互的完整流程,适合初学者快速上手。
月光旅人30 浏览 SpringBoot 基础入门
1. IDEA 运行后端
1.1 创建 SpringBoot 项目
在 IDEA 中创建 SpringBoot 项目,选择 SpringWeb 依赖。

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

若未定义路由,控制台可能无内容输出。
2. HTTP 状态码
HTTP 状态码由 3 位数字组成,首位代表类别:
| 类别 | 含义 | 核心场景 |
|---|
| 1xx(信息性) | 请求已接收 | 极少使用 |
| 2xx(成功) | 请求正常处理 | 业务接口正常响应 |
| 3xx(重定向) | 需客户端进一步操作 | 页面跳转、资源重定向 |
| 4xx(客户端错误) | 客户端请求有误 | 参数错误、权限不足 |
| 5xx(服务器错误) | 服务器处理失败 | 代码异常、服务不可用 |
高频常用状态码:
- 200 OK:请求完全正常。
- 201 Created:资源创建成功。
- 204 No Content:处理成功但无返回数据。
- 301 Moved Permanently:永久重定向。
- 302 Found:临时重定向。
- 400 Bad Request:请求参数有误。
- 401 Unauthorized:未认证。
- 403 Forbidden:已认证但无权限。
- 404 Not Found:资源不存在。
- 500 Internal Server Error:服务器内部异常。
3. MVC 设计模式
Spring Boot 遵循 MVC 模式,包含 Model、View、Controller 三大组件。
- Model(模型):管理核心数据和业务逻辑(如商品库存、订单规则)。
- View(视图):负责数据展示和用户交互(如 HTML 页面)。
- Controller(控制器):连接 Model 和 View,接收请求并协调处理(如订单提交逻辑)。

4. 路由
4.1 定义路由
| 注解 | 作用 |
|---|
@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";
}
}
4.2 路由传参
路径变量 (@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;
}
4.3 多级路由
@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;
}
}
5. 视图 (Thymeleaf)
5.1 模板引擎简介
- Thymeleaf:现代主流,Spring 官方推荐,支持自然模板。
- FreeMarker:功能强大,模板与 Java 解耦。
- JSP:老牌经典,逐步淘汰。
本教程采用 Thymeleaf。需在 pom.xml 引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
HTML 文件放在 resources/template 下,静态资源(CSS/JS/图片)放在 static 下。
5.2 配置与渲染
@Controller
class ShowView {
@GetMapping("/u1")
public String F1() {
return "test01";
}
}
@Controller vs @RestController:
@Controller:默认返回视图(HTML),配合 Model 传递数据。
@RestController:默认返回数据(JSON),用于前后端分离。
5.3 静态资源绑定
使用 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}">
5.4 缓存配置
spring.thymeleaf.cache=false
5.5 数据渲染
@GetMapping("showData")
public String showData(Model model) {
model.addAttribute("name", "张三");
model.addAttribute("score", 85);
model.addAttribute("isMan", true);
return "showData";
}
<span th:text="${name}"></span>
<span th:text="${isMan ? '男' : '女'}"></span>
5.6 条件与列表渲染
<h2 th:if="${isMan}">是纯爷们</h2>
<h2 th:unless="${isMan}">不是纯爷们</h2>
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>
5.7 表单与校验
- GET:只读,参数在 URL 中。
- 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>
5.8 模板分离技术
使用 th:fragment 定义复用片段,th:replace 或 th:insert 引用。
<div th:fragment="header">...</div>
<div th:replace="header::header"></div>
6. 响应和请求
6.1 ResponseEntity
封装 HTTP 响应的完整工具,可定制状态码、头和体。
@GetMapping("ok")
public ResponseEntity<?> ok() {
return ResponseEntity.ok("Ok");
}
@GetMapping("notFound")
public ResponseEntity<?> notFound() {
return ResponseEntity.notFound().build();
}
6.2 请求头
使用 @RequestHeader 获取请求头信息:
@GetMapping("header")
public ResponseEntity<?> showHeader(@RequestHeader Map<String, Object> headers) {
return ResponseEntity.ok(headers);
}
Content-Type:媒体类型。
Authorization:身份认证。
User-Agent:客户端信息。
6.3 请求体
@PostMapping("body")
public ResponseEntity<?> f3(@RequestBody Person person) {
return ResponseEntity.ok(person);
}
@PostMapping("file")
public ResponseEntity<?> dealFile(@RequestParam("file") MultipartFile file) {
return ResponseEntity.ok("success");
}
6.4 响应头设置
@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);
}
6.5 原生 Servlet 对象
使用 HttpServletRequest 和 HttpServletResponse 获取底层信息:
@GetMapping("yuansheng")
public ResponseEntity<?> f1(HttpServletRequest request, HttpServletResponse response) {
String ip = request.getRemoteAddr();
response.setStatus(200);
return ResponseEntity.ok("IP: " + ip);
}
7. 会话管理
7.1 Cookie
@GetMapping("set")
public ResponseEntity<?> set(HttpServletResponse response) {
Cookie cookie = new Cookie("username", "张三");
cookie.setMaxAge(86400);
response.addCookie(cookie);
return ResponseEntity.ok("设置成功");
}
@GetMapping("del")
public ResponseEntity<?> del(HttpServletResponse response) {
Cookie cookie = new Cookie("username", "");
cookie.setMaxAge(0);
response.addCookie(cookie);
return ResponseEntity.ok("删除成功");
}
7.2 Session
@GetMapping("set")
public ResponseEntity<?> set(HttpSession session) {
session.setAttribute("key", "value");
return ResponseEntity.ok("设置成功");
}
@GetMapping("get")
public ResponseEntity<?> get(HttpSession session) {
Object val = session.getAttribute("key");
return ResponseEntity.ok(val);
}
@GetMapping("del")
public ResponseEntity<?> del(HttpSession session) {
session.invalidate();
return ResponseEntity.ok("销毁成功");
}
相关免费在线工具
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
- JavaScript 压缩与混淆
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online