Spring MVC 全栈指南:RESTful 架构、核心注解与 JSON 实战解析
目录
- RESTful API 设计规范
- Spring MVC 核心注解解析
- 静态资源处理策略
- JSON 数据交互全解
- 高频问题与最佳实践
一、RESTful API 设计规范
1.1 核心原则
| 原则 | 说明 | 示例 URI |
|---|---|---|
| 资源为中心 | URI 使用名词(复数形式) | /users ✔️ /getUser ❌ |
| HTTP 方法语义化 | GET(查)、POST(增)、PUT(改)、DELETE(删) | DELETE /users/1 |
| 无状态通信 | 服务端不保存客户端会话状态 | 每次请求携带完整认证信息 |
1.2 完整代码示例
@RestController
@RequestMapping("/api/v1/users")
public class UserController {@GetMapping("/{id}")public ResponseEntity<User> getUser(@PathVariable Long id) {User user = userService.findById(id);return user != null ? ResponseEntity.ok(user) : ResponseEntity.notFound().build();}@PostMappingpublic ResponseEntity<User> createUser(@Valid @RequestBody User user) {User savedUser = userService.save(user);URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(savedUser.getId());return ResponseEntity.created(location).body(savedUser);}
}
1.3 高级技巧
- HATEOAS 实现(响应中嵌入资源链接):
@GetMapping("/{id}/orders")
public CollectionModel<Order> getUserOrders(@PathVariable Long id) {List<Order> orders = orderService.findByUserId(id);Link selfLink = linkTo(methodOn(UserController.class).getUserOrders(id)).withSelfRel();return CollectionModel.of(orders, selfLink);
}
- 响应示例:
{"content": [ ... ],"_links": {"self": { "href": "/users/1/orders" }}
}
二、Spring MVC 核心注解解析
2.1 参数绑定注解
| 注解 | 作用场景 | 示例代码 |
|---|---|---|
@PathVariable | 从 URI 路径提取变量 | @GetMapping("/{id}") → id=1 |
@RequestParam | 绑定查询参数(支持默认值) | @RequestParam(name="page", defaultValue="1") |
@RequestBody | 将请求体 JSON 映射到 Java 对象 | public User createUser(@RequestBody User user) |
2.2 元数据获取注解
// 获取 Cookie 值
@GetMapping("/session")
public String getSession(@CookieValue("JSESSIONID") String sessionId) { ... }// 读取请求头
@GetMapping("/headers")
public String getHeader(@RequestHeader("User-Agent") String userAgent) { ... }
2.3 作用域注解
| 注解 | 作用域 | 生命周期 |
|---|---|---|
@SessionAttribute | 读取 Session 属性 | 用户会话期间有效 |
@ModelAttribute | 预加载模型数据 | 每次请求前执行 |
三、静态资源处理策略
3.1 配置方式对比
| 方式 | 配置示例 | 适用场景 |
|---|---|---|
| 缺省 Servlet 放行 | web.xml 配置 <servlet-mapping> | 传统项目兼容 |
| resources 标签 | <mvc:resources mapping="/img/**" location="/img/"/> | 明确指定资源目录 |
| default-servlet-handler | <mvc:default-servlet-handler/> | 快速放行所有静态资源 |
3.2 常见问题
- JSP 未被放行:需通过视图解析器处理,不属于静态资源。
- 路径冲突:避免控制器映射与静态资源路径重叠(如
/js/**与/js/controller)。
四、JSON 数据交互全解
4.1 响应 JSON 配置
@RestController // = @Controller + @ResponseBody
public class ApiController {@GetMapping("/city/{id}")public City getCity(@PathVariable int id) {return cityService.findById(id);}
}
4.2 序列化控制
@Data
public class Product {@JsonIgnoreprivate String internalCode; // 不序列化@JsonFormat(pattern = "yyyy-MM-dd")private Date createTime; // 日期格式化
}
4.3 依赖配置
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.0</version>
</dependency>
五、高频问题与最佳实践
5.1 常见错误
- RESTful 路径设计混乱
- ❌
/getUserOrders?userId=1→ ✅GET /users/1/orders
- ❌
- HTTP 方法误用
- ❌ 用 POST 请求更新资源 → ✅ 使用 PUT/PATCH
- JSON 日期序列化错误
- 解决方案:
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
- 解决方案:
5.2 性能优化
- 静态资源缓存:配置
Cache-Control头减少重复请求。 - Jackson 延迟加载:对大数据集使用
@JsonView控制序列化字段。
相关文章:
Spring MVC 全栈指南:RESTful 架构、核心注解与 JSON 实战解析
目录 RESTful API 设计规范Spring MVC 核心注解解析静态资源处理策略JSON 数据交互全解高频问题与最佳实践 一、RESTful API 设计规范 1.1 核心原则 原则说明示例 URI资源为中心URI 使用名词(复数形式)/users ✔️ /getUser ❌HTTP 方法语义化GET&…...
【web服务_负载均衡Nginx】三、Nginx 实践应用与高级配置技巧
一、Nginx 在 Web 服务器场景中的深度应用 1.1 静态网站部署与优化 在 CentOS 7 系统中,使用 Nginx 部署静态网站是最基础也最常见的应用场景。首先,准备网站文件,在/var/www/html目录下创建index.html文件: sudo mkdir -p…...
Docker环境下SpringBoot程序内存溢出(OOM)问题深度解析与实战调优
文章目录 一、问题背景与现象还原**1. 业务背景****2. 故障特征****3. 核心痛点****4. 解决目标** 二、核心矛盾点分析**1. JVM 与容器内存协同失效****2. 非堆内存泄漏****3. 容器内存分配策略缺陷** 三、系统性解决方案**1. Docker 容器配置**2. JVM参数优化(容器…...
【计算机网络】网络基础(协议,网络传输流程、Mac/IP地址 、端口号)
目录 1.协议简述2.网络分层结构2.1 软件分层2.2 网络分层为什么? 是什么?OSI七层模型TCP/IP五层(或四层)结构 3. 网络与操作系统之间的关系4.从语言角度理解协议5.网络如何传输局域网通信(同一网段) 不同网…...
【Mysql】mysql数据库占用空间查询
Mysql数据库操作 数据库大小查询 # 查询 每一个 数据库大小 SELECT table_schema AS 数据库名,SUM(data_length index_length) / 1024 / 1024 AS 数据库大小(MB) FROM information_schema.TABLES GROUP BY table_schema;# 查询 数据库占用磁盘大小 SELECT SUM(data_length …...
pgsql中使用jsonb的mybatis-plus和jps的配置
在pgsql中使用jsonb类型的数据时,实体对象要对其进行一些相关的配置,而mybatis和jpa中使用各不相同。 在项目中经常会结合 MyBatis-Plus 和 JPA 进行开发,MyBatis_plus对于操作数据更灵活,jpa可以自动建表,两者各取其…...
使用MetaGPT 创建智能体(2)多智能体
先给上个文章使用MetaGPT 创建智能体(1)入门打个补丁: 补丁1: MeteGTP中Role和Action的关联和区别?这是这两天再使用MetaGPT时候心中的疑问,这里做个记录 Role(角色)和 Action&…...
C# 使用.NET内置的 IObservable<T> 和 IObserver<T>-观察者模式
核心概念 IObservable<T> 表示 可观察的数据源(如事件流、实时数据)。 关键方法:Subscribe(IObserver<T> observer),用于注册观察者。 IObserver<T> 表示 数据的接收者,响应数据变化。 三个核心…...
Redis——网络模型之IO讲解
目录 前言 1.用户空间和内核空间 1.2用户空间和内核空间的切换 1.3切换过程 2.阻塞IO 3.非阻塞IO 4.IO多路复用 4.1.IO多路复用过程 4.2.IO多路复用监听方式 4.3.IO多路复用-select 4.4.IO多路复用-poll 4.5.IO多路复用-epoll 4.6.select poll epoll总结 4.7.IO多…...
【dify实战】chatflow结合deepseek实现基于自然语言的数据库问答、Echarts可视化展示、Excel报表下载
dify结合deepseek实现基于自然语言的数据库问答、Echarts可视化展示、Excel报表下载 观看视频,您将学会 在dify下如何快速的构建一个chatflow,来完成数据分析工作;如何在AI的回复中展示可视化的图表;如何在AI 的回复中加入Excel报…...
vue3 传参 传入变量名
背景: 需求是:在vue框架中,接口传参我们需要穿“变量名”,而不是字符串 通俗点说法是:在网络接口请求的时候,要传属性名 效果展示: vue2核心代码: this[_keyParam] vue3核心代码&…...
裸金属服务器有什么用途?
裸金属服务器可以直接在硬件上运行应用程序和操作系统,不需要虚拟化层,裸金属服务器还会为企业提供一种高性能、高可靠性和高安全性的计算资源,通常运用在需要大量计算能力和数据处理能力的应用场景中,下面介绍一下裸金属服务器的…...
旅游特种兵迪士尼大作战:DeepSeek高精准路径优化
DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东 随着假期的脚步日渐临近,环球影城等备受瞩目的主题游乐场,已然成为大人与孩子们心中不可或缺的节日狂欢圣地。然而,随之而来的庞大客流,却总让无数游客在欢乐的…...
【MySQL】第一弹——MySQL数据库结构与操作
目录 一. 数据库介绍1.1 什么是数据库1.2 为什么要使用数据库1.3 主流数据库1.3.1 关系型数据库1.3.2 非关系型数据库 二. MySQL 的结构2.1 MySQL服务器和客户端2.2 MySQL服务器是如何组织数据的 三. 数据库的操作3.1 创建数据库语法格式示例 3.2 查看数据库语法格式示例 3.3 使…...
Spring_MVC 快速入门指南
Spring_MVC 快速入门指南 一、Spring_MVC 简介 1. 什么是 Spring_MVC? Spring_MVC 是 Spring 框架的一个模块,用于构建 Web 应用程序。它基于 MVC(Model-View-Controller)设计模式,将应用程序分为模型(M…...
L38.【LeetCode题解】四数之和(双指针思想) 从汇编角度分析报错原因
目录 1.题目 2.分析 去重的代码 错误代码 3.完整代码 提交结果 1.题目 四数之和 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元…...
字符串系列一>最长回文子串
目录 题目:解析:代码: 题目: 链接: link 解析: 代码: class Solution {public String longestPalindrome(String s) {char[] ss s.toCharArray();int n ss.length;int begin 0;//返回结果的起始字符串…...
双击热备方案及不同方案的需求、方案对比
双击热备方案概述 一般实现双机热备的方案有三种,分别是共享存储双机热备方案、镜像双机热备方案、双机双柜双机热备方案,这三种方案对硬件要求不同,大家可以根据自身的业务应用特性来选择具体的双机热备方案以及对应的ServHA双机热备软件产品。 1、镜像双机热备 1.1镜像…...
Antd中使用Form.List且有Select组件,过滤问题
当在使用Form.List组件,且组件中有Select选项时,针对每一次选择,都要过滤掉那些已经选择过的选项,可能遇到的问题: 直接过滤会将每一个Select中的options选项都过滤掉,无法正常展示选择的选项 解决办法&a…...
VSCODE插值表达式失效问题
GET https://cdn.jsdelivr.net/npm/vue2.6.14/dist/vue.js net::ERR_CONNECTION_-CSDN博客 更换正确的vue域名 GET https://cdn.jsdelivr.net/npm/vue2.6.14/dist/vue.js net::ERR_CONNECTION_ <script src"https://unpkg.com/vue2.6.14/dist/vue.js"></sc…...
【失败】Gnome将默认终端设置为 Kitty
起因 一会儿gnome-terminal一会儿kitty终端,实在是受不了,决定取缔默认的gnome-terminal。 过程 在 Ubuntu 或 Debian 系统上: 确保 Kitty 已经安装。如果未安装,可以在终端中运行命令sudo apt install kitty -y进行安装。 使用系…...
蓝桥杯:连连看
本题大意要我们在一个给定的nxm的矩形数组中找出符合条件的格子 条件如下: 1.数值相同 2.两个横坐标和纵坐标的差值相等(由此可得是一个对角线上的格子) 那么根据以上条件我们可以用HashMap来解决这个问题,统计对角线上数值相同…...
Ext系列⽂件系统
Ext系列⽂件系统 1. 理解硬件1.1 磁盘的物理结构1.2 磁盘的存储结构1.3 磁盘的逻辑结构理解过程实际过程 1.4 CHS&&LBA地址 2. 引入文件系统块分区innode 3. Ext2文件系统3.1 宏观认识3.2 block group3.3 块组内部3.3.1 GDT(Group Descriptor Table…...
JavaScript 对象复制:浅拷贝与深拷贝
JavaScript 对象复制:浅拷贝与深拷贝使用说明 在 JavaScript 中,对象复制分为 浅拷贝 和 深拷贝,两者的核心区别在于是否递归复制嵌套的引用类型属性。以下是详细说明和示例: 一、浅拷贝(Shallow Copy) 特…...
MTK-Android12 13 屏蔽掉Viewing full screen
去掉ROOM 开机第一次提示全屏弹框 文章目录 需求参考资料修改文件实现方案 解决思路grep 源码查找信息grep 查找 grep -rn "Viewing full screen" 找string 字段grep 查找 grep -rn immersive_cling_title 布局grep 查找 grep -rn layout.immersive_mode_cling 对应的…...
mysql数据库的线程连接数、状态 、最大并发数、缓存等参数配置
mysql数据库的线程连接数、状态 、最大并发数、缓存等参数配置 https://www.modb.pro/db/1784385883449397248 mysql数据库的线程连接数、状态 、最大并发数、缓存等参数配置 SQL命令行临时设置操作 #查看mysql数据库的线程连接数: mysql> show global statu…...
OpenGauss 数据库介绍
OpenGauss 数据库介绍 OpenGauss 是华为基于 PostgreSQL 开发的企业级开源关系型数据库,现已成为开放原子开源基金会的项目。以下是 OpenGauss 的详细介绍: 一 核心特性 1.1 架构设计亮点 特性说明优势多核并行NUMA感知架构充分利用现代CPU多核性能行…...
GitHub创建远程仓库
使用GitHub创建远程仓库:从零开始实现代码托管与协作 前言 在当今软件开发领域,版本控制系统已成为开发者必备的核心工具。作为分布式版本控制系统的代表,Git凭借其强大的分支管理和高效的协作能力,已成为行业标准。而GitHub作为…...
【AI部署】腾讯云GPU -—SadTalker的AI数字人访问web服务—未来之窗超算中心
访问部署在Cloud Studio上的web服务 当你把该项目部署在本地时,访问该服务的请求地址为http://localhost:8080/hello;当你把该项目部署在Cloud Studio工作台启动时,要想访问到该服务,需要先在工作台右侧打开访问链接面板ÿ…...
基于spring boot 集成 deepseek 流式输出 的vue3使用指南
本文使用deepseek API接口流式输出的文章。 环境要求 jdk17 spring boot 3.4 代码如下: package com.example.controller;import jakarta.annotation.PostConstruct; import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.mes…...
