Spring MVC 全栈指南:RESTful 架构、核心注解与 JSON 实战解析

目录

  1. RESTful API 设计规范
  2. Spring MVC 核心注解解析
  3. 静态资源处理策略
  4. JSON 数据交互全解
  5. 高频问题与最佳实践

一、RESTful API 设计规范

1.1 核心原则

原则 说明 示例 URI
资源为中心 URI 使用名词(复数形式) /users ✔️ /getUser
HTTP 方法语义化 GET(查)、POST(增)、PUT(改)、DELETE(删) DELETE /users/1
无状态通信 服务端不保存客户端会话状态 每次请求携带完整认证信息

1.2 完整代码示例

java 复制代码
@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();
    }

    @PostMapping
    public 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 实现(响应中嵌入资源链接):
java 复制代码
@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);
}
  • 响应示例
json 复制代码
{
  "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 元数据获取注解

java 复制代码
// 获取 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 配置

java 复制代码
@RestController // = @Controller + @ResponseBody
public class ApiController {

    @GetMapping("/city/{id}")
    public City getCity(@PathVariable int id) {
        return cityService.findById(id);
    }
}

4.2 序列化控制

java 复制代码
@Data
public class Product {
    @JsonIgnore
    private String internalCode; // 不序列化

    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createTime;     // 日期格式化
}

4.3 依赖配置

xml 复制代码
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.14.0</version>
</dependency>

五、高频问题与最佳实践

5.1 常见错误

  1. RESTful 路径设计混乱
    • /getUserOrders?userId=1 → ✅ GET /users/1/orders
  2. HTTP 方法误用
    • ❌ 用 POST 请求更新资源 → ✅ 使用 PUT/PATCH
  3. JSON 日期序列化错误
    • 解决方案:@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")

5.2 性能优化

  • 静态资源缓存 :配置 Cache-Control 头减少重复请求。
  • Jackson 延迟加载 :对大数据集使用 @JsonView 控制序列化字段。
相关推荐
NE_STOP3 天前
springMVC-HTTP消息转换器与文件上传、下载、异常处理
spring
刀法如飞4 天前
一款Go语言Gin框架MVC脚手架,满足大部分场景
go·mvc·gin
JavaGuide4 天前
Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
java·spring·ai·claude code
玹外之音4 天前
Spring AI MCP 实战:将你的服务升级为 AI 可调用的智能工具
spring·ai编程
来一斤小鲜肉4 天前
Spring AI入门:第一个AI应用跑起来
spring·ai编程
NE_STOP4 天前
springMVC-常见视图组件与RESTFul编程风格
spring
what丶k5 天前
Spring AI 多模态开发全解析:从入门到企业级落地
后端·spring·ai编程
NE_STOP5 天前
springMVC-获取前端请求的数据与三个作用域
spring